1

私は Hadoop HDFS が初めてで、Java にはかなり慣れていないので、助けが必要です。HDFS からファイルを読み取り、このファイルの MD5 ハッシュを計算しようとしています。一般的な Hadoop 構成は次のとおりです。

private FSDataInputStream hdfsDIS;
private FileInputStream FinputStream;
private FileSystem hdfs;
private Configuration myConfig;

myConfig.addResource("/HADOOP_HOME/conf/core-site.xml");
myConfig.addResource("/HADOOP_HOME/conf/hdfs-site.xml");

hdfs = FileSystem.get(new URI("hdfs://NodeName:54310"), myConfig);

hdfsDIS = hdfs.open(hdfsFilePath);

関数hdfs.open(hdfsFilePath)FSDataInputStream

問題は、HDFS からしか取得できないことですが、それFSDataInputStreamを取得したいと考えFileInputStreamています。

以下のコードはハッシュ部分を実行し、StackOverflow のどこかで見つけたものから適応されています (現在はリンクが見つからないようです)。

FileInputStream FinputStream = hdfsDIS;   // <---This is where the problem is
MessageDigest md;
    try {
        md = MessageDigest.getInstance("MD5");  
        FileChannel channel = FinputStream.getChannel();
        ByteBuffer buff = ByteBuffer.allocate(2048);

        while(channel.read(buff) != -1){
            buff.flip();
            md.update(buff);
            buff.clear();
        }
        byte[] hashValue = md.digest();

        return toHex(hashValue);
    }
    catch (NoSuchAlgorithmException e){
        return null;
    } 
    catch (IOException e){
        return null;
    }

が必要な理由FileInputStreamは、ハッシュを行うコードがFileChannelファイルからデータを読み取る効率を高めると思われる を使用するためです。

FSDataInputStreamを に変換する方法を教えてもらえますかFileInputStream

4

3 に答える 3

0

FSDataInputStreamを通常の として使用しInputStream、それを に渡しての代わりにChannels.newChannelを取得できます。更新されたバージョンは次のとおりです。ReadableByteChannelFileChannel

InputStream inputStream = hdfsDIS;
MessageDigest md;
try {
    md = MessageDigest.getInstance("MD5");  
    ReadableByteChannel channel = Channels.newChannel(inputStream);
    ByteBuffer buff = ByteBuffer.allocate(2048);

    while(channel.read(buff) != -1){
        buff.flip();
        md.update(buff);
        buff.clear();
    }
    byte[] hashValue = md.digest();

    return toHex(hashValue);
}
catch (NoSuchAlgorithmException e){
    return null;
} 
catch (IOException e){
    return null;
}
于 2013-09-30T23:22:12.123 に答える
-1

次の理由により、その課題を実行できません:

java.lang.Object
によって
拡張される java.io.InputStream によって拡張される java.io.FilterInputStream によって
拡張される java.io.DataInputStream によって
拡張される org.apache.hadoop.fs.FSDataInputStreamによって拡張される

FSDataInputStream は FileInputStream ではありません。

つまり、FSDataInputStream から FileInputStream に変換すると、

FSDataInputStream FileDescriptors を使用して、Api に従って FileInputStream を作成できます。

new FileInputStream(hdfsDIS.getFileDescriptor());

うまくいくかどうかわかりません。

于 2013-09-30T17:09:10.167 に答える