HDFS操作02(遇到的问题和解决)

编程实现一个类“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. 编程1时运行出错:

     

  2. put: /hdfs/destination/path': No such file or directory: hdfs://node1:8020/hdfs/destination/path'
  3. put: /local/file/path': No such file or directory
  4. 其实遇到最多的问题就是在本地文件系统中找不到指定的文件路径
  5. 这是一个和此实验内容无关,但是不解决还不行的问题。远程连接的问题,finalshell拒绝连接。我还试了shell发现也不行,最后找到了问题,在解决方案中写出。

 

 

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):

  1. 路径问题:

 

 

如同实验1 中的方法,先用命令找到路径再根据自己虚拟机的路径调整。

  1. 编程问题:

这个问题我搜索了好多以往的博客,看了很多步骤,这个解决过程没有截图,所以直接来说一下我的思路:我一开始以为是master传过来的值为空的问题,设置了一些节点,验证之后发现不是代码的问题。然后我想过是路径的问题进行了一些修改,最后我发现是我的权限+路径问题拒绝连接,还是用户的权限不够后来我通过chat询问解决了权限的问题,在这个过程中还有偶尔忘记启动的情况。

  1. 远程连接失败:

先来说一下我开始去搜索的时候我找到的方法,但是这几个方法不是我需要的:

服务端的防火墙打开了,检查您的CentOS 7服务器是否已经安装并运行了SSH服务计算机与CentOS 7服务器在同一局域网内。请检查两台设备的IP地址是否在同一个网段,例如192.168.101.x

后来我发现了产生这个问题的原因是我有两个集群,但是我没有显卡不可以同时有两个同时用。这里我学到了两个方法,我后期更换集群的时候会用第二种。

1).修改本地主机的配置

 

 

 

 

 

 

 

 

 2.虚拟机网络编辑器:

 

 

 

posted @   艾鑫4646  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示