如何使用Avro / Parquet将实时数据写入HDFS?

时间:2016-11-23 00:14:38

标签: hdfs cloudera avro parquet

我在单元测试中有以下工作,将Avro / Parquet中的单个对象写入Cloudera / 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();

1 个答案:

答案 0 :(得分:0)

基于我的(有限的)研究......我假设文件无法附加到(按设计)...所以我必须在写出之前批量处理实时数据(在内存中或其他方式)镶木地板中的文件...

How to append data to an existing parquet file