Apache Spark本地运行拒绝连接错误

时间:2015-07-31 10:07:23

标签: hadoop apache-spark

我在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环境变量,则作业正常。

3 个答案:

答案 0 :(得分:12)

当您使用#update时,Apache Spark使用Hadoop客户端库进行文件访问。这样就可以使用sc.textFilehdfs://路径。您还可以将本地路径用作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以获取更多信息: