2015-07-21 86 views
2

我写了一个Python代码sum.py在一个目录data每个csv文件所有数字相加。现在我将在Amazon Web Service(AWS)上使用Apache-Spark,以并行化每个csv文件的求和过程。我已经完成了以下步骤:星火RDD外部存储

  1. 我在AWS上创建了一个主节点和两个从属节点。
  2. 我用bash命令$ scp -r -i my-key-pair.pem my_dir [email protected]_name上传目录my_dir到AWS群集的主节点。文件夹my_dir包含两个子目录:codedata,其中,code包含python代码sum.py,并且data包含所有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/包含所有CSV文件到HDFS目录data

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

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

回答

1

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

+0

感谢您的评论!但似乎我仍然对整个过程的架构感到困惑。我知道主节点上的驱动程序加载了csv文件,创建了RDD并将RDD发送到每个从节点。因此,从节点只接收主节点生成的RDD,然后执行自己的任务,但为什么要将我的csv文件发送到每个从节点? (因为他们已经得到了RDD)另外,正如我在我的问题中提到的,我也在步骤4中将包含所有csv文件的目录'data'放到HDFS中,为什么我必须将所有数据复制到从节点? –

+1

为了让自然变得简单,驱动程序创建了RDD,但RDD不是您放入收藏的数据,而只是关于如何访问它的元数据。作为访问这些数据的手段,从您的驱动程序来看,就是查看本地文件系统,这是由相同元数据驱动的执行程序将执行的操作。 – huitseeker

+0

感谢您的出色答案!似乎在Apache-Spark中,无论我们使用主节点文件系统HDFS还是AWS S3,以后处理的数据集仍占用很多外部存储空间。但我不明白为什么我们称之为内存存储。 –