我有apachemesos0.22.1集群(3主5从),在ha配置和spark1.5.1框架中运行clouderahdfs(2.5.0-cdh5.3.1)。
当我尝试spark提交已编译的hdfstest.scala示例应用程序(来自spark 1.5.1源代码)时,它失败了 java.lang.IllegalArgumentException: java.net.UnknownHostException: hdfs
执行器日志出错。只有将hdfs ha path作为参数传递时,才会观察到此错误 hdfs://hdfs/<file>
,当我经过的时候 hdfs://namenode1.hdfs.mesos:50071/tesfile
-一切正常。
在启用跟踪日志记录之后,我发现spark驱动程序实际上读取 hdfs://hdfs
url正确,但spark executor-不正确。
我的scala应用程序代码:
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:
/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文件:
spark.master spark://1.2.3.4:7077
spark.eventLog.enabled true
spark.driver.memory 1g
我的spark-env.sh文件:
export HADOOP_HOME=/opt/spark
export HADOOP_CONF_DIR=/opt/spark/conf
我在/opt/spark目录中的每个从机上都部署了spark。
我可以使用“hdfs dfs-ls”访问hdfshdfs://hdfs/命令,而无需指定活动名称节点地址和端口。
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>
5条答案
按热度按时间3z6pesqy1#
spark将在内部使用fs.defaultfs的默认配置,这是您的本地配置
file://
.为了向hdfs ha致敬,你需要通过这两项考试
core-site.xml
以及hdfs-site.xml
到SparkContext
通过类路径,或如下所示(确保这些文件在相同位置的本地从属节点中可用,例如:/config/core-site.xml
例如,spark 1.xSpark2.x
无论哪种情况,
eivnm1vs2#
我找到了解决办法-添加
至
conf/spark-defaults.conf
在每个从机上解决问题。之后执行者成功下载
core-site.xml
以及hdfs-site.xml
从驱动程序到执行程序。muk1a3rh3#
java.net.UnknownHostException
指示提供名称的主机hdfs
在这种情况下无法解析为ip地址。是什么导致了错误-java.net.unknownhostexception
您可以尝试检查是否解析为ip地址
ping hdfs
.yhqotfr84#
从一个非常基本的intellij项目(不使用
spark-submit
),我验证了这些是应用程序类路径上唯一需要的设置。core-site.xml文件
hdfs-site.xml文件
主.java
你还需要一个
yarn-site.xml
如果你想通过Yarn提交,但我看到你的问题提到mesoszfciruhq5#
必须使用以下命令调用spark submit:
这将正确配置spark。