2016-11-23 6 views
0

У меня есть следующая работа в модульном тесте для записи одного объекта в Avro/Parquet в файл в кластере Cloudera/HDFS.Как записывать данные в реальном времени в HDFS с помощью Avro/Parquet?

При этом, учитывая, что Parquet является столбчатым форматом, кажется, что он может только выписать весь файл в пакетном режиме (обновления не поддерживаются).

Итак, каковы наилучшие методы для записи файлов для приема данных (через ActiveMQ/Camel) в реальном времени (небольшие сообщения при 1k msg/sec и т. Д.)?

Я предполагаю, что я мог бы объединять свои сообщения (буфер в памяти или в другом временном хранилище) и записывать их в пакетном режиме с использованием динамического имени файла, но я чувствую, что у меня что-то не хватает с именами разделов/файлов вручную, и т.д ...

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(); 

ответ

0

основанный на моем (ограниченный) исследования ... Я предполагаю, что файлы не могут быть добавлены (дизайн) ... так что я просто должен пакетные данные в режиме реального времени (в памяти или иным образом), прежде чем записывать файлы в паркет ...

How to append data to an existing parquet file