我曾经在本地运行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生成的日志不会显示代码中断的位置。
答案 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