Spark将本地文件从主节点分发到节点

时间:2015-08-14 09:00:45

标签: hadoop amazon-web-services apache-spark

我曾经在本地运行Spark并将文件分发到节点从来没有给我带来任何问题,但现在我正在将事情转移到Amazon集群服务,事情开始崩溃。基本上,我使用Maxmind GeoLiteCity.dat处理一些IP,我将它放在master上的本地文件系统上(file:///home/hadoop/GeoLiteCity.dat)。

根据前面的问题,我使用了sc.addFile:

sc.addFile("file:///home/hadoop/GeoLiteCity.dat")

并使用以下内容调用它:

val ipLookups = IpLookups(geoFile = Some(SparkFiles.get("GeoLiteCity.dat")), memCache = false, lruCache = 20000)

这在我的计算机上本地运行时有效,但似乎在群集上失败(我不知道失败的原因,但如果有人能告诉我如何显示该过程的日志,我将不胜感激,从Amazon服务生成的日志不包含有关哪个步骤失败的任何信息。

我是否必须以某种方式将GeoLiteCity.dat加载到HDFS上?是否有其他方法可以将本地文件从主服务器分发到没有HDFS的节点?

编辑:只是为了指定我运行的方式,我编写了一个执行多个步骤的json文件,第一步是运行一个bash脚本,将GeoLiteCity.dat从Amazon S3传输到主服务器:

#!/bin/bash
cd /home/hadoop
aws s3 cp s3://test/GeoLiteCity.dat GeoLiteCity.dat

在检查文件是否在目录中之后,json然后执行Spark Jar,但是失败了。 Amazon Web UI生成的日志不会显示代码中断的位置。

1 个答案:

答案 0 :(得分:1)

不是将文件复制到master中,而是将文件加载到s3中并从那里读取

请参阅http://databricks.gitbooks.io/databricks-spark-reference-applications/content/logs_analyzer/chapter2/s3.html以阅读S3中的文件。

您需要提供AWS访问密钥ID和密钥。设置环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,或者以编程方式设置它,

sc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", YOUR_ACCESS_KEY)
sc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", YOUR_SECRET_KEY)

然后您可以将文件作为文本文件读取。像,

 sc.textFile(s3n://test/GeoLiteCity.dat)

补充参考: How to read input from S3 in a Spark Streaming EC2 cluster application https://stackoverflow.com/a/30852341/4057655