【Hadoop】Hadoop车辆数据存储

  • Post author:
  • Post category:其他




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中,实现数据的高效存储和管理。



版权声明:本文为A2085354461原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。