HDFS上非结构化数据行的数据存储格式

时间:2016-10-22 09:22:17

标签: hadoop serialization hdfs apache-flink sequencefile

我们正在消耗非常大的数据,需要尽可能快地写入我们正在使用的HDFS,因此我们更喜欢使用它。数据几乎是非结构化的,我们很少会对它们进行基本查询。数据是平的,有一些字段,每行代表另一个数据。

key1=str key2=30.3 key3=longtexthere

另一个数据行:

key1=3 key5=abc

SequenceFile似乎是最自然的,但我找不到如何在一个SequenceFile中存储多行。

目前,在我们的临时解决方案中,我们有多个写入多个文本文件的编写器。因此,当需要查询时,我们会并行查看它们。但是,当前的文本文件包含1000行,我不认为为每行创建单个SequenceFile是可行的,在查询时存储元数据和一次读取太多文件会产生很多开销。

我认为问题可以通过使用HBase或Cassandra(columunar数据库)解决,但我们几乎需要使用HDFS。我是否遗漏了使用SequenceFiles的东西,或者我们应该真的使用columunar数据库?

1 个答案:

答案 0 :(得分:1)

所以序列文件格式是这样的: <key, value> <key, value> <key, value> ... 其中键是WritableComparable,值是Writable。 现在很多人正在做的事情 - 你可以做同样的事情 - 是:

  • 仅使用密钥或值&#39;列&#39;
  • 实现一个自定义Writable,它包装了一组其他Writable(称之为记录,行,......)

通过这种方式,您可以为所需的一切建模。该可写记录可以具有固定的模式,例如它包含“IntWritable,Text,IntWritable,IntWritable&#39; (取决于你的领域)。或者,如果您不想支持不同的类型,您可以使用现有的ArrayWritable作为您的记录&#39;。 了解每个文件的模式(例如,将其放入序列文件的元数据中,将允许您对具有不同/演进模式的文件进行读取。

所以它的手工制作很多,但构建可以非常高效灵活的结构。从未使用它,但看看http://pangool.net/userguide/schemas.html,认为他们已经建模了在序列文件之上的灵活记录/元组架构。

最重要的是,我认为您可以通过序列文件实现您想要的效果。 不过,我建议您也查看ParquetORC files等列式文件格式。那些有自己的权衡,但你会有更高的压缩率和选择性读取(列投影,过滤器下推)。你也不必发明架构/元组结构。