我有一个用例将一些tera字节的文本文件作为序列文件上传到HDFS上。
这些文本文件有多种布局,范围从32到62列(元数据)。
上传这些文件及其元数据的好方法是什么:
为每个文本文件布局创建一个键值类,并使用它来创建和上传为序列文件?
在每个作为序列文件单独上传的文件中创建SequenceFile.Metadata标头?
感谢所有投入!
由于
答案 0 :(得分:1)
我更喜欢将元数据与数据一起存储,然后将应用程序设计为元数据驱动,而不是将元数据嵌入到应用程序的设计或实现中,这意味着更新元数据需要更新应用程序。当然,你可以在多大程度上采用元数据驱动的应用程序。
您可以使用数据嵌入元数据,例如使用像JSON这样的编码方案,或者您可以将元数据与数据一起使用,例如在SeqFile中具有专门用于描述元数据的记录,可能使用保留标记密钥,以便给元数据赋予自己的命名空间,使其与实际数据的密钥使用的命名空间分开。
至于是否应将其打包成单独的Hadoop文件的建议,请记住可以指示Hadoop通过配置设置将文件拆分为Splits(地图阶段的输入)。因此,即使是单个大型SeqFile也可以通过多个映射任务并行处理。拥有单个hdfs文件的优点是它更接近于原始数据的包含单位。
关于密钥类型的建议(即是否使用文本与二进制),请考虑将密钥与其他值进行比较。键越紧凑,比较越快。因此,如果您可以存储密集的密钥版本,那将是更可取的。同样,如果您可以构造键布局以使第一个字节通常不相同,那么它也将有助于提高性能。因此,例如,不建议将Java类序列化为键,因为文本流以类的包名开头,该类名可能与其他所有类相同,因此键入文件。
答案 1 :(得分:0)
如果您希望将数据及其元数据捆绑在一起,那么AVRO格式是合适的。它也允许模式演变。
答案 2 :(得分:-1)
最简单的方法是创建SequenceFiles Text的键和值。从数据中选择一个有意义的字段来制作Key,数据本身就是一个Text的值。 SequenceFiles用于存储键/值对,如果不是您的数据,则不使用SequenceFile。您只需上传未处理的文本文件并将其输入Hadoop。
为获得最佳性能,请勿将每个文件的大小设置为TB。 Hadoop的Map阶段为每个输入文件运行一个作业。您希望拥有的文件多于Hadoop集群中的CPU核心数。否则,您将有一个CPU执行1 TB的工作和大量空闲CPU。一个好的文件大小可能是64-128MB,但为了获得最佳效果,你应该自己测量它。