我收到一个输入文件,其中包含 200 MM 的记录。记录只是一个键。对于此文件(我将调用 SAMPLE_FILE)中的每条记录,我需要从与键匹配的数据库(我将调用 EVENT_DATABASE)中检索所有记录。EVENT_DATABASE可以有数十亿条记录。
例如:
SAMPLE_FILE
1234
2345
3456
EVENT_DATABASE
2345 - content C - 1
1234 - content A - 3
1234 - content B - 5
4567 - content D - 7
1234 - content K - 7
1234 - content J - 2
因此,系统将遍历SAMPLE_RECORD的每个记录,并获取具有相同键的所有 EVENTS。例如,获取 1234 并查询EVENT_DATABASE将检索:
1234 - content A - 3
1234 - content B - 5
1234 - content K - 7
1234 - content J - 2
然后,我将使用结果集执行一些计算。例如,计数、求和、平均值
F1 = 4 (count)
F2 = 17 (sum(3+5+7+2))
我将解决使用 HBASE 存储EVENT_DATABASE的问题。然后,我将运行一个map-reduce作业,在map阶段,我将查询HBase,获取事件并执行计算。该过程可以分批进行。没有必要是实时的。
有人建议另一种架构吗?我真的需要地图缩减作业吗?我可以使用其他方法吗?
我个人使用MapReduce,HDFS和HBase进行批量分析解决了这类问题。您的方法似乎适合实现您的用例,我猜您将计算存储回 HBase。
Storm也可以用来实现同样的用例,但Storm在流数据和近实时处理而不是静态数据方面真正大放异彩。
你真的不需要为每个事件查询 Hbase。据我说,这将是一个更好的方法。
-
使用输入文件在 Hive 中创建外部表。
使用 Hive Hbase 集成在 Hive 中创建 hbase 表的外部表 (https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration)
对两个表执行联接并获取检索结果。
如果您只查询输入文件的子集,您的方法会很好,但由于您正在查询所有 recrods (20M) 的 hbase,因此使用联接会更有效。