当前位置:   article > 正文

【Hadoop】Hadoop车辆数据存储_基于hadoop的公共自行车数据分布式存储和计算

基于hadoop的公共自行车数据分布式存储和计算

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

实现流程

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/357598
推荐阅读
相关标签
  

闽ICP备14008679号