【版本】
当前版本号v20210430
版本 | 修改说明 |
---|---|
v20220125 | 升级文档到 Hadoop 3 |
v20210430 | 修正 HdfsUtils 类名错误 |
v20210404 | 增加常见问题 |
v20210403 | 初始化版本 |
【实验目的】
- 掌握 HDFS 文件系统的 Java 编程接口的调用和编程
【实验环境】
- Windows 7 以上64位操作系统
- JDK 8
- Maven 3
- IDEA 社区版
【实验资源】
- hadoop.dll
链接:https://pan.baidu.com/s/1MoQ0iU0Qb1o8_o5JV6X6iw
提取码:3rno
【实验内容】
- 按要求使用 Java 编程实现访问 HDFS
【实验参考】
类 org.apache.hadoop.fs.FileSystem 的 参考文档
- FileSystem.copyToLocalFile 方法用于从 HDFS 复制文件到本地文件系统。详细参考文档
/**
* @Param src HDFS 文件路径
* @Param dst 本地文件路径
*/
public void copyToLocalFile(Path src, Path dst) throws IOException
- FileSystem.copyFromLocalFile 方法用于从本地文件系统复制文件到 HDFS。详细参考文档
/**
* @Param src 本地文件路径
* @Param dst HDFS 文件路径
*/
public void copyFromLocalFile(Path src, Path dst) throws IOException
【实验要求】
打开 Part 4 的
hadoop-exp
项目。在项目
hadoop-exp\src\main\java
下创建一个名为hadoop+你学号后3位.hdfs
的包。注意替换为你的学号后3位。在包下面新建一个 HdfsUtils 的类。该类包含了一个在HDFS上创建文件并写入内容的方法
createFile
。代码如下,注意替换为你的学号后3位。
package hadoop你学号**后3位**.hdfs;
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 java.io.IOException;
import java.net.URI;
public class HdfsUtils {
/**
* 在HDFS上创建文件并写入内容
* @param conf HDFS的配置
* @param hdfsFilePath HDFS创建的文件的路径
* @param content 写入文件的内容
* @param overwrite true表示覆盖原文件,false表示不覆盖
*/
public static boolean createFile(Configuration conf,URI uri,String hdfsFilePath,String content,boolean overwrite) {
FileSystem fs=null;
FSDataOutputStream os=null;
boolean rs=false;
try {
// 指定用户名 , 获取 FileSystem 对象
fs = FileSystem.get(uri, conf, "hadoop");
//定义文件路径
Path dfs = new Path(hdfsFilePath);
os = fs.create(dfs, overwrite);
//往文件写入信息
os.writeBytes(content);
//成功创建文件,设置为true
rs=true;
}catch(Exception e){
e.printStackTrace();
}finally {
try {
if(os!=null) {
// 关闭流
os.close();
}
if(fs!=null) {
// 不需要再操作 FileSystem 了,关闭
fs.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return rs;
}
}
在项目
hadoop-exp\src\test\java
下创建一个名为hadoop+你学号后3位.hdfs
的包。注意替换为你的学号后3位。在包下面新建一个 HdfsUtilsTest 的类,用于单元测试。代码如下,注意替换为你的学号后3位。此测试用例主要目的是在 HDFS 上创建一个文件,并把 “hello” 写入文件。
package hadoop替换为你学号后3位.hdfs;
import hadoop替换为你学号后3位.hdfs.HdfsUtils;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.net.URI;
public class HdfsUtilsTest {
@Test
public void testCreate() {
Configuration conf=new Configuration();
boolean rs=false;
//创建的文件路径
String filePath="/替换为你学号后3位/test.txt";
String content="hello";
try {
URI uri = new URI("hdfs://10.0.0.71:8020");
rs= HdfsUtils.createFile(conf, uri, filePath, content, true);
}catch(Exception e){
e.printStackTrace();
}
if(rs){
System.out.println("Create successfully!");
}else{
System.out.println("Create fail!");
}
}
}
- 复制文件
hadoop.dll
到C:\Windows\System32
下。
重要步骤,请勿忽略!
- 启动虚拟机的 Hadoop。
注意一定要启动 Hadoop,否则实验无法成功!
运行
HdfsUtilsTest
。查看 IDEA 的控制台输出结果是否创建成功。SSH 登录 NodeA,运行以下命令查看创建文件的内容输出。是否和创建的文件内容一致。注意替换为你的学号后3位。
hdfs dfs -cat /替换为你学号后3位/test.txt
- 参考以上代码和【实验参考】给出的 API 文档,完成以下编程要求
- (1)在
HdfsUtils
类新增一个uploadFile
方法,可以上传本地文件到 HDFS。 - (2)在
HdfsUtilsTest
类新增一个testUpload
方法,测试上传文件到 HDFS。 - (3)在
HdfsUtils
类新增一个dowloadFile
方法,可以下载 HDFS 文件到本地。 - (4)在
HdfsUtilsTest
类新增一个testDownload
方法,测试下载 HDFS 文件到本地。
【常见问题】
报错:(null) entry in command string
答:这是缺少文件hadoop.dll文件
- 1、下载
hadoop.dll
文件 - 2、把文件放在
c:\windows\system32
目录下
IDEA 报错:java.net.ConnectionException:Call From XXXX/10.0.0.2 to 10.0.0.71:8020 failed on connection exception.
答:这是连接 NameNode 进程出错。
- 确保所有虚拟机节点都要启动。
- 确保能够ping 到10.0.0.71
- 确保 Hadoop 启动成功,使用jps命令检查进程是否缺少,特别是 namenode 进程。