【发布时间】:2016-11-16 23:52:50
【问题描述】:
我是 Spark 的新手,我不确定我是否理解它很好地分配作业的方式。
我有以下代码:
c1 = dict(smallrdd1.collect())
bigrdd1 = bigrdd1.filter(lambda val: c1[val])
c2 = dict(smallrdd2.collect())
bigrdd2 = bigrdd2.filter(lambda val: c2[val])
如果我理解得很好,这两个collect 将在主作业上运行,而不是同时运行,这会减慢整个过程。如何让 spark 在单独的作业中、在单独的节点上执行收集和过滤?
编辑
我认为我的问题不是很清楚。我会尽量让它更具体。
我想要实现的是对面向列的数据进行有效的星图连接。也就是说,我有几个维度表,每个维度表都有几百万个键值。当存储为原始 python dict 或 scala Map 时,它们每个都是几百 Mb。这足够小,可以在每个节点上单独放入内存中,但它们加在一起构成了几个 Gb,并且无法放入内存中。
另一方面,对于这些小维度列中的每一个,我都有一个大的事实列,它有几十亿行,并且肯定不适合内存。
这个想法是管理集群内的数据位置,以便每个大表位于不同的节点上。然后启动几个任务,每个任务负责一个join。然后从磁盘加载维度表并同时创建哈希图,然后将哈希图“广播”到那些需要它的任务。然后,将大事实列与维度表连接起来。
【问题讨论】:
-
两个收集不会同时运行,它是顺序的。主要是当你收集时,它会将所有元素收集到驱动程序,当你使用任何转换或操作(如过滤器、映射等)时......它将在单独的节点上运行。
-
是的,我明白了。但就我而言,我只需要在将执行过滤器的执行者上拥有这些
dict。我不需要它们在驱动程序上。有没有办法做到这一点? -
我不确定那个字典是什么...但是你为什么要先收集然后过滤?当您使用过滤器时,它将在执行程序上运行。
-
是的,过滤器当然会在执行器上运行。我正在尝试实现并行地图侧连接。这些 dict 是我的小表的哈希表。
标签: apache-spark pyspark hadoop2 bigdata