使用动态查找表的Spark Streaming

Sim*_*ead 9 hadoop hbase apache-spark spark-streaming

我目前正在研究使用Spark Streaming来获取类似日志文件的条目,并出于统计原因对它们进行一些计算.

HDFS上有数据集,可以从HBase和Hive访问,这些数据集需要查找一些数据并对其进行转换,例如IP和机器名称与机器所有者之间的映射.

预计spark应用程序将在我们的集群中每天运行数周,而无需重启.但是,这些参考表每隔几小时更新一次.

如果使用的数据稍微过时,这是可以的,但数据不适合两周.因此,我想知道如何在地图中查找数据以进行转换和丰富,并减少阶段.我有几点想法.

  1. 广播变量可以读入数据集并有效地传递它.但是,一旦设置了广播变量,就无法更改它,并且在驱动程序类中再次获取数据,取消操作并广播新数据将不起作用,因为工作者指针都指向旧数据集.我不知道是否有办法解决这个问题.

  2. 可以进行HBase get()查询.如果基于查找的键将数据定向到reducer,则每个reducer可以保存整个数据集的子集的高速缓存,并且可以保持它们自己的本地高速缓存.HBase在获取单个记录时应具有最小的延迟.

  3. 别的什么?

0x0*_*FFF 3

这里你有两个选择。

foreachRDD首先是在 DStream 之上使用转换。foreachRDD在驱动程序端执行,这意味着您可以在那里创建任何新的 RDD。您可以存储计时器并每 10-15 分钟从 HDFS 重新读取一次文件

其次是transform通过 DStream 读取转换中的某个文件并将其结果保存在内存中。使用这种方法,您必须读取每个执行器的整个查找表,这效率不高

我建议您使用第一种方法。更准确地说,您可以将上次更新数据时的标志存储在某个位置,并将其存储在 Spark 应用程序中。在每次迭代中,您检查此标志的值(例如,存储在 HBase 或 Zookeeper 中)并将其与本地存储的值进行比较 - 如果不同,则重新读取查找表,如果不同 - 执行操作旧的