我目前正在考虑使用Spark Streaming来获取类似日志文件的条目,并出于统计原因对它们进行一些计算。
HDFS上有数据集,现在可以从HBase和Hive访问,这些数据集需要查找一些数据并对其进行转换,例如IP和机器名称与机器所有者之间的映射。
Spark应用程序预计将在我们的集群中每天运行数周而无需重启。但是,这些参考表每隔几个小时就会更新一次。
如果使用的数据稍微过时,这是可以的,但数据有两周的时间是不可行的。因此,我想知道如何在地图中查找数据以进行转换和丰富,并减少阶段。我有几个想法。
广播变量可以读入数据集并有效传递。然而,一旦设置了广播变量,它就不能被改变,并且在驱动程序类中再次获取数据,不显示和广播新的数据不会起作用,因为工作者'指针都指向旧数据集。我不知道是否有办法解决这个问题。
可以进行HBase get()查询。如果基于查找的键将数据定向到reducer,则每个reducer可以保存整个数据集的子集的高速缓存,并且可以保持它们自己的本地高速缓存。 HBase在获取单个记录时应具有最小的延迟。
还有别的吗?
答案 0 :(得分:3)
这里有两个选择。
首先在DStream之上使用foreachRDD
转换。 foreachRDD
在驱动程序端执行,这意味着您可以在那里创建任何新的RDD。您可以存储时间计数器并每10-15分钟从HDFS重新读取文件
其次是通过DStream读取transform
转换中的某个文件,并将其结果保存在内存中。使用这种方法,您必须通过每个执行程序读取整个查找表,这是无效的
我建议您使用第一种方法。更准确地说,您可以在上次更新数据时将标记存储在某个位置,并将其存储在Spark应用程序中。在每次迭代中,检查此标志的值(例如,存储在HBase或Zookeeper中)并将其与本地存储的值进行比较 - 如果不同,则重新读取查找表,否则执行操作旧的