[英]How to run parallel programs with 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的並行函數嗎?
如果您希望用來參數化呼叫的數據在每一行之間都不相同,那么是的,您將需要在每一行中包含該數據。
但是,如果要設置影響每一行的全局參數,則可以使用廣播變量。
http://spark.apache.org/docs/latest/rdd-programming-guide.html#broadcast-variables
廣播變量在腳本中創建一次,之后將無法修改。 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.