2

Hadoop hdfs に書き込んでいます。ファイルは lzo を使用して圧縮する必要があります。また、ファイルはリアルタイムで追加されます。

ソース ファイルは、hadoop には存在しない gzip ファイルです。バッチはこの gzip ファイルを処理してから、lzo 圧縮を行い、hadoop に追加します。これにより、 map reduce を使用する可能性がなくなりますか?

どうすればこれを達成できますか?

助けてくれてありがとう

4

1 に答える 1

7

カスタム Java コードから HDFS に直接書き込むことができます。

public class HdfsWrite extends Configured implements Tool {
    public int run(String[] arg0) throws Exception {

        // create am HDFS file system
        FileSystem fs = FileSystem.get(getConf());

        // create an output stream to write to a new file in hdfs
        Path outputPath = new Path(
                "/path/to/file/in/hdfs.default");
        OutputStream outputStream = fs.create(outputPath);

        // now wrap the output stream with a Zlib compression codec
        CompressionCodecFactory codecFactory = new CompressionCodecFactory(getConf());
        CompressionCodec codec = codecFactory.getCodec(outputPath);
        CompressionOutputStream compressedOutput = codec.createOutputStream(outputStream);

        // send content to file via compressed output stream using .write methods
        // ..

        // close out stream
        compressedOutput.close();

        return 0;
    }    

    public static void main(String[] args) throws Exception {
        ToolRunner.run(new HdfsWrite(), args);
    }
}

このコードは zlib 圧縮で機能します。LZO 圧縮の場合、圧縮を実行できる Java ライブラリ ( hadoop-gpl-compressionライブラリなど)を既に入手していますか? 上記のライブラリを詳細に従ってインストールすると、出力パスの拡張子を「.lzo_deflate」に修正するだけで、すべてが機能するはずです。別の圧縮ライブラリを使用する場合は、コードの CompressionCodecFactory ブロックをスキップして、outputStream を直接ラップできます。

ファイルへの追加については、hadoop のバージョンによってはサポートされていない場合があります。また、圧縮ライブラリが連結ファイルをサポートしているかどうかも考慮する必要があります (たとえば GZip はサポートしていますが、これらのタイプを処理する際に以前のバージョンの Java/hadoop にはいくつかの問題があります)。追加をサポートするバージョンの hadoop があり、圧縮ライブラリがそれをサポートしている場合は、fs.create(outputPath)呼び出しを修正します。fs.append(outputPath)

于 2012-05-14T13:03:03.350 に答える