2017-05-05 52 views
1

初學者問題了一點,但我沒能找到這個相關答案..加載客戶端從本地文件到DASK分佈式集羣

本質上我的有關數據(7GB)位於我的本地機器上。我有分佈式羣集在本地網絡上運行。我怎樣才能把這個文件放到集羣上?

通常的dd.read_csv()或read_parquet()失敗,因爲工作人員無法在自己的環境中找到該文件。

我需要手動將文件傳輸到羣集中的每個節點嗎?

注:由於管理的限制,我僅限於SFTP ...

+1

讓羣集節點通過網絡協議訪問它。根據網絡的不同,您可以使用本地計算機的UNC路徑或NFS掛載,或者在您的盒子上設置小型Web服務器。 –

+0

@AustinHastings啊,這工作正常!感謝您的幫助...使用HFS現在服務文件 –

回答

1

兩個選項

網絡文件系統

正如評論所說,有各種方法可以讓你的本地文件羣集中的其他機器可以使用普通的文件系統解決方案訪問它如果您可以訪問,這是一個很好的選擇。

負載和散射本地

如果不工作,然後你總是可以在本地加載數據,撒出羣集的各種工人。如果你的文件比單臺電腦的內存大,那麼你可能需要一塊一塊地做這件事。

單通道

如果一切都裝入內存,那麼我會正常加載數據,然後撒了一個工人。你可以事後拆分出來,如果需要,它蔓延到其他工人:

import pandas 
import dask.dataframe as dd 
from dask.distributed import Client 

client = Client('scheduler-address:8786') 

df = pd.read_csv('myfile.csv') 
future = client.scatter(df) # send dataframe to one worker 
ddf = dd.from_delayed([future], meta=df) # build dask.dataframe on remote data 
ddf = ddf.repartition(npartitions=20).persist() # split 
client.rebalance(ddf) # spread around all of your workers 

多位

如果你有多個小文件,那麼你可以反覆裝載和散射,也許是在一個for循環,然後使dask.dataframe許多期貨

futures = [] 
for fn in filenames: 
    df = pd.read_csv(fn) 
    future = client.scatter(df) 
    futures.append(future) 

ddf = dd.from_delayed(futures, meta=df) 

在這種情況下,你很可能跳過再分配和再平衡步驟

如果你有罪過GLE大文件,那麼你可能需要做的是自己的一些分裂,無論是與pd.read_csv(..., chunksize=...)

+0

感謝使用分散的方法精美地工作! –

0

網絡解決方案:

  • 在Windows下僅使用,應共享forlder作品:dd.read_csv(「\ \服務器\ shared_dir「)

  • 在Unix/Linux的只有它應與HDFS的工作原理:進口hdfs3然後hdfs.read_csv( '/服務器/ DATA_DIR' ...)

但是,如果您想同時使用Windows和Linux工作人員,我不知道,因爲具有UNC的dd.read_csv()在Linux下似乎不受支持(因爲文件路徑爲\ server \ data_dir),並且帶有hdfs.read_csv的HDFS在Windows下不工作(導入hdfs3失敗,因爲lib libhdfs3。所以在Windows下不存在)

有沒有人有Windows和Unix下的工作者的網絡解決方案?

相關問題