编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。
查看Java帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。
实验内容与完成情况:
编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。 编程代码: package hdfs;
import hdfs.HDFSConfig; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
public class MyFSDataInputStream extends FSDataInputStream { private final BufferedReader bufferedReader;
public MyFSDataInputStream(FSDataInputStream fsDataInputStream) { super(fsDataInputStream.getWrappedStream()); this.bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream)); }
/** * 按行读取HDFS文件内容的方法。 * * @return 文件中的一行内容,如果到达文件末尾则返回 null。 * @throws IOException 读取文件过程中可能出现的异常。 */ public String hdfsReadLine() throws IOException { return bufferedReader.readLine(); }
@Override public void close() throws IOException { bufferedReader.close(); super.close(); }
public static void main(String[] args) { try { // 初始化 HDFS 文件系统 FileSystem fs = HDFSConfig.getFileSystem(); Path filePath = new Path("/user/hadoop/movedTestFile.txt");
// 检查文件是否存在 if (!fs.exists(filePath)) { System.out.println("文件未找到: " + filePath); return; }
// 打开文件 FSDataInputStream fsDataInputStream = fs.open(filePath); MyFSDataInputStream myFSDataInputStream = new MyFSDataInputStream(fsDataInputStream);
// 按行读取文件 String line; System.out.println("按行读取文件内容:"); while ((line = myFSDataInputStream.hdfsReadLine()) != null) { System.out.println(line); }
// 关闭流 myFSDataInputStream.close(); fs.close();
} catch (IOException e) { e.printStackTrace(); } } }
(三)查看Java帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。 package hdfs;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; public class HDFSFileViewer {
public static void showFileContentFromHDFS(){ try { String remotePath="/user/hadoop/movedTestFile.txt"; URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); InputStream inputStream = new URL("hdfs","192.168.70.143",8020,remotePath.toString()).openStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = null; while ((line = bufferedReader.readLine()) != null){ System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } }
public static void main(String[] args) { showFileContentFromHDFS(); } }
|
出现的问题:
|
解决方案(列出遇到的问题和解决办法,列出没有解决的问题):
如同实验1 中的方法,先用命令找到路径再根据自己虚拟机的路径调整。
这个问题我搜索了好多以往的博客,看了很多步骤,这个解决过程没有截图,所以直接来说一下我的思路:我一开始以为是master传过来的值为空的问题,设置了一些节点,验证之后发现不是代码的问题。然后我想过是路径的问题进行了一些修改,最后我发现是我的权限+路径问题拒绝连接,还是用户的权限不够后来我通过chat询问解决了权限的问题,在这个过程中还有偶尔忘记启动的情况。
先来说一下我开始去搜索的时候我找到的方法,但是这几个方法不是我需要的: 服务端的防火墙打开了,检查您的CentOS 7服务器是否已经安装并运行了SSH服务,计算机与CentOS 7服务器在同一局域网内。请检查两台设备的IP地址是否在同一个网段,例如192.168.101.x。 后来我发现了产生这个问题的原因是我有两个集群,但是我没有显卡不可以同时有两个同时用。这里我学到了两个方法,我后期更换集群的时候会用第二种。 1).修改本地主机的配置
2.虚拟机网络编辑器:
|