簡體   English   中英

Pyspark無法在作為參數傳遞給foreach或foreachPartition的方法上識別環境變量

[英]Pyspark don't recognize env variables on the method passed as argument to foreach or foreachPartition

在下面的代碼中,我嘗試使用URL的env變量實例化redis-py連接。 問題是當我使用foreach或foreachPartition時 ,#save_on_redis方法中無法識別env變量。

我只是嘗試在外部創建redis連接,但收到“ pickle.PicklingError:無法腌制“鎖定”對象” ,因為spark嘗試在所有節點上同時運行這兩種方法。

問題:如何在作為參數傳遞給foreach或foreachPartition的方法上使用env變量?

import os
from pyspark.sql import SparkSession
import redis

spark = (SparkSession
        .builder
        .getOrCreate())

print "---------"
print os.getenv("REDIS_REPORTS_URL")
print "---------"

def save_on_redis(row):
    redis_ = redis.StrictRedis(host=os.getenv("REDIS_REPORTS_URL"), port=6379, db=0)
    print os.getenv("REDIS_REPORTS_URL")
    print redis_
    redis_.set("#teste#", "fagner")


df  = spark.createDataFrame([(0,1), (0,1), (0,2)], ["id", "score"])
df.foreach(save_on_redis)

我建議您在驅動程序進程中獲取env變量,並將其作為python變量傳遞給工作進程,在此可以使用os.putenv設置環境。

例:

In [1]: import os

In [2]: a = sc.parallelize(range(20))

In [3]: os.getenv('MY_VAR')
Out[3]: 'some_value'

In [4]: def f(iter):
    import os
    return (str(os.getenv('MY_VAR')),)
   ...:

In [5]: a.mapPartitions(f).collect()
Out[5]: ['None', 'None']

In [6]: my_var = os.getenv('MY_VAR')

In [6]: def f2(iter):
    import os
    from subprocess import check_output
    os.putenv('MY_VAR', my_var)
    return (check_output('env | grep MY_VAR', shell=True), my_var)
   ....:

In [7]: a.mapPartitions(f2).collect()
Out[7]:
['MY_VAR=some_value\n',
 'some_value',
 'MY_VAR=some_value\n',
 'some_value']

PS。 根據此答案 ,最好直接修改os.environ映射對象,而不是使用os.putenv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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