Spark RDD外部存储

时间:2015-07-21 20:54:45

标签: csv amazon-web-services apache-spark rdd master-slave

我已经编写了一个python代码sum.py,用于汇总目录data中每个csv文件的所有数字。现在,我将在Amazon Web Service(AWS)上使用Apache-Spark来并行化每个csv文件的求和过程。我已经完成了以下步骤:

  1. 我在AWS上创建了一个主节点和两个从节点。
  2. 我使用bash命令$ scp -r -i my-key-pair.pem my_dir root@host_name将目录my_dir上传到AWS集群主节点。文件夹my_dir包含两个子目录:codedata,其中code包含python代码sum.pydata包含所有csv文件。
  3. 我已登录我的AWS主节点,并从那里使用bash命令$ ./spark/copy-dir /my_dir/code/将包含code的代码目录sum.py发送到所有从属节点。
  4. 在AWS主节点上,我还使用data将包含所有csv文件的目录$ ./ephemeral-hdfs/bin/hadoop fs -put /root/my_dir/data/放入HDFS。
  5. 现在,当我在AWS主节点上提交我的应用程序:$ ./spark-submit ~/my_dir/code/sum.py时,它会显示一个错误,即工作节点无法找到csv文件。但是,在使用命令data将数据目录copy-dir发送到所有从属节点后,一切正常。

    所以我对这个问题感到非常困惑。据我所知,主节点上的驱动程序加载csv文件,创建RDD并向每个从节点发送单独的任务以及RDD。这意味着从属节点不需要知道原始csv文件,因为它们只是从主节点接收RDD。如果这是真的,我为什么要将所有的csv文件发送到每个从节点?此外,如果我将所有csv文件发送到从属节点,则将使用从属节点上的大量外部磁盘存储。这是否意味着Apache-Spark是一种非常昂贵的并行计算工具?如果有人帮我解决这两个问题,我真的很感激。

1 个答案:

答案 0 :(得分:1)

是的,您必须为所有节点提供数据。但是,每个节点都会尽力只加载它所关注的数据(它的分区),并且tune the level of parallelism可以最适合您的任务。除了在每个节点的文件系统上复制数据之外,还有很多方法可以使这些数据可用于所有节点。考虑使用分布式文件系统,例如HDFS,或者将文件托管在每个节点(包括S3或文件服务器)的可访问位置。