在循环内使用sparkDF.write.saveAsTable()会导致作业之间的延迟呈指数级增长

时间:2017-04-16 21:30:42

标签: apache-spark hive pyspark

我需要在for循环中执行一组不同的hive查询。

hc=HiveContext(sc)
queryList=[set of queries]
for i in range(0,X):
    hc.sql(queryList[i])
    sparkDF.write.saveAsTable('hiveTable', mode='append')

虽然此代码的作用类似于较小X值的魅力,但当X> 100时会导致问题。每个saveAsTable作业之间的延迟呈指数级增长,但每个作业或多或少都需要大约5秒。

  

我试图纠正这件事而没有任何运气:

     
      
  1. 在for循环中添加一次gc.collect()(i%100 == 0)。但这打破了FOR循环
  2.   
  3. 关闭当前的Spark和Hive上下文一次(i%100 == 0)并创建一个新的 - 这仍然无法解决问题
  4.   
  5. 使用纱线集群代替纱线客户端 - 没有运气!
  6.   

是否有类似的选项,我创建了与hive的连接并在每次调用saveAsTable函数时关闭它?或者清理司机?

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您正在使用for循环,它在火花驱动程序模式下执行而不是在集群工作节点上分布意味着它不使用并行功能或不在工作节点上执行。尝试使用与分区并行化来创建RDD,这将有助于在工作节点上生成作业

或者如果您只想处理hiveContext,您可以创建全局HiveContext,如val hiveCtx = new HiveContext(sc),并在循环内重用。

您还可以在群集上运行作业时更改/优化执行程序的数量以提高性能