【问题标题】:Apache Spark Running Locally Giving Refused Connection ErrorApache Spark 在本地运行时出现拒绝连接错误
【发布时间】:2015-07-31 10:07:23
【问题描述】:

我在 OS X 上安装了 Spark 和 Hadoop。我成功完成了一个示例,其中 Hadoop 在本地运行,文件存储在 HDFS 中,然后我运行 spark

spark-shell --master yarn-client

并且在 shell 中使用 HDFS。但是,我遇到了问题,试图让 Spark 在没有 HDFS 的情况下运行,只是在我的机器上本地运行。我查看了this answer,但是当Spark documentation 说时,它感觉不正确地处理环境变量

在一台机器上本地运行很容易——你只需要拥有 java 安装在系统 PATH 或 JAVA_HOME 环境变量上 指向 Java 安装。

如果我运行基本的SparkPi 示例,我会得到正确的输出。

如果我再次尝试运行示例 Java 应用程序 they provide,我会得到输出,但这次出现与 port 9000 相关的 connection denied 错误,听起来像它正在尝试连接到 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> 

如果我更改值,例如&lt;value&gt;hdfs://localhost:9100&lt;/value&gt; 然后当我尝试运行 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 环境变量,则工作正常。

【问题讨论】:

  • 您是否也在工作中设置主配置?
  • 我不确定您的意思(这可能表明它为什么不起作用!)。我只是运行命令$SPARK_HOME/bin/spark-submit --class "SimpleApp" --master local[4] ~/study/scala/sampleJavaApp/target/simple-project-1.0.jar
  • 如何在 Java 项目中设置 SparkContext?
  • 我正在使用确切的官方 Spark Java 示例here
  • 你的 core-site.xml 在哪里

标签: hadoop apache-spark


【解决方案1】:

当您使用sc.textFile 时,Apache Spark 使用 Hadoop 客户端库进行文件访问。例如,这使得使用hdfs://s3n:// 路径成为可能。您也可以使用本地路径为file:/home/robocode/foo.txt

如果您指定没有架构的文件名,则使用fs.default.name。它默认为file:,但您在core-site.xml 中将其显式覆盖为hdfs://localhost:9000。因此,如果您不指定架构,它会尝试从 HDFS 读取。

最简单的解决方案是指定架构:

JavaRDD<String> logData = sc.textFile("file:/home/robocode/foo.txt").cache();

【讨论】:

    【解决方案2】:

    我遇到了同样的错误,HADOOP_CONF_DIR 已定义,所以我只是取消设置环境变量。

    unset HADOOP_CONF_DIR
    

    【讨论】:

      【解决方案3】:

      我认为您之前为 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了解更多信息:

      【讨论】:

      • 我刚刚尝试了您的建议,但即使明确设置了 master,由于设置了 HADOOP_CONF_DIR,它仍在尝试与 HDFS 通信。我知道我可以根据需要取消设置和设置环境变量,但必须有更明智的方式
      猜你喜欢
      • 2015-10-16
      • 1970-01-01
      • 2012-06-25
      • 2017-07-22
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      相关资源
      最近更新 更多