如何使用pyspark运行并行程序?

时间:2017-10-19 16:00:11

标签: python apache-spark pyspark

我想使用我们的spark集群并行运行程序。我的想法是做如下:

def simulate():
  #some magic happening in here
return 0

spark = (
SparkSession.builder
    .appName('my_simulation')
    .enableHiveSupport()
    .getOrCreate())

sc = spark.sparkContext

no_parallel_instances = sc.parallelize(xrange(500))
res = no_parallel_instances.map(lambda row: simulate())
print res.collect()

我的问题是,是否有办法用不同的参数执行simulate()。我目前可以想象的唯一方法是使用指定参数的数据框,如下所示:

parameter_list = [[5,2.3,3], [3,0.2,4]]
no_parallel_instances = sc.parallelize(parameter_list)
res = no_parallel_instances.map(lambda row: simulate(row))
print res.collect()

还有另一种更优雅的方法来使用spark运行并行函数吗?

1 个答案:

答案 0 :(得分:0)

如果您希望参数化调用的数据在每行之间有所不同,那么您需要在每行中包含该数据。

但是,如果要设置影响每一行的全局参数,则可以使用广播变量。

http://spark.apache.org/docs/latest/rdd-programming-guide.html#broadcast-variables

广播变量在脚本中创建一次,之后无法修改。 Spark将有效地将这些值分发给每个执行程序,以使它们可用于您的转换。要创建一个,您需要将数据提供给spark,它会为您提供一个句柄,您可以使用该句柄在执行程序上访问它。例如:

settings_bc = sc.broadcast({
   'num_of_donkeys': 3,
   'donkey_color': 'brown'
})

def simulate(settings, n):
    # do magic
    return n

no_parallel_instances = sc.parallelize(xrange(500))
res = no_parallel_instances.map(lambda row: simulate(settings_bc.value, row))
print res.collect()