java访问HDFS笔记

  之前在服务器中利用docker实现完全分布式的部署。对hadoop中hdfs有个初步认识,接下来开始学习如何利用JavaAPI访问,实现读写等简单操作。之前是利用hadoop自带的shell命令对文件进行读写。
  由于是本地练习,这次采用的是伪分布的部署,在部署完成后遇到1个问题,在namenode格式化的时候输出信息中 host = localhost,如下图
java访问HDFS笔记_第1张图片
  格式化是没任何问题的,使用shelll命令对文件进行操作也没任何问题。当上传完文件后,打开web页面看到下图,Block Pool ID中间的ip是127.0.0.1,图片是后面截的,当时情况就是红字所示。
java访问HDFS笔记_第2张图片
  接下来我在另一台局域网电脑windows操作系统下,准备写java访问,从namenode能够拿到文件的名字和各种信息。都没问题的,但是!!! 在使用文件读取的时候,按照流程应该是从datanode读取数据,确出现了错误,错误内容大概就是读取不到blob信息之类,但是datanode节点是正常的,最后定位在格式化namenode这个Host上,我这台windows电脑访问host出现了错误。
  解决的步骤试这样的:

  • 在linux上先查看自己的hostname
    在这里插入图片描述
  • 修改/etc/hosts, 将本机ip对应一个名称
    在这里插入图片描述
  • 重启网络服务 /etc/rc.d/init.d/network restart
  • 在格式化namenode,看到如下图
    java访问HDFS笔记_第3张图片

 此时上传文件后再web上看到的地址也是对应本机IP
java访问HDFS笔记_第4张图片

最后在另一台电脑中访问也能正确读取到数据。附上代码一段.

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;

public class Main {
    public static void read(String input) throws IOException {
        Path inputPath = new Path(input);
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.3.3:8020");

        FileSystem fsSource = null;
        try {
            fsSource = FileSystem.get(URI.create(inputPath.toString()), conf, "hadoop");
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        FileStatus[] sourceStatus = fsSource.listStatus(inputPath);
        for (FileStatus sta : sourceStatus) {
            System.out.println("path: " + sta.getPath() + " |file size:" + sta.getLen() + " |permission:" + sta.getPermission() + " |content: ");
            FSDataInputStream fsdis = fsSource.open(sta.getPath());
            byte[] data = new byte[1024];
            int read = -1;
            PrintStream ps = new PrintStream(System.out);
            while ((read = fsdis.read(data)) > 0) {
                ps.write(data, 0, read);
            }
            fsdis.close();
            ps.close();
        }
    }

    public static void main(String[] args) {
        Main m = new Main();

        try {
            read("hdfs://192.168.3.3:8020/input");
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

pom文件导入hadoop相关lib

    
        
            org.apache.hadoop
            hadoop-common
            2.8.5
        
        
            org.apache.hadoop
            hadoop-hdfs
            2.8.5
        
        
            org.apache.hadoop
            hadoop-client
            2.8.5
        
    

运行结果:
java访问HDFS笔记_第5张图片

你可能感兴趣的:(hadoop)