目录
实验要求
实验步骤
小贴士
实验中遇到的问题及解决方法
实验要求
编写shell与Java代码检验分布式系统HDFS上是否存在一个input.txt,并对代码进行详细注释,通过流程图阐述数据查找过程。
实验步骤
1. 做好前提准备
①启动Hadoop
②使用Hadoop内的hdfs创建文件夹用于存储文件,可以实现对照
使用的命令为:./bin/hdfs/dfs -mkdir /input
③上传本地文件到hdfs中
使用的命令为:./bin/hdfs dfs -put /usr/local/hadoop/input/txt /input
2. 使用shell编程实现判断文件是否存在,如存在就输出文件的内容。
①命令行直接实现
./bin/hdfs dfs -test -e /input/input.txt
echo $?
如果输出为 0 代表文件存在;如果输出为1,代表文件不存在。
②通过shell编程实现文字版的输出
3. 使用java代码判断文件是否存在,如存在就输出文件的内容。
import java.io.BufferedReader;//java读取文件的相关包
import java.io.InputStreamReader;
//导入相关包
import org.apache.hadoop.conf.Configuration;//这个包是专门管理配置文件的
//这个包中包含了hadoop中所有关于文件管理的类,所有的都是继承它
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;//可以读取url路径
import org.apache.hadoop.fs.FSDataInputStream;
//FileSystem对象中的open()方法返回的是FSDataInputStream对象,这个类是继承了java.io.DataInputStream接口的一个特殊类
//支持随机访问,可以从流中的任意位置读取数据
public class Hdfs {
public static void main(String[] args){
try{
String fileName = "/input/input.txt";//文件的路径
//加载配置项
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.43.100:8020");//文件系统的路径(这个需要看自己在配置core-site.xml时使用的路径)
//DistributedFileSystem是在HDFS客户端的节点上,负责与HDFS集群进行交互,如在NameNode上读写元数据,在DataNode节点上读写数据等
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
//创建文件系统实例
FileSystem fs = FileSystem.get(conf);
//判断文件是否存在
if(fs.exists(new Path(fileName))){
//如果文件存在就打印输出
System.out.println("文件存在");
//打印输出文本内容
Path file = new Path(fileName);
FSDataInputStream getIt = fs.open(file);
//缓冲区读取,避免了乱码现象
BufferedReader d = new BufferedReader(new InputStreamReader(getIt));
String line = null;
System.out.println("文件的内容为:");
while((line = d.readLine()) != null) {
System.out.println(line);
}
d.close(); //关闭文件
}else{
System.out.println("文件不存在");
}
//如果报错的话,就打印输出错误信息
}catch (Exception e){
e.printStackTrace();
}
}
}
结果输出
小贴士
1. 在Ubuntu中安装eclipse
教程:打开底部的软件安装软件-->搜索eclipse-->安装
2. 创建Java project
将Hadoop相关的库导入
3. 将Hadoop配置文件中的core-site.xml以及hdfs-site.xml复制到创建好的java project的bin目录下(要不然会报错的)
实验中遇到的问题及解决方法
1. 实验中导包问题
在实验的过程中,按照林子雨老师的教程,只是把那几个Hadoop包导入进去就OK的,但是在实际中,还需要导入其他的库,其他库分别分布在Hadoop其他目录下,需要自己找一下。
(可能是我在安装Hadoop的时候放乱了)
贴一些因为jar包没导入而报的错
2. 上传文件提示失败
这是因为DataNode节点没有启动成功
3. Caused by: java.net.ConnectException: 网络不可达 (connect failed)
解决方法:看java代码中连接hdfs的链接是否跟配置core-site.xml中hdfs的路径一致。我们在配置hdfs-site.xml时,里面可能填写的是IP地址+8020,但是在Java代码中我们填写了localhost+9000,两者不一致,导致连接不上。
实验参考厦门大学老师的hdfs编程教程
如果有什么错漏的地方,请各位大佬指教[抱拳]