鉴于,我有一个分布式集群:
import distributed
import dask
(distributed.__version__, dask.__version__)
('1.12.1', '0.11.0')
import dask
from distributed import Executor, progress
import dask.dataframe as dd
e = Executor('127.0.0.1:8786',set_as_default=True)
e
<Executor: scheduler="127.0.0.1:8786" processes=2 cores=64>
我创建了一个大型分布式数据框和一个小型数据框,并将其保存到集群中:
large_df = dd.read_csv('s3://bucket/*.csv', parse_dates=['date']) #test is about 50gb
small_df = dd.read_csv('s3://new_bucket/combined_driver_cleaned.csv',blocksize=None) #about 2 gb
large_df = e.persist(large_df)
small_df = e.persist(small_df)
为了使合并步骤更快,我会复制所有工作人员的小数据框
e.replicate(small_df)
e.replicate
迅速返回。
然后是加入步骤:
joined = e.persist(large_df.merge(small_df, how='inner', on='join_col'))
del large_df
此时,奇怪的事情开始发生。散景图显示没有活动,并且停留在0/251合并任务。工作日志显示以下内容:
Sep 07 12:43:55 conda[41833]: distributed.core - INFO - Connection from xx.xxx.xxx.xx:48522 to Worker
ip地址是上述连接中的调度程序机器。我怀疑这是由e.replicate
命令引起的。
我可以看到工作节点的内存缓慢增长(顶部命令输出):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
41944 root 20 0 0.175t 0.165t 6104 S 105.3 70.6 9:03.16 dask-work+
这使用了70%的240gb内存,而我的两个数据帧相比要小得多。
这样做的推荐方法是什么?我相信复制占用了所有的空间和很长一段时间。我做了一些根本错误的事情吗?