首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从spark作业访问HDFS HA (UnknownHostException错误)

从spark作业访问HDFS HA (UnknownHostException错误)
EN

Stack Overflow用户
提问于 2015-10-16 23:37:19
回答 5查看 13.9K关注 0票数 9

我有Apache Mesos 0.22.1集群(3主5从),在HA配置和Spark 1.5.1框架中运行Cloudera HDFS (2.5.0-cdh5.3.1)。

当我尝试spark-submit编译的HdfsTest.scala示例应用程序(来自Spark 1.5.1源代码)时,它失败了,在执行器日志中出现了java.lang.IllegalArgumentException: java.net.UnknownHostException: hdfs错误。只有当我将HDFS路径作为参数hdfs://hdfs/<file>传递时,当我传递hdfs://namenode1.hdfs.mesos:50071/tesfile时,才能观察到这个错误-一切正常。

在启用跟踪日志后,我发现Spark驱动程序实际上可以正确读取hdfs://hdfs地址,但Spark executor -不能。

我的Scala应用程序代码:

代码语言:javascript
运行
复制
import org.apache.spark._
object HdfsTest {
  def main(args: Array[String]) {
    val sparkConf = new SparkConf().setAppName("HdfsTest")
    val sc = new SparkContext(sparkConf)
    val file = sc.textFile(args(0))
    val mapped = file.map(s => s.length).cache()
    for (iter <- 1 to 10) {
      val start = System.currentTimeMillis()
      for (x <- mapped) { x + 2 }
      val end = System.currentTimeMillis()
      println("Iteration " + iter + " took " + (end-start) + " ms")
    }
    sc.stop()
   }
  }

我编译了这段代码,并以集群模式将jar文件提交给Spark:

代码语言:javascript
运行
复制
/opt/spark/bin/spark-submit --deploy-mode cluster --class com.cisco.hdfs.HdfsTest http://1.2.3.4/HdfsTest-0.0.1.jar hdfs://hdfs/testfile

我的spark-defaults.conf文件:

代码语言:javascript
运行
复制
spark.master                     spark://1.2.3.4:7077
spark.eventLog.enabled           true
spark.driver.memory              1g

我的spark-env.sh文件:

代码语言:javascript
运行
复制
export HADOOP_HOME=/opt/spark
export HADOOP_CONF_DIR=/opt/spark/conf

我在/opt/spark目录中的每个从服务器上部署了spark。

我可以在控制台中使用"hdfs dfs -ls hdfs:// HDFS /“命令访问hdfs,而不需要指定active namenode地址和端口。

代码语言:javascript
运行
复制
core-site.xml:
----------------------------------------------------------------------
<configuration>
 <property>
  <name>fs.default.name</name>
  <value>hdfs://hdfs</value>
 </property>
</configuration>

hdfs-site.xml:
----------------------------------------------------------------------
<configuration>
 <property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
 </property>

 <property>
  <name>dfs.nameservice.id</name>
  <value>hdfs</value>
 </property>

 <property>
  <name>dfs.nameservices</name>
  <value>hdfs</value>
 </property>

 <property>
  <name>dfs.ha.namenodes.hdfs</name>
  <value>nn1,nn2</value>
 </property>

 <property>
  <name>dfs.namenode.rpc-address.hdfs.nn1</name>
  <value>namenode1.hdfs.mesos:50071</value>
 </property>

 <property>
  <name>dfs.namenode.http-address.hdfs.nn1</name>
  <value>namenode1.hdfs.mesos:50070</value>
 </property>

 <property>
  <name>dfs.namenode.rpc-address.hdfs.nn2</name>
  <value>namenode2.hdfs.mesos:50071</value>
 </property>

 <property>
  <name>dfs.namenode.http-address.hdfs.nn2</name>
  <value>namenode2.hdfs.mesos:50070</value>
 </property>

 <property>
  <name>dfs.client.failover.proxy.provider.hdfs</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider      </value>
 </property>

 <property>
  <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://journalnode1.hdfs.mesos:8485;journalnode2.hdfs.mesos:8485;journalnode3.hdfs.mesos:8485/hdfs</value>
   </property>

 <property>
   <name>ha.zookeeper.quorum</name>
   <value>master.mesos:2181</value>
 </property>

 <property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/lib/hdfs/data/jn</value>
 </property>

 <property>
   <name>dfs.namenode.name.dir</name>
   <value>file:///var/lib/hdfs/data/name</value>
 </property>

 <property>
   <name>dfs.datanode.data.dir</name>
   <value>file:///var/lib/hdfs/data/data</value>
 </property>

 <property>
  <name>dfs.ha.fencing.methods</name>
  <value>shell(/bin/true)</value>
 </property>

 <property>
  <name>dfs.permissions</name>
  <value>false</value>
 </property>

 <property>
  <name>dfs.datanode.du.reserved</name>
  <value>10485760</value>
 </property>

 <property>
  <name>dfs.datanode.balance.bandwidthPerSec</name>
  <value>41943040</value>
 </property>

 <property>
   <name>dfs.namenode.safemode.threshold-pct</name>
   <value>0.90</value>
 </property>

 <property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>60000</value>
 </property>

 <property>
  <name>dfs.datanode.handler.count</name>
  <value>10</value>
 </property>

 <property>
  <name>dfs.namenode.handler.count</name>
  <value>20</value>
 </property>

 <property>
  <name>dfs.image.compress</name>
  <value>true</value>
 </property>

 <property>
  <name>dfs.image.compression.codec</name>
  <value>org.apache.hadoop.io.compress.SnappyCodec</value>
 </property>

 <property>
  <name>dfs.namenode.invalidate.work.pct.per.iteration</name>
  <value>0.35f</value>
 </property>

 <property>
  <name>dfs.namenode.replication.work.multiplier.per.iteration</name>
  <value>4</value>
 </property>

 <property>
  <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
  <value>false</value>
 </property>

 <property>
   <name>dfs.client.read.shortcircuit</name>
   <value>true</value>
 </property>

 <property>
  <name>dfs.client.read.shortcircuit.streams.cache.size</name>
  <value>1000</value>
 </property>

 <property>
  <name>dfs.client.read.shortcircuit.streams.cache.size.expiry.ms</name>
   <value>1000</value>
 </property>

 <property>
  <name>dfs.domain.socket.path</name>
  <value>/var/run/hadoop-hdfs/dn._PORT</value>
 </property>
</configuration>
EN

回答 5

Stack Overflow用户

发布于 2015-10-21 17:50:59

我已经找到了解决方案--添加

代码语言:javascript
运行
复制
spark.files file:///opt/spark/conf/hdfs-site.xml,file:///opt/spark/conf/core-site.xml

在每个从服务器上执行conf/spark-defaults.conf命令可以解决此问题。

之后,执行器成功地将core-site.xmlhdfs-site.xml从驱动程序下载到执行器程序。

票数 5
EN

Stack Overflow用户

发布于 2017-07-21 05:29:03

Spark内部将使用可用于fs.defaultFS的默认配置文件,这是您本地的file://

为了支持HDFS,您需要通过CLASSPATH将core-site.xmlhdfs-site.xml传递给SparkContext,或者如下所示(确保这些文件在相同位置的本地从节点中可用,例如:/config/core-site.xml

例如,Spark 1.x

代码语言:javascript
运行
复制
val sc = new SparkContext(sparkConf)

Spark 2.x

代码语言:javascript
运行
复制
SparkSession sparkSession = SparkSession.builder().config(sparkConf).getOrCreate();
val sc = sparkSession.sparkContext()

不管是哪种情况,

代码语言:javascript
运行
复制
sc.hadoopConfiguration().addResource(new org.apache.hadoop.fs.Path("/config/core-site.xml"));
sc.hadoopConfiguration().addResource(new org.apache.hadoop.fs.Path("/config/hdfs-site.xml"));
票数 4
EN

Stack Overflow用户

发布于 2016-12-08 08:06:40

需要使用以下命令调用spark-submit:

代码语言:javascript
运行
复制
HADOOP_CONF_DIR=/etc/hadoop/conf spark-submit

这将正确配置spark。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33174386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档