繁体   English   中英

如何并行化几个apache spark rdds?

[英]How to parallelize several apache spark rdds?

我有下一个代码:

sc.parquetFile("some large parquet file with bc").registerTempTable("bcs")
sc.parquetFile("some large parquet file with imps").registerTempTable("imps")
val bcs = sc.sql("select * from bcs")
val imps = sc.sql("select * from imps")

我想要做:

bcs.map(x => wrapBC(x)).collect
imps.map(x => wrapIMP(x)).collect

但是当我这样做时,它并没有异步运行。 我可以用Future来做,就像那样:

val bcsFuture = Future { bcs.map(x => wrapBC(x)).collect }
val impsFuture = Future { imps.map(x => wrapIMP(x)).collect }
val result = for {
  bcs <- bcsFuture
  imps <- impsFuture
} yield (bcs, imps)
Await.result(result, Duration.Inf) //this return (Array[Bc], Array[Imp])

我想在没有未来的情况下做到这一点,我该怎么做?

更新这最初是在问题更新之前编写的。 鉴于这些更新,我同意@ stholzm在这种情况下使用cartesian 的答案


确实存在有限数量的动作,这些动作将为RDD[A]产生FutureAction[A] RDD[A]并在后台执行。 这些在AsyncRDDActions类中可用,并且只要导入SparkContext._任何RDD都可以根据需要隐式转换为AysnchRDDAction 对于您的特定代码示例:

bcs.map(x => wrapBC(x)).collectAsync
imps.map(x => wrapIMP(x)).collectAsync

除了在后台评估DAG到行动之外, FutureAction产生了cancel方法以尝试提前结束处理。

警告

这可能不符合您的想法。 如果目的是从两个来源获取数据然后将它们组合起来,那么您更有可能想要加入或分组RDD。 为此,您可以查看PairRDDFunctions中可用的函数,这些函数也可以通过隐式转换在RDD上获得。

如果目的不是让数据图表交互,那么根据我的经验,然后同时运行批处理可能只会减慢两者的速度,尽管这可能是集群配置的结果。 如果资源管理器被设置为以FIFO顺序给出每个执行阶段的集群垄断(独立和YARN模式中的默认值,我相信;我不确定Mesos)然后每个异步收集将与每个其他的垄断,运行他们的任务,然后再次争夺下一个执行阶段。

将此与使用Future来阻塞对下游服务或数据库的阻塞调用进行比较,例如,所讨论的资源是完全独立的,或者通常具有足够的资源容量来并行处理多个请求而不会发生争用。

更新:我误解了这个问题。 期望的结果不是笛卡儿积Array[(Bc, Imp)]

但我认为单个map调用的时间并不重要,因为只要添加其他转换,Spark就会尝试以有效的方式组合它们。 只要RDDS你只链变革 ,什么都不会发生上的数据。 当您最终应用操作时 ,执行引擎将找出生成所请求数据的方法。

所以我的建议是不要过多考虑中间步骤,尽可能避免collect ,因为它会将所有数据提取到驱动程序中。


看来你自己正在制作笛卡尔产品。 请尝试cartesian

val bc = bcs.map(x => wrapBC(x))
val imp = imps.map(x => wrapIMP(x))
val result = bc.cartesian(imp).collect

请注意,在最终RDD上调用collect而不再在中间结果上调用collect

您可以使用union来解决此问题。 例如:

bcs.map(x => wrapBC(x).asInstanceOf[Any])
imps.map(x => wrapIMP(x).asInstanceOf[Any])

val result = (bcs union imps).collect()
val bcsResult = result collect { case bc: Bc => bc }
val impsResult = result collect { case imp: Imp => imp }

如果要使用sortBy或其他操作,可以使用trait或main类的继承。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM