Hadoop车辆数据存储
本作业旨在实现将车辆数据按天存储到Hadoop分布式文件系统(HDFS)中,并根据数据文件大小分割成多个文件进行存储。数据格式为JSON。
作业要求
- 车辆数据按天存储,每天的数据存储在一个文件夹下。
- 数据文件以JSON格式存储。
- 如果数据文件大于100M,则另起一个文件存储。
- 每天的数据总量不少于300M。
实现方法
1. 代码说明
以下是用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("上传完毕");
}
}
实现流程
2. 代码解析
代码的主要逻辑如下:
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,则重置总量并创建新的文件路径和输出流。
最后,输出上传成功的信息和”上传完毕”的提示。
3. 实现效果
文件数据:
文件大小:
总结
本作业通过使用Java代码实现了将车辆数据按天存储到HDFS中的功能,并考虑了数据文件大小超过100M时的分割存储。
通过配置Hadoop环境和运行上述代码,可以将数据上传到HDFS中,实现数据的高效存储和管理。