实验6-HDFS-API编程基础实践
时间:2020-11-18 16:45:46 来源:勤学考试网 本文已影响 人
实验6:HDFS-API编程基础实践
实验目的
1. 理解HDFS在Hadoop体系结构中的角色;
2. 熟悉HDFS操作常用的Java API。
实验平台
操作系统:Linux
Hadoop版本:2.6.0或以上版本
JDK版本:1.6或以上版本
Java IDE:Eclipse
实验内容和要求
编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。
查看Java帮助手册或其它资料,用“.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。
3.编程实现以下指定功能,并利用Hadoop提供的Shell命令完成相同任务:
向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;
从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
将HDFS中指定文件的内容输出到终端中;
显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
删除HDFS中指定的文件;
删除HDFS中指定的目录,由用户指定目录中如果存在文件时是否删除目录;
在HDFS中,将文件从源路径移动到目的路径。
实验报告
《大数据技术原理与应用》课程机房上机实验报告
题目:
姓名
日期
实验环境:
实验内容与完成情况:
向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;
Shell命令如下:
准备好等会实验用的文本文件text.txt和local.txt
*上传一个名为text.txt的文件
hadoop fs - put text.txt /Test/
这里我们查看一下刚刚上传的文件
hadoop fs -ls /Test/text.txt
创建完成后,指定的文件就在HDFS中已经存在了
*追加到文件末尾的指令
hadoop fs -appendToFile local.txt /Test/text.txt
查看我们刚刚上传HDFS文件的内容
hadoop fs -cat /Test/text.txt
可以看到,已经完成了local.txt的内容追加到text.txt的末尾
*覆盖原有文件的指令
hadoop fs -copyFromLocal -f local.txt /Test/text.txt
查看我们是否完成了覆盖操作
hadoop fs -cat /Test/text.txt
覆盖成功!
本功能的java实现
这个class(CopyFromLocalFile)的代码截图如下:
程序第一次运行结果
*向HDFS中上传文件text.txt
文件存在后我们再运行一次程序
*追加到原有文件末尾
再在Shell 中查看一下成功没有
hadoop fs -cat /user/tiny/text.txt
成功追加到文件末尾!
*我们修改一下程序的代码将追加到末尾那一行代码注释掉,再一次运行程序
程序运行结果如下:
再在Shell 中查看一下成功没有
hadoop fs -cat /user/tiny/text.txt
覆盖成功!
从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
Shell命令:
if $(hadoop fs -test -e /usr/local/hadoop/text.txt);
then $(hadoop fs -copyToLocal /Test/text.txt ./text.txt);
else $(hadoop fs -copyToLocal /Test/text.txt ./text2.txt);
fi
*可以看到完成实验要求
Java实现代码如下
(3)将HDFS中指定文件的内容输出到终端中;
Shell命令:
*输出成功!
java代码实现:
输出成功!
(4)显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
Shell命令实现:
*成功!
java代码实现:
成功!
给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
Shell命令:
Java实现:
成功!
提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
Shell命令:
if $(hadoop fs -test -d /Test/test1);
then $(hadoop fs -touchz /Test/test1/text1.txt);
else $(hadoop fs -mkdir -p /Test/test1 && hdfs dfs -touchz /Test/test1/text1.txt);
fi
Java实现:
第一次运行
*创建了文件,并创建了文件所在目录
第二次运行
*完成了对文件的删除
提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
java代码见(6)
*再次运行实现目录的删除
(8)向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
Shell命令实现:
*追加到原有文件结尾
hadoop fs -appendToFile local.txt /Test/text.txt
查看一下成功没有
Hadoop fs -cat /Test/text.txt
*追加到文件开头
hadoop fs -get /Test/text.txt
cat /text.txt >> local.txt
hadoop fs -copyFromLocal -f text.txt /Test/text.txt
java实现:
*追加文件到末尾
*追加文件至开头
删除HDFS中指定的文件;
Shell实现:
hadoop fs -rm /Test/test1/text1.txt
删除HDFS中指定的目录,由用户指定目录中如果存在文件时是否删除目录;
Shell实现:
hadoop fs -rm -R /Test/test1
(11)在HDFS中,将文件从源路径移动到目的路径。
Shell命令实现:
Hadoop fs -mv /Test/text.txt /Test2
JAVA实现:
移动成功!
编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。
Java实现:
*返回一行文本内容
查看Java帮助手册或其它资料,用“.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。
java实现:
成功!
出现的问题:
1.java.io.IOException: No FileSystem for scheme: hdfs
2.java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[DatanodeInfoWithStorage[:50010,DS-653ebbcc-b6ff-4cc0-827e-b28a505d1bf8,DISK]], original=[DatanodeInfoWithStorage[:50010,DS-653ebbcc-b6ff-4cc0-827e-b28a505d1bf8,DISK]]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
解决方案(列出遇到的问题和解决办法,列出没有解决的问题):
先登陆ssh localhost然后再启动Hadoop
修改hdfs.site 文件
参考博客 /TheManOfCoding/article/details
- 下载文档
- 收藏
- 0