Hadoop hdfs に書き込んでいます。ファイルは lzo を使用して圧縮する必要があります。また、ファイルはリアルタイムで追加されます。
ソース ファイルは、hadoop には存在しない gzip ファイルです。バッチはこの gzip ファイルを処理してから、lzo 圧縮を行い、hadoop に追加します。これにより、 map reduce を使用する可能性がなくなりますか?
どうすればこれを達成できますか?
助けてくれてありがとう
カスタム 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)