我写了一个Python代码sum.py
在一个目录data
每个csv文件所有数字相加。现在我将在Amazon Web Service(AWS)上使用Apache-Spark,以并行化每个csv文件的求和过程。我已经完成了以下步骤:星火RDD外部存储
- 我在AWS上创建了一个主节点和两个从属节点。
- 我用bash命令
$ scp -r -i my-key-pair.pem my_dir [email protected]_name
上传目录my_dir
到AWS群集的主节点。文件夹my_dir
包含两个子目录:code
和data
,其中,code
包含python代码sum.py
,并且data
包含所有csv文件。 - 我已登录我的AWS主节点,并从那里使用bash命令
$ ./spark/copy-dir /my_dir/code/
将包含sum.py
的代码目录code
发送到所有从节点。 - 在AWS上的主节点,我也把使用
$ ./ephemeral-hdfs/bin/hadoop fs -put /root/my_dir/data/
包含所有CSV文件到HDFS目录data
。
现在,当我在AWS主节点上提交我的应用程序时:$ ./spark-submit ~/my_dir/code/sum.py
,它显示工作节点找不到csv文件的错误。但是,在我使用命令copy-dir
将我的数据目录data
发送到所有从属节点后,一切正常。
所以我对这个问题非常困惑。据我所知,主节点上的驱动程序加载了csv文件,创建了RDD并将单独的任务以及RDD发送到每个从节点。这意味着从节点不需要知道原始的csv文件,因为它们只是从主节点接收RDD。如果这是真的,为什么我应该将所有的csv文件发送到每个从节点?另外,如果我将所有csv文件发送到从节点,将使用从节点上的很多外部磁盘存储。这是否意味着Apache-Spark对并行计算来说是一个非常昂贵的工具?如果有人帮我解决这两个问题,我真的很感激。
感谢您的评论!但似乎我仍然对整个过程的架构感到困惑。我知道主节点上的驱动程序加载了csv文件,创建了RDD并将RDD发送到每个从节点。因此,从节点只接收主节点生成的RDD,然后执行自己的任务,但为什么要将我的csv文件发送到每个从节点? (因为他们已经得到了RDD)另外,正如我在我的问题中提到的,我也在步骤4中将包含所有csv文件的目录'data'放到HDFS中,为什么我必须将所有数据复制到从节点? –
为了让自然变得简单,驱动程序创建了RDD,但RDD不是您放入收藏的数据,而只是关于如何访问它的元数据。作为访问这些数据的手段,从您的驱动程序来看,就是查看本地文件系统,这是由相同元数据驱动的执行程序将执行的操作。 – huitseeker
感谢您的出色答案!似乎在Apache-Spark中,无论我们使用主节点文件系统HDFS还是AWS S3,以后处理的数据集仍占用很多外部存储空间。但我不明白为什么我们称之为内存存储。 –