我在OS X上安装了Spark和Hadoop。我成功地完成了一个示例,其中Hadoop在本地运行,文件存储在HDFS中,我运行了火花
spark-shell --master yarn-client
并从shell中使用HDFS。但是,我遇到了问题,试图让Spark在没有HDFS的情况下运行,就在我的机器上本地运行。我查看了this answer但是当Spark documentation说
时,它并没有感觉到正确处理环境变量在一台机器上本地运行很容易 - 你需要的就是拥有java 安装在您的系统PATH或JAVA_HOME环境变量上 指向Java安装。
如果我运行基本SparkPi
示例,我会得到正确的输出。
如果我尝试再次运行示例Java应用程序they provide,我会得到输出,但这次连接被拒绝错误与端口9000 有关,听起来它试图连接到 Hadoop ,但我不知道为什么,因为我没有指明
$SPARK_HOME/bin/spark-submit --class "SimpleApp" --master local[4] ~/study/scala/sampleJavaApp/target/simple-project-1.0.jar
Exception in thread "main" java.net.ConnectException: Call From 37-2-37-10.tssg.org/10.37.2.37 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
...
...
...
org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:604)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:699)
at org.apache.hadoop.ipc.Client$Connection.access(Client.java:367)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1462)
at org.apache.hadoop.ipc.Client.call(Client.java:1381)
... 51 more
15/07/31 11:05:06 INFO spark.SparkContext: Invoking stop() from shutdown hook
15/07/31 11:05:06 INFO handler.ContextHandler: stopped o.s.j.s.ServletContextHandler{/metrics/json,null}
...
...
...
15/07/31 11:05:06 INFO ui.SparkUI: Stopped Spark web UI at http://10.37.2.37:4040
15/07/31 11:05:06 INFO scheduler.DAGScheduler: Stopping DAGScheduler
15/07/31 11:05:06 INFO spark.MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
15/07/31 11:05:06 INFO util.Utils: path = /private/var/folders/cg/vkq1ghks37lbflpdg0grq7f80000gn/T/spark-c6ba18f5-17a5-4da9-864c-509ec855cadf/blockmgr-b66cc31e-7371-472f-9886-4cd33d5ba4b1, already present as root for deletion.
15/07/31 11:05:06 INFO storage.MemoryStore: MemoryStore cleared
15/07/31 11:05:06 INFO storage.BlockManager: BlockManager stopped
15/07/31 11:05:06 INFO storage.BlockManagerMaster: BlockManagerMaster stopped
15/07/31 11:05:06 INFO scheduler.OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
15/07/31 11:05:06 INFO spark.SparkContext: Successfully stopped SparkContext
15/07/31 11:05:06 INFO util.Utils: Shutdown hook called
15/07/31 11:05:06 INFO util.Utils: Deleting directory /private/var/folders/cg/vkq1ghks37lbflpdg0grq7f80000gn/T/spark-c6ba18f5-17a5-4da9-864c-509ec855cadf
任何关于我出错的指示/解释都会非常感激!
似乎我设置环境变量HADOOP_CONF_DIR
的事实导致了一些问题。在该目录下,我有core-site.xml
,其中包含以下内容
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
如果我更改了值,例如<value>hdfs://localhost:9100</value>
然后当我尝试运行spark作业时,连接拒绝错误引用此更改的端口
Exception in thread "main" java.net.ConnectException: Call From 37-2-37-10.tssg.org/10.37.2.37 to localhost:9100 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
因此,出于某种原因,尽管指示它在本地运行,但它正在尝试连接到HDFS。如果我删除HADOOP_CONF_DIR
环境变量,则作业正常。
答案 0 :(得分:12)
当您使用#update
时,Apache Spark使用Hadoop客户端库进行文件访问。这样就可以使用sc.textFile
或hdfs://
路径。您还可以将本地路径用作s3n://
。
如果指定不带架构的文件名,则使用file:/home/robocode/foo.txt
。它默认为fs.default.name
,但您明确将其覆盖到file:
中的hdfs://localhost:9000
。因此,如果您没有指定架构,那么它会尝试从HDFS读取。
最简单的解决方案是指定架构:
core-site.xml
答案 1 :(得分:3)
我有同样的错误,HADOOP_CONF_DIR已定义,所以我只是取消设置环境变量。
unset HADOOP_CONF_DIR
答案 2 :(得分:1)
我认为之前为Hadoop相关示例定义的环境变量仍在干扰您的测试。
鉴于您使用的是官方Spark Java示例:
public static void main(String[] args) {
String logFile = "YOUR_SPARK_HOME/README.md"; // Should be some file on your system
SparkConf conf = new SparkConf().setAppName("Simple Application");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> logData = sc.textFile(logFile).cache();
...
}
我建议明确地设置Master,否则采用默认值。
SparkConf conf = new SparkConf().setMaster("local").setAppName("Simple Application")
查看SparkConf doc以获取更多信息: