【大数据开发技术】实验04-HDFS文件创建与写入

简介: 【大数据开发技术】实验04-HDFS文件创建与写入

HDFS文件创建与写入

一、实验目标

  1. 熟练掌握Hadoop操作指令及HDFS命令行接口
  2. 掌握HDFS原理
  3. 熟练掌握HDFS的API使用方法
  4. 掌握单个本地文件写入到HDFS文件的方法
  5. 掌握多个本地文件批量写入到HDFS文件的方法

二、实验要求

  1. 给出主要实验步骤成功的效果截图。
  2. 要求分别在本地和集群测试,给出测试效果截图。
  3. 对本次实验工作进行全面的总结。
  4. 完成实验内容后,实验报告文件名显示学号姓名信息。

三、实验内容

  1. 使用FileSystem将单个本地文件写入到HDFS中当前不存在的文件,实现效果参考下图:

  2. 使用FileSystem将本地文件追加到HDFS中当前存在的文件中,实现效果参考下图:


四、实验步骤

  1. 使用FileSystem将单个本地文件写入到HDFS中当前不存在的文件

程序设计

package hadoop;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
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;
public class WJW {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        args = new String[2];
        args[0] = "/home/zkpk/experiment/wjw01.txt";
        args[1] = "hdfs://master:9000/wjw02.txt";
        Configuration conf = new Configuration();
        BufferedInputStream in = null;
        FileSystem fs = null;
        FSDataOutputStream out = null;
        try{
            in = new BufferedInputStream(new FileInputStream(args[0]));
            fs = FileSystem.get(URI.create(args[1]), conf);
            out = fs.create(new Path(args[1]));
            IOUtils.copyBytes(in, out, 4096, false);
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
            if(fs != null){
                try{
                    fs.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

程序分析

该代码实现了将本地文件上传到Hadoop分布式文件系统HDFS中的功能。代码结构简单明了,主要包括以下几个步骤:

  1. 定义参数args,参数args[0]表示本地文件路径,参数args[1]表示HDFS文件路径。
  2. 创建Configuration对象,用于读取Hadoop配置信息。
  3. 创建BufferedInputStream流,读取本地文件。
  4. 使用FileSystem.get()方法获取Hadoop分布式文件系统实例。
  5. 调用fs.create()方法,创建HDFS文件,并返回FSDataOutputStream对象用于向HDFS文件写入数据。
  6. 调用IOUtils.copyBytes()方法,将本地文件数据复制到HDFS文件中。
  7. 关闭流和Hadoop分布式文件系统实例。

该代码主要涉及以下几个重要知识点:

  1. Configuration对象:该对象用于读取Hadoop配置信息,如HDFS的地址、端口等信息。
  2. FileSystem对象:该对象用于操作Hadoop分布式文件系统,如创建文件、删除文件、读取文件等操作。
  3. BufferedInputStream流:该流用于读取本地文件数据。
  4. FSDataOutputStream对象:该对象用于向HDFS文件写入数据。
  5. IOUtils.copyBytes()方法:该方法用于将输入流中的数据复制到输出流中。

总体来说,该代码实现了将本地文件上传到HDFS的功能,但还有一些需要改进的地方。例如,可以添加参数校验功能,防止空指针异常;可以添加日志输出功能,方便查看程序运行情况。

运行结果

  1. 使用FileSystem将本地文件追加到HDFS中当前存在的文件中

程序设计

package hadoop;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
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;
public class WJW01 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        args = new String[2];
        args[0] = "/home/zkpk/experiment/wjw01.txt";
        args[1] = "hdfs://master:9000/wjw02.txt";
        Configuration conf = new Configuration();
        conf.set("fs.client.block.write.replace-datanode-on-failure.enable", "true");
        conf.set("fs.client.block.write.replace-datanode-on-failure.policy", "Never");
        BufferedInputStream in = null;
        FileSystem fs = null;
        FSDataOutputStream out = null;
        try{
            in = new BufferedInputStream(new FileInputStream(args[0]));
            fs = FileSystem.get(URI.create(args[1]), conf);
            out = fs.append(new Path(args[1]));
            IOUtils.copyBytes(in, out, 4096, false);
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
            if(fs != null){
                try{
                    fs.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

程序分析

该代码实现了将本地文件追加上传到Hadoop分布式文件系统HDFS中的功能。代码结构与上传文件功能类似,主要包括以下几个步骤:

  1. 定义参数args,参数args[0]表示本地文件路径,参数args[1]表示HDFS文件路径。
  2. 创建Configuration对象,用于读取Hadoop配置信息。
  3. 设置配置信息:设置“fs.client.block.write.replace-datanode-on-failure.enable”为“true”,表示在数据节点故障时启用块写入数据节点更换机制;设置“fs.client.block.write.replace-datanode-on-failure.policy”为“Never”,表示块写入数据节点故障时不替换数据节点。
  4. 创建BufferedInputStream流,读取本地文件。
  5. 使用FileSystem.get()方法获取Hadoop分布式文件系统实例。
  6. 调用fs.append()方法,获取FSDataOutputStream对象用于向HDFS文件追加数据。
  7. 调用IOUtils.copyBytes()方法,将本地文件数据复制追加到HDFS文件中。
  8. 关闭流和Hadoop分布式文件系统实例。

需要注意的是,该代码使用了追加上传文件的方式,因此可以将本地文件的数据追加到HDFS文件的末尾,而不会影响原有的HDFS文件数据。同时,设置数据节点更换机制可以提高系统的可靠性和稳定性,避免数据节点故障导致数据丢失的情况。


总体来说,该代码实现了将本地文件追加上传到HDFS的功能,并且考虑了系统的可靠性和稳定性问题。但是,同样需要注意代码中的参数校验和日志输出等问题,以提高代码的健壮性和可维护性。运行结果

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
3月前
|
存储 人工智能 大数据
云栖2025|阿里云开源大数据发布新一代“湖流一体”数智平台及全栈技术升级
阿里云在云栖大会发布“湖流一体”数智平台,推出DLF-3.0全模态湖仓、实时计算Flink版升级及EMR系列新品,融合实时化、多模态、智能化技术,打造AI时代高效开放的数据底座,赋能企业数字化转型。
847 0
|
5月前
|
数据采集 人工智能 分布式计算
ODPS在AI时代的发展战略与技术演进分析报告
ODPS(现MaxCompute)历经十五年发展,从分布式计算平台演进为AI时代的数据基础设施,以超大规模处理、多模态融合与Data+AI协同为核心竞争力,支撑大模型训练与实时分析等前沿场景,助力企业实现数据驱动与智能化转型。
439 4
|
3月前
|
数据可视化 大数据 关系型数据库
基于python大数据技术的医疗数据分析与研究
在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。
|
5月前
|
SQL 分布式计算 大数据
我与ODPS的十年技术共生之路
ODPS十年相伴,从初识的分布式计算到共生进化,突破架构边界,推动数据价值深挖。其湖仓一体、隐私计算与Serverless能力,助力企业降本增效,赋能政务与商业场景,成为数字化转型的“数字神经系统”。
|
5月前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
5月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据在智能物流运输车辆智能调度与路径优化中的技术实现(218)
本文深入探讨了Java大数据技术在智能物流运输中车辆调度与路径优化的应用。通过遗传算法实现车辆资源的智能调度,结合实时路况数据和强化学习算法进行动态路径优化,有效提升了物流效率与客户满意度。以京东物流和顺丰速运的实际案例为支撑,展示了Java大数据在解决行业痛点问题中的强大能力,为物流行业的智能化转型提供了切实可行的技术方案。
|
6月前
|
数据采集 自然语言处理 分布式计算
大数据岗位技能需求挖掘:Python爬虫与NLP技术结合
大数据岗位技能需求挖掘:Python爬虫与NLP技术结合
|
10月前
|
XML 存储 分布式计算
【赵渝强老师】史上最详细:Hadoop HDFS的体系架构
HDFS(Hadoop分布式文件系统)由三个核心组件构成:NameNode、DataNode和SecondaryNameNode。NameNode负责管理文件系统的命名空间和客户端请求,维护元数据文件fsimage和edits;DataNode存储实际的数据块,默认大小为128MB;SecondaryNameNode定期合并edits日志到fsimage中,但不作为NameNode的热备份。通过这些组件的协同工作,HDFS实现了高效、可靠的大规模数据存储与管理。
1214 70
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
539 6
|
SQL 分布式计算 监控
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
221 3