我曾经在本地运行Spark,并且向节点分发文件从来没有给我造成过问题,但是现在我将事物转移到Amazon集群服务中,事物开始崩溃。基本上,我正在使用Maxmind GeoLiteCity.dat处理一些IP,我将其放置在主服务器上的本地文件系统上(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生成的日志不会显示代码在何处中断。
最佳答案
无需将文件复制到master中,而是将文件加载到s3中并从那里读取
请参阅http://databricks.gitbooks.io/databricks-spark-reference-applications/content/logs_analyzer/chapter2/s3.html以从S3中读取文件。
您需要提供AWS Access Key ID和Secret Key。设置环境变量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