我们正在消耗非常大的数据,这些数据需要与接收到的数据一样快地写入,而且我们使用的是HDFS,因此我们更喜欢使用HDFS。数据几乎是非结构化的,我们很少对它们进行基本的查询。数据是扁平的,有一些字段,每一行代表另一个数据。
key1=str key2=30.3 key3=longtexthere
另一个数据行:
key1=3 key5=abc
SequenceFile似乎是最自然的一种,但是我不知道如何在一个SequenceFile中存储多行。
目前,在我们的临时解决方案中,我们有多个写入器来写入多个文本文件。因此,当需要查询时,我们并行读取它们。然而,当前的文本文件包含数千行,我不认为为每一行创建一个SequenceFile是可行的,这将导致存储元数据和在查询时一次读取太多文件的大量开销。
我认为这个问题可以通过使用HBase或Cassandra来解决,这是一个列式数据库,但我们几乎都需要使用HDFS。我是不是在SequenceFiles中遗漏了什么,或者我们真的应该使用一个列式数据库?
发布于 2016-10-24 16:51:02
因此,序列文件格式是这样的:<key, value> <key, value> <key, value> ...
,其中键是WritableComparable,值是可写的。现在很多人都在做的事情--你也可以这么做--是:
记录行仅使用键或值包装一组其他可写项(称为'column'
这样你就可以对你想要的一切进行建模。可写的记录可以有一个固定的模式,比如它包含'IntWritable,Text,IntWritable,IntWritable‘(取决于你的字段)。或者如果你不想支持不同的类型,你可以使用现有的ArrayWritable作为你的“记录”。了解每个文件的模式(例如,将其放入序列文件的元数据中)将允许您读取具有不同/演进模式的文件。
所以它有很多手工制作,但可以建立非常有效和灵活的结构。我从来没有用过它,但是看看http://pangool.net/userguide/schemas.html,我想他们已经在序列文件之上建立了一个灵活的记录/元组模式。
归根结底,我认为你可以用序列文件实现你想要的。不过,我建议您也可以看看像Parquet或ORC files这样的列式文件格式。这些都有它们自己的权衡,但你会有更高的压缩率和选择性读取(列投影,过滤器下推)。而且,您也不必发明模式/元组结构。
https://stackoverflow.com/questions/40190430
复制相似问题