2016-01-06 36 views
1

我想讓每個python工作人員使用rpy2啓動R shell。我可以在某種設置階段執行此操作,類似於當您導入用於稍後執行程序任務的Python模塊時會發生這種情況嗎?例如:我可以在安裝過程中將外部(R)進程連接到每個pyspark工作人員

import numpy as np 

df.mapPartitions(lambda x: np.zeros(x)) 

在我來說,我要開始,而不是在每個執行人及進口[R庫的R外殼,這將是這個樣子:

import rpy2.robjects as robjects 
from rpy2.robjects.packages import importr 
rlibrary = importr('testrlibrary') 

df.mapPartitions(lambda x: rlibrary.rfunc(x)) 

但我不希望這樣發生在mapPartitions的調用中,因爲那樣會發生在任務級別,而不是每個執行者核心執行一次。這種方法的工作,看起來更像下面的例子,但對我來說沒有用。

def model(partition): 
    import rpy2.robjects as robjects 
    from rpy2.robjects.packages import importr 
    rlibrary = importr('testrlibrary') 
    rlibrary.rfunc(partition) 

df.mapPartitions(model) 

回答

1

像這樣的東西應該只是罰款:

import rpy2.robjects as robjects 
from rpy2.robjects.packages import importr 

def length_(s): 
    stringi = importr("stringi") 
    return stringi.stri_length(s)[0] 

sc.parallelize(["foo", "bar", "foobar"]).map(length_) 

R object,這表示R解釋,is a singleton所以將只初始化一次和R不重新導入已經連接庫。有一個從調用require多次一些開銷,但比起你的數據傳遞,並從R.

的成本應該是微不足道的。如果你想要的東西更復雜,你可以創建自己的singleton module或使用Borg pattern辦理進口,而是這可能是一個矯枉過正的問題。

我認爲,當你輸入一個Python模塊用於以後執行任務

它實際上取決於配置會發生這種事。默認情況下,Spark重用任務之間的解釋器,但可以修改此行爲。

我提供了一些示例,作爲對In Apache spark, what is the difference between using mapPartitions and combine use of broadcast variable and map的回答。也許你會發現這些有用的。

+0

在這裏看到相關的問題:[如何分區持有R函數的pyspark RDD](http://stackoverflow.com/questions/34669751/) – retrocookie

相關問題