1

Cloudera Hadoopをインストールしていますが、ファイルシステムやWindowsマシンから読み取り/書き込みを行うJavaプログラムを作成したいと思います。これは可能でしょうか?

私のプログラムはとてもシンプルです:

public class HadoopReader {
static {
    URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}

public static void main(String[] args) throws Exception {
    System.out.println("okay");
    InputStream in = null;
    try {
        in = new URL("hdfs://HOST/PATH").openStream();
        IOUtils.copyBytes(in, System.out, 4096, false);
    } finally {
        IOUtils.closeStream(in);
    }
}
}

しかし、私はこのエラーが発生しています:

Exception in thread "main" java.lang.StackOverflowError
at java.net.URLStreamHandler.parseURL(Unknown Source)
at sun.net.www.protocol.file.Handler.parseURL(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at sun.misc.URLClassPath$FileLoader.getResource(Unknown Source)
at sun.misc.URLClassPath$FileLoader.findResource(Unknown Source)
at sun.misc.URLClassPath$1.next(Unknown Source)
at sun.misc.URLClassPath$1.hasMoreElements(Unknown Source)
at java.net.URLClassLoader$3$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader$3.next(Unknown Source)
at java.net.URLClassLoader$3.hasMoreElements(Unknown Source)
at sun.misc.CompoundEnumeration.next(Unknown Source)
at sun.misc.CompoundEnumeration.hasMoreElements(Unknown Source)
at java.util.ServiceLoader$LazyIterator.hasNext(Unknown Source)
at java.util.ServiceLoader$1.hasNext(Unknown Source)
at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2117)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2128)
at org.apache.hadoop.fs.FsUrlStreamHandlerFactory.createURLStreamHandler(FsUrlStreamHandlerFactory.java:66)
...

Cloudera 4の「ソース」ダウンロードからのjarファイルを使用しています(以前は、古いバージョンのHadoopをダウンロードしていましたが、URLは正常に解析されているように見えましたが、バージョンが一致していませんでした)

4

2 に答える 2

0

試す

    Configuration conf = new Configuration();
    confVirtual.set("fs.default.name", "hdfs://ip:port");
    confVirtual.set("mapred.job.tracker", "hdfs://ip:port");
    FileSystem fs = FileSystem.get(conf);

この方法で HDFS クラスターにアクセスした後、FSDataOutputStream/FSDataInputStream クラスを介して読み取り/書き込み操作を実行できます。

于 2013-08-26T08:35:05.033 に答える
0

hadoop FileSystem クラスを使用する必要があります。IOUtils は Hadoop とは関係がなく、あなたがしていることは機能しません。

このメソッドを見てくださいPath.getFileSystem

接続先の hdfs ファイルシステム URL で hadoop core-site.xml を使用します。理想的には、hdfs 自体の Namenode からこの xml のコピーを取得します。それをクラスパスに入れると、すべての hdfs クライアント API を使用できます。

于 2012-08-12T18:19:44.997 に答える