Spark Streaming加入Hbase

时间:2015-11-25 13:40:46

标签: apache-spark hive hbase spark-streaming

我有一个传入的火花数据流,用于摄取包含设备ID的消息:

{deviceId=123 , deviceState: "turned off" }

我想将此加入设备信息表:

{deviceId=123 , deviceInfo: "The red refrigirator" }

获取非规范化元组,例如:

{deviceId=123 , deviceState: "turned off", deviceInfo: "The red refrigirator" }

device_info表存储在HBASE中。 现在问题是: 每隔一段时间,"设备信息"可以更改hbase表:将新设备添加到表中,更改现有设备的Info等等... 这些更改 NOT 实时,我可以容忍更新的几分钟延迟。

我可以看到解决问题的三种方法:

  1. 不使用Spark连接:对于DataStream中的每个条目,按id执行device_info的单个hbase查找。

    • 这应该有效,但它看起来非常低,而且可能效率低下。
  2. 使用" newAPIHadoopRDD"在程序开始时从hbase创建一个RDD,然后将其与数据流中的每个新微量接头连接。

    • 我可能会错过对hbase表的任何更新。 (hbase表会不会重新扫描?)
  3. 对于传入Datastream中的每个微量分析(ds.foreachRdd):从hbase(newAPIHadoopRDD)创建RDD,然后调用join。

    • 这看起来很危险:从hbase为每个火花流创建如此多的新RDD可能会增加太多的延迟。
  4. 我应该采取什么方法?

1 个答案:

答案 0 :(得分:1)

稍微修改我会做#1。我会

  1. 将所有消息处理到内存中并创建一组要查找的设备ID。
  2. 在HBase中执行多项目以查找设备ID并放入哈希映射。
  3. 探测散列图以汇编已连接的记录。
  4. 这将允许您减少网络呼叫的数量(多重目录)并删除同一设备的重复呼叫(设置与列表)。

    我们在Splice Machine for Foreign Key Validation中做到了这一点,它显着提高了我们的性能(2-3倍)。

    祝你好运。