Spark RDD 外部存储

Spark RDD External Storage

我写了一个 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/ 将包含 sum.py 的代码目录 code 发送到所有从节点节点。
  4. 在 AWS 主节点上,我还使用 $ ./ephemeral-hdfs/bin/hadoop fs -put /root/my_dir/data/.
  5. 将包含所有 csv 文件的目录 data 放入了 HDFS

现在,当我在 AWS 主节点上提交我的应用程序时:$ ./spark-submit ~/my_dir/code/sum.py,它显示工作节点找不到 csv 文件的错误。但是,在我使用命令 copy-dir 将我的数据目录 data 发送到所有从属节点后,一切正常。

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

是的,您必须使数据对所有节点可用。但是,每个节点都会尽量只加载它关心的数据(它的分区),你可以tune the level of parallelism to best fit your task. There are many ways to make this data available to all nodes besides copying it on each node's file system. Consider using a distributed file system, like HDFS, or hosting your files in an accessible location from each node, which includes S3或者一个文件服务器