私はCloudera/HDFSクラスタ内のファイルにAvro/Parquetの単一のオブジェクトを書き込むために以下のユニットテストを行っています。Avro/Parquetを使用してHDFSにリアルタイムデータを書き込む方法は?
つまり、Parquetは円柱形式であるため、ファイル全体をバッチモードで書き出すことができるようです(更新はサポートされていません)。
(ActiveMQ/Camel経由で)データをリアルタイムで受信するためのファイルを作成するためのベストプラクティスは何ですか(1k msg /秒などの小さなメッセージ)?
私は自分のメッセージ(メモリまたは他の一時記憶域のバッファ)を集約し、動的ファイル名を使ってバッチモードで書き出すことができたと思いますが、私は手書きでパーティション/等...私の(限られた)調査に基づく
Configuration conf = new Configuration(false);
conf.set("fs.defaultFS", "hdfs://cloudera-test:8020/cm/user/hive/warehouse");
conf.setBoolean(AvroReadSupport.AVRO_COMPATIBILITY, false);
AvroReadSupport.setAvroDataSupplier(conf, ReflectDataSupplier.class);
Path path = new Path("/cm/user/hive/warehouse/test1.data");
MyObject object = new MyObject("test");
Schema schema = ReflectData.get().getSchema(object.getClass());
ParquetWriter<InboundWirelessMessageForHDFS> parquetWriter = AvroParquetWriter.<MyObject>builder(path)
.withSchema(schema)
.withCompressionCodec(CompressionCodecName.UNCOMPRESSED)
.withDataModel(ReflectData.get())
.withDictionaryEncoding(false)
.withConf(conf)
.withWriteMode(ParquetFileWriter.Mode.OVERWRITE) //required because the filename doesn't change for this test
.build();
parquetWriter.write(object);
parquetWriter.close();