我正在尝试确定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。
答案 0 :(得分:2)
outDf.compute()
这里发生的事情:工作人员正在加载和处理数据分区,然后将结果复制到客户端,并组装到单个内存数据帧中。这种复制需要潜在的昂贵的进程间通信。如果处理是聚合的并且输出很小,那可能就是您想要的。
但是,如果输出很大,则希望使用不带.compute()
的dataframe API对工作者进行处理,也许将输出写入带有.to_parquet()
的文件中。