【版本】
当前版本号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 进程。