分布式工作人员的模糊表现

时间:2018-11-29 10:50:10

标签: dask dask-distributed

我正在尝试确定Spark或Dask是否为我们所做的工作提供了更好的性能。我有一个简单的脚本,可以在DataFrame上运行一些操作。

我不认为我使用的是正确的分布式版本,因为时间比在本地使用dask慢得多。这是我的脚本:

 def CreateTransactionFile(inputFile, client):
     startTime = time.time()
     df = dd.read_csv(inputFile)

     mock = pd.DataFrame([[1,1, datetime.today(), 1,1]], columns=['A', 'B', 'C', 'D', 'E'])

     outDf = df.map_partitions(CreateTransactionFile_Partition, meta=mock)
     outDf.compute()
     print(str(time.time() - startTime))


 if __name__ == '__main__':
     client = Client('10.184.62.61:8786')
     hdfs = 'hdfs://dir/python/test/bigger.csv'
     CreateTransactionFile(hdfs , client)

CreateTransactionFile_Partition在提供的日期范围内使用Pandas和Numpy进行操作,并作为结果返回一个数据帧。

我应该使用compute以外的其他东西吗?上面的代码在700M行CSV(〜30GB)上的运行速度(230s对550s)是在本地计算机上运行速度的两倍。本地测试使用本地文件,而多员工使用HDFS。

1 个答案:

答案 0 :(得分:2)

  

outDf.compute()

这里发生的事情:工作人员正在加载和处理数据分区,然后将结果复制到客户端,并组装到单个内存数据帧中。这种复制需要潜在的昂贵的进程间通信。如果处理是聚合的并且输出很小,那可能就是您想要的。

但是,如果输出很大,则希望使用不带.compute()的dataframe API对工作者进行处理,也许将输出写入带有.to_parquet()的文件中。