赞
踩
本作业旨在实现将车辆数据按天存储到Hadoop分布式文件系统(HDFS)中,并根据数据文件大小分割成多个文件进行存储。数据格式为JSON。
以下是用Java编写的实现代码:
1.导入类
// 导入必要的类
import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
2.源代码
public class Data_put { public static void main(String[] args) throws Exception { // 创建Hadoop配置对象 Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://master:9010"); // 获取当前日期并格式化为"yyyy-MM-dd"的字符串 LocalDate date = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String timestr = date.format(formatter); // 创建本地文件对象并获取文件数组 File file = new File("D:\\Hadoop_homework\\20210322061_IDEA\\jsons\\can_data\\" + timestr); File[] arr = file.listFiles(); for(int l = 1; l <= arr.length; ++l) { String origin = "D:\\Hadoop_homework\\20210322061_IDEA\\jsons\\can_data\\" + timestr + "\\" + timestr + ".json." + l; String dest = "hdfs://master:9010/can_data/" + timestr + "/" + timestr + ".json." + l; // 获取HDFS文件系统对象 FileSystem fs = FileSystem.get(URI.create(dest), conf); // 创建HDFS文件输出流 FSDataOutputStream out = fs.create(new Path(dest)); // 读取本地文件并将内容复制到HDFS文件 FileInputStream fileInputStream = new FileInputStream(origin); IOUtils.copyBytes(fileInputStream, out, conf); // 输出上传成功的信息 System.out.println("第" + l + "个json文件上传成功"); } // 输出上传完毕的提示 System.out.println("上传完毕"); } }
代码的主要逻辑如下:
1.通过创建一个Configuration对象conf来设置Hadoop的配置。
2.使用conf.set(“fs.defaultFS”, “hdfs://master:9010”)将HDFS的默认文件系统地址设置为hdfs://master:9010。
接下来是数据的部分:
3.使用LocalDate.now()获取当前日期,并通过DateTimeFormatter将其格式化为"yyyy-MM-dd"的字符串。
4.创建一个File对象file,表示本地文件系统中的目录路径。该路径由给定的日期字符串构成。
5.使用file.listFiles()获取目录下的文件数组。
进入一个循环,依次处理每个文件:
6.根据文件的索引构建本地文件路径origin和HDFS文件路径dest。
7.使用FileSystem.get(URI.create(dest), conf)获取HDFS文件系统对象fs。
8.使用fs.create(new Path(dest))创建一个FSDataOutputStream对象out,表示要在HDFS上创建新文件。然后,使用FileInputStream读取本地文件origin的内容,并使用IOUtils.copyBytes()将文件内容从输入流复制到输出流。这将把本地文件的内容上传到HDFS的相应位置。
9.在每个文件上传完成后,根据文件的大小判断是否需要另起一个文件进行存储。如果累计的文件大小超过100M,则重置总量并创建新的文件路径和输出流。
最后,输出上传成功的信息和"上传完毕"的提示。
文件数据:
文件大小:
本作业通过使用Java代码实现了将车辆数据按天存储到HDFS中的功能,并考虑了数据文件大小超过100M时的分割存储。
通过配置Hadoop环境和运行上述代码,可以将数据上传到HDFS中,实现数据的高效存储和管理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。