我在Hadoop中有一个包含许多不同客户数据的大型数据集。
每个客户可以在此数据集中拥有多个订单商品,其中许多订单商品的数量范围从每天几百到几百万。
该数据集约有50,000名客户。
我需要做的是为每个客户创建每日XML报告,其中每个客户的数据都在其自己的文件中。这意味着一些文件很小,但其他文件会很大(XML表示非常冗长,并且有很多字段)。
编写Map Reduce代码来生成XML是微不足道的,我解决这个问题的第一个方法是使用Hadoop Multiple Outputs在reducer中为每个客户编写一个文件。虽然这有效,但所有这些小文件都会给Namenode带来很大的压力。另外,我需要将所有这些文件导出Hadoop集群,并将它们放在标准文件系统中,Web应用程序将为其提供服务,因此导出大量此类文件也可能会产生问题。
我提出的另一个想法是创建一个单独的Sequence文件,其密钥等于客户,并且包含单个事务的XML的值,按照构成XML报告的顺序进行预先排序。然后我可以导出单个序列文件并编写一个简单的独立Java程序来读取序列文件并为每个客户写出一个文件。我已经在一个小数据集上对此进行了测试,希望性能可以。
有没有其他人遇到过Hadoop这样的问题,还有其他想法如何解决这个问题?
序列文件听起来像是一种明智的方法吗?
答案 0 :(得分:1)
据我所知,使用MapFile作为存储可能会很好地解决您的问题。 MapFile是一个已排序的SequenceFile,它还保留了一个索引文件,用于从地图中更快地搜索键。
您可以从作业中编写MapFile,其中键可以是客户ID,值可以是xml内容,MapFile会在幕后创建索引文件,该文件将维护客户ID键的偏移量。
通过这种方式,所有客户的xml文件都将在Mapfile中编写,从而消除了小文件问题,这样您的名字节点就可以轻松呼吸:)。
在此之后您可以将Mapfile导出到任何应用程序,您不需要将MapFile的内容写入磁盘,其中您可以通过查找客户来重复使用MapFile本身来检索客户xml内容id和MapFile将支持在索引文件的帮助下快速查找。请参考,
http://www.codeproject.com/Articles/887028/Implementing-Joins-in-Hadoop-Map-Reduce-using-MapF
MapFile的BloomMapFile变体声称可以更快地查找关键字,这可能会对您有所帮助。希望这会有所帮助。