2011-02-17 69 views
0

我有一个用例来上传一些tera-bytes的文本文件作为HDFS上的序列文件。hadoop中的巨大文件:如何存储元数据?

这些文本文件有几个布局,范围从32列到62列(元数据)。

什么将这些文件上传与他们的元数据的好方法:

  1. 创建密钥,每个文本文件布局值类,并用它来创建和上传的序列文件?

  2. 在每个作为序列文件单独上传的文件中创建SequenceFile.Metadata标头?

任何意见都表示赞赏!

感谢

回答

-1

最简单的事情做的是使SequenceFiles文本的键和值。从数据中选择一个有意义的字段来生成密钥,数据本身就是作为文本的值。 SequenceFiles专为存储键/值对而设计,如果这不是您的数据,那么不使用SequenceFile。您可以上传未处理的文本文件并将其输入到Hadoop。

为了获得最佳性能,请勿使每个文件的容量为TB。 Hadoop的Map阶段为每个输入文件运行一个作业。您希望拥有的文件多于Hadoop群集中具有CPU内核的文件。否则,你将有一个CPU执行1TB的工作和大量空闲的CPU。一个好的文件大小可能是64-128MB,但为了达到最佳效果,你应该自己测量一下。

+2

您声称地图阶段每个输入只使用一个文件实际上是错误的。 HDFS获取每个输入文件并将其分解成块,并在各种数据节点之间分割。唯一的问题是涉及压缩时,因为需要整个文件(对于文本,反正)来解压文件,所以不会分裂。但是,序列文件通过压缩单个记录或分隔块来解决此问题,从而允许分割文件。地图作业的数量与输入文件的数量无关。 – tedivm 2011-08-22 22:27:48

1

我更喜欢用数据存储元数据,然后将您的应用程序设计为元数据驱动,而不是将元数据嵌入应用程序的设计或实现中,这意味着元数据更新需要更新您的应用程序。当然,你可以采用元数据驱动的应用程序还有多远。

您可以使用数据嵌入元数据,例如使用像JSON这样的编码方案,也可以将元数据放在数据的旁边,例如SeqFile中的记录专门用于描述元数据,可能使用保留标记以便为元数据提供自己的名称空间,与实际数据的键所使用的名称空间分开。

至于是否应该将其打包到单独的Hadoop文件中的建议,请记住可以指示Hadoop通过配置设置将文件拆分为分割(输入用于映射阶段)。因此,即使是单个大型SeqFile也可以通过几个地图任务并行处理。拥有一个hdfs文件的好处是,它更接近于原始数据的遏制单元。

至于关于键类型的建议(即是否使用文本与二进制),请考虑将该键与其他值进行比较。密钥越紧密,比较速度越快。因此,如果您可以存储密钥的密钥版本,那将是更可取的。同样,如果您可以构建密钥布局,以使第一个字节通常不相同,那么它也将有助于提高性能。因此,例如,不推荐将Java类作为关键字序列化,因为文本流以类的包名开头,该类名可能与其他类相同,因此也是文件中的关键字。

0

如果您希望将数据及其元数据捆绑在一起,那么AVRO格式是合适的。它也允许模式演变。

相关问题