【问题标题】:How can I access hadoop via the hdfs protocol from java?如何通过 java 中的 hdfs 协议访问 hadoop?
【发布时间】:2011-12-12 06:25:44
【问题描述】:

我找到了一种通过hftp 连接到hadoop 的方法,并且工作正常,(只读):

uri = "hftp://172.16.xxx.xxx:50070/";

System.out.println( "uri: " + uri );           
Configuration conf = new Configuration();

FileSystem fs = FileSystem.get( URI.create( uri ), conf );
fs.printStatistics();

但是,我想读/写以及复制文件,也就是说,我想通过 hdfs 连接。如何启用 hdfs 连接以便我可以编辑实际的远程文件系统?

我尝试将上面的协议从hftp 更改为hdfs,但出现以下异常...

(请原谅我对 url 协议和 hadoop 的了解不足,我认为这是一个有点奇怪的问题,但我将不胜感激!)

线程“主”java.io.IOException 中的异常:调用 /172.16.112.131:50070 在本地异常上失败:org.apache.hadoop.ipc.Client.wrapException 处的 java.io.EOFException(Client.java: 1139) 在 org.apache.hadoop.ipc.Client.call(Client.java:1107) 在 org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:226) 在 $Proxy0.getProtocolVersion(未知来源) 在 org.apache.hadoop.ipc.RPC.getProxy(RPC.java:398) 在 org.apache.hadoop.ipc.RPC.getProxy(RPC.java:384) 在 org.apache.hadoop.hdfs.DFSClient。 createRPCNamenode(DFSClient.java:111) at org.apache.hadoop.hdfs.DFSClient.(DFSClient.java:213) at org.apache.hadoop.hdfs.DFSClient.(DFSClient.java:180) at org.apache.hadoop .hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:89) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1514) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java: 67) 在 org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:1548) 在 org.apache.hadoop.f s.FileSystem$Cache.get(FileSystem.java:1530) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:228) at sb.HadoopRemote.main(HadoopRemote.java:24)

【问题讨论】:

    标签: ssh hadoop hdfs


    【解决方案1】:

    只需将您要访问的hadoop 的core-site.xmlhdfs-site.xml 添加到conf,如下所示:

    import java.net.URI;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.testng.annotations.Test;
    
    /**
     * @author karan
     *
     */
    public class HadoopPushTester {
    
        @Test
        public void run() throws Exception {
    
            Configuration conf = new Configuration();
    
            conf.addResource(new Path("src/test/resources/HadoopConfs/core-site.xml"));
            conf.addResource(new Path("src/test/resources/HadoopConfs/hdfs-site.xml"));
    
            String dirName = "hdfs://hosthdfs:port/user/testJava";
    
            // Values of hosthdfs:port can be found in the core-site.xml  in the fs.default.name
            FileSystem fileSystem = FileSystem.get(conf);
    
    
            Path path = new Path(dirName);
            if (fileSystem.exists(path)) {
                System.out.println("Dir " + dirName + " already exists");
                return;
            }
    
            // Create directories
            fileSystem.mkdirs(path);
    
            fileSystem.close();
        }
    }
    

    【讨论】:

      【解决方案2】:

      关于 hadoop :您需要确保 core-site.xml namenode 条目在您的 hadoop 配置中服务于 0.0.0.0 而不是 127.0.0.1 (localhost)。重要的是,clouderas vm distro 出于某种原因默认为 localhost

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-29
        • 2010-11-12
        • 1970-01-01
        • 2016-08-22
        • 2018-08-09
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        相关资源
        最近更新 更多