我已经编写了一个python代码sum.py
,用于汇总目录data
中每个csv文件的所有数字。现在,我将在Amazon Web Service(AWS)上使用Apache-Spark来并行化每个csv文件的求和过程。我已经完成了以下步骤:
$ scp -r -i my-key-pair.pem my_dir root@host_name
将目录my_dir
上传到AWS集群主节点。文件夹my_dir
包含两个子目录:code
和data
,其中code
包含python代码sum.py
,data
包含所有csv文件。$ ./spark/copy-dir /my_dir/code/
将包含code
的代码目录sum.py
发送到所有从属节点。data
将包含所有csv文件的目录$ ./ephemeral-hdfs/bin/hadoop fs -put /root/my_dir/data/
放入HDFS。现在,当我在AWS主节点上提交我的应用程序:$ ./spark-submit ~/my_dir/code/sum.py
时,它会显示一个错误,即工作节点无法找到csv文件。但是,在使用命令data
将数据目录copy-dir
发送到所有从属节点后,一切正常。
所以我对这个问题感到非常困惑。据我所知,主节点上的驱动程序加载csv文件,创建RDD并向每个从节点发送单独的任务以及RDD。这意味着从属节点不需要知道原始csv文件,因为它们只是从主节点接收RDD。如果这是真的,我为什么要将所有的csv文件发送到每个从节点?此外,如果我将所有csv文件发送到从属节点,则将使用从属节点上的大量外部磁盘存储。这是否意味着Apache-Spark是一种非常昂贵的并行计算工具?如果有人帮我解决这两个问题,我真的很感激。
答案 0 :(得分:1)
是的,您必须为所有节点提供数据。但是,每个节点都会尽力只加载它所关注的数据(它的分区),并且tune the level of parallelism可以最适合您的任务。除了在每个节点的文件系统上复制数据之外,还有很多方法可以使这些数据可用于所有节点。考虑使用分布式文件系统,例如HDFS,或者将文件托管在每个节点(包括S3或文件服务器)的可访问位置。