2012-05-14 15 views
2

hadoop hdfsに書きます。ファイルはlzoを使用して圧縮する必要があります。また、ファイルはリアルタイムで追加されます。マップなしでlzo圧縮を使用してhadoop hdfsに書き込む方法

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

これをどのように達成できますか?助けを事前に

おかげ

答えて

6

カスタム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圧縮のために働く - あなたはすでにいくつかのJavaライブラリを持っている、LZO圧縮のために(例えばhadoop-gpl-compressionライブラリー)を圧縮することができます。上記のライブラリを詳細にインストールする場合は、出力パスの拡張子を ".lzo_deflate"に変更するだけで済みます。すべてうまくいくはずです。別の圧縮ライブラリを使用する場合は、CompressionCodecFactoryコードブロックをスキップしてoutputStreamを直接ラップすることができます。

ファイルへの追加については、使用しているバージョンによってはサポートされない場合があります。また、圧縮ライブラリが連結ファイルをサポートしているかどうかを検討する必要があります(GZipなど)。ただし、以前のバージョンのJava/hadoopではこれらのタイプの問題があります。あなたが追加をサポートするバージョンのhadoopを持っていて、あなたの圧縮ライブラリがそれをsuupしているなら、

+0

に電話してください。 –

+0

私はhadoopでいくつかの圧縮テストを実行しようとしています。シナリオは単純です:圧縮された入力でwordcountを実行してください。 ubuntuのlzopツールを使ってlzo圧縮ファイルを作成し、それをwordcountに与えた後、結果ファイルに面白い文字が含まれていることに気付きました。そこで私はHadoopからファイルを圧縮することを考えました。私は日食であなたのコードを実行した、それは出力ファイルを作成する..しかし、彼らは期待どおりに圧縮されていません。理由はわからない – AlexandruC

+0

あなたのコードの唯一の変更は、私がcodecFactoryを使用していることです。 "org.apache.hadoop.io.compress.GzipCodec"); – AlexandruC