当前位置: 首页 > news >正文

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

文章目录

  • 一、实验目标
  • 二、实验要求
  • 三、实验内容
  • 四、实验步骤

一、实验目标

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

二、实验要求

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

三、实验内容

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

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

四、实验步骤

  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 stubargs = 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的功能,但还有一些需要改进的地方。例如,可以添加参数校验功能,防止空指针异常;可以添加日志输出功能,方便查看程序运行情况。

运行结果

3

  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 stubargs = 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的功能,并且考虑了系统的可靠性和稳定性问题。但是,同样需要注意代码中的参数校验和日志输出等问题,以提高代码的健壮性和可维护性。

运行结果

4

http://www.lryc.cn/news/175657.html

相关文章:

  • 中国制造让苹果跪服,将再增加一家中国高科技供应商
  • 港卡开户感想(2023-8)
  • 机器学习第十一课--K-Means聚类
  • Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进
  • 论文笔记:ST2Vec: Spatio-Temporal Trajectory SimilarityLearning in Road Networks
  • upload-labs靶场未知后缀名解析漏洞
  • VisualStudio配置opencv
  • 如何通过git指令加入管理者仓库并提交分支(Github Gitee)
  • LuatOS-SOC接口文档(air780E)-- fastlz - FastLZ压缩
  • MySQL表的增删改查(进阶)
  • Greenplum实用工具-gpfdist
  • axios和fetch的区别
  • HTML那些重要的知识点
  • 《优化接口设计的思路》系列:第四篇—接口的权限控制
  • BI系统上的报表怎么导出来?附方法步骤
  • 电脑WIFI突然消失
  • http的get与post
  • MySQL 8 和 MySQL 5.7 在自增计数上的区别
  • Linux系统之links和elinks命令的基本使用
  • 【00】FISCO BCOS区块链简介
  • NPDP产品经理认证怎么报名?考试难度大吗?
  • 免杀技术,你需要学习哪些内容
  • odoo16 取消“系统各功能状态日报”的邮件
  • [C++ 网络协议] Windows中的线程同步
  • JavaScript 基础第三天笔记
  • NebulaGraph实战:3-信息抽取构建知识图谱
  • 一百八十二、大数据离线数仓完整流程——步骤一、用Kettle从Kafka、MySQL等数据源采集数据然后写入HDFS
  • 工具篇 | H2数据库的使用和入门
  • PHP脚本导出MySQL数据库
  • 生成随机单据号