HDFS常用的JAVA API

实验说明

全国新冠肺炎疫情数据上传到Hadoop里面的HDFS。

数据集来源:https://github.com/eAzure/Code-For-COVID-19-Data

  1. 数据集covid_data.tar.gz说明:

全国各省份/直辖市/特别行政区 所有的疫情数据(2020.1.1至2022.12.31)

数据集一共1224个json文件,每个文件命名规律:省份名称+月份名称,如浙江省202109.json

  1. 任务要求:

将covid_data.tar.gz上传到Linux虚拟机,并用tar命令解压

编写Java代码,将解压后的所有疫情数据上传到HDFS的/covid_data目录,并分类保存

分类方法:根据json文件名在HDFS /covid_data目录下自动新建各个省份的目录,并自动将相同省份的数据保存到同一个目录。如 /covid_data/浙江省/浙江省2021xx.json

解压文件

bash 复制代码
#1.拖入文件到虚拟机中
#2.解压文件
#假设压缩包位于 /tmp/VMwareDnD/i9Viak/covid_data.tar.gz,解压到 /home/hadoop/covid_data:

mkdir -p /home/data/covid_data  #创建文件目录
tar -xzf /tmp/VMwareDnD/i9Viak/covid_data.tar.gz -C /home/hadoop/covid_data

整理文件

bash 复制代码
#解压后,JSON 文件都在 /home/hadoop/covid_data/covid_data/ 下,移动到上一层:

cd /home/hadoop/covid_data
mv covid_data/* ./
rmdir covid_data

验证本地文件

bash 复制代码
ls /home/hadoop/covid_data/ | head #查看前几个文件名
ls /home/hadoop/covid_data/*.json | wc -l #应显示文件数量

#如果是其它格式的记得更换json为对应格式,如csv格式:
ls /home/hadoop/covid_data/*.csv | wc -l

创建Java程序目录

bash 复制代码
mkdir -p /home/hadoop/upload
cd /home/hadoop/upload

编写Java程序

bash 复制代码
vim UploadToHDFS.java

进入之后,若有东西可以先esc,再输入:%d进行全部删除,然后输入:set paste再按下i即可进入粘贴模式。

java 复制代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;

public class UploadToHDFS {

    public static void main(String[] args) {
        // 本地数据目录(解压后的 JSON 文件所在目录)
        String localDir = "/home/hadoop/covid_data";
        // HDFS 根目录(题目要求)
        String hdfsBase = "/covid_data";

        Configuration conf = new Configuration();
        // 如果 Hadoop 配置文件不在 classpath,请取消注释并修改为你的 NameNode 地址
        // conf.set("fs.defaultFS", "hdfs://hadoop01:9000");

        try (FileSystem fs = FileSystem.get(conf)) {
            File dir = new File(localDir);
            File[] files = dir.listFiles((d, name) -> name.endsWith(".json"));
            if (files == null) {
                System.err.println("未找到 JSON 文件!");
                return;
            }

            for (File file : files) {
                String fileName = file.getName();
                // 提取省份名(假设文件名格式为"省份名+数字.json")
                String province = extractProvince(fileName);
                if (province == null) {
                    System.err.println("无法从文件名提取省份:" + fileName);
                    continue;
                }

                // 目标 HDFS 路径:/covid_data/省份名/文件名
                Path hdfsPath = new Path(hdfsBase + "/" + province + "/" + fileName);
                // 确保父目录存在
                fs.mkdirs(hdfsPath.getParent());

                // 上传文件
                try (FileInputStream fis = new FileInputStream(file);
                     OutputStream os = fs.create(hdfsPath, true)) {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    while ((bytesRead = fis.read(buffer)) != -1) {
                        os.write(buffer, 0, bytesRead);
                    }
                }
                System.out.println("上传成功:" + hdfsPath);
            }
            System.out.println("全部上传完成!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从文件名提取省份名
     * 假设文件名格式为"省份名+数字.json",如"江西省202109.json"
     */
    private static String extractProvince(String fileName) {
        String nameWithoutExt = fileName.replace(".json", "");
        int i = 0;
        while (i < nameWithoutExt.length()) {
            char c = nameWithoutExt.charAt(i);
            if (Character.isDigit(c)) {
                break;
            }
            i++;
        }
        if (i == 0) return null;
        return nameWithoutExt.substring(0, i);
    }
}

编译程序

bash 复制代码
javac -cp $(hadoop classpath) UploadToHDFS.java

运行程序上传文件

bash 复制代码
#确保HDFS服务已启动
jps #应看到NameNode、DataNode等进程
start-dfs.sh #若未启动,启动HDFS

#提前创建HDFS根目录并给权限(可选)
hdfs dfs -mkdir -p /covid_data
hdfs dfs -chmod 777 /covid_data

#运行上传程序
java -cp .:$(hadoop classpath) UploadToHDFS

上传成功后会显示:全部上传完成

验证上传结果

命令行查看

bash 复制代码
hdfs dfs /covid_data #查看所有省份目录
hdfs dfs -ls /covid_data/浙江市 #查看某省份下的文件
hdfs dfs -ls -R /covid_data | grep json | wc -l  #统计文件总数

Web查看

访问你的hadoop:http://ip:9870(默认,或者你的对应端口)

bash 复制代码
ifconfig
#其中ens33默认是你的hadoop的IP

上传成功。

相关推荐
动恰客流管家3 分钟前
动恰3DV3丨客流统计系统:工业农业文旅类景区智慧客流解决方案
大数据·人工智能·3d
工具箱大集合6 分钟前
8 款主题班会 ppt 一键生成工具实测分享
大数据·人工智能
聊点儿技术9 分钟前
IP归属地诊断5步法:定位账号限流的技术根源
大数据·ip·跨境电商·tik tok·ip归属地查询·ip地址查询·查ip地址
财经资讯数据_灵砚智能15 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年4月16日
大数据·人工智能·python·信息可视化·自然语言处理
蓝耘智算36 分钟前
企业级大模型API选型:如何守住稳定性第一道红线?
大数据·人工智能·深度学习
机床行业观察38 分钟前
五轴龙门机床厂家推荐
大数据·五轴龙门机床选型·五轴龙门机床厂家推荐·五轴龙门机床品牌哪家好·五轴机床厂家怎么选·大行程五轴龙门
IPHWT 零软网络40 分钟前
从被动应答到主动处理:零软智慧通讯的AI Agent与知识库实践
大数据·人工智能·重构·语音识别·ai agent·话务台
duoduo_sing40 分钟前
备份之道:从入门到实践的核心知识分享
大数据
宸津-代码粉碎机1 小时前
Spring Boot 4.0虚拟线程实战续更预告:高阶技巧、监控排查与分布式场景落地指南
java·大数据·spring boot·分布式·后端·python
黎阳之光1 小时前
黎阳之光受邀出席上海口岸联合会2026智慧口岸研讨班 无感通关方案获盛赞
大数据·人工智能·算法·安全·数字孪生