簡體   English   中英

如何使用pyspark運行並行程序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM