我試圖了解通過名稱服務(連接活動名稱節點 - 高可用性名稱節點)連接 HDFS 集群外部的作業和不作業程式的背景關系。
不作業的程式:
當我讀取兩個組態檔(core-site.xml 和 hdfs-site.xml)并訪問 HDFS 檔案時,它會引發錯誤
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
object HadoopAccess {
def main(args: Array[String]): Unit ={
val hadoopConf = new Configuration(false)
val coreSiteXML = "C:\\Users\\507\\conf\\core-site.xml"
val HDFSSiteXML = "C:\\Users\\507\\conf\\hdfs-site.xml"
hadoopConf.addResource(new Path("file:///" coreSiteXML))
hadoopConf.addResource(new Path("file:///" HDFSSiteXML))
println("hadoopConf : " hadoopConf.get("fs.defaultFS"))
val fs = FileSystem.get(hadoopConf)
val check = fs.exists(new Path("/apps/hive"));
//println("Checked : " check)
}
}
錯誤:我們看到 Unknownhost Exception
hadoopConf:
hdfs://mycluster
Configuration: file:/C:/Users/64507/conf/core-site.xml, file:/C:/Users/64507/conf/hdfs-site.xml
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.IllegalArgumentException: java.net.UnknownHostException: mycluster
at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:378)
at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:310)
at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:176)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:678)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:619)
at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:172)
at HadoopAccess$.main(HadoopAccess.scala:28)
at HadoopAccess.main(HadoopAccess.scala)
Caused by: java.net.UnknownHostException: mycluster
作業程式:我專門將高可用性設定為 hadoopConf 物件并傳遞給 Filesystem 物件,程式作業
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
object HadoopAccess {
def main(args: Array[String]): Unit ={
val hadoopConf = new Configuration(false)
val coreSiteXML = "C:\\Users\\507\\conf\\core-site.xml"
val HDFSSiteXML = "C:\\Users\\507\\conf\\hdfs-site.xml"
hadoopConf.addResource(new Path("file:///" coreSiteXML))
hadoopConf.addResource(new Path("file:///" HDFSSiteXML))
hadoopConf.set("fs.defaultFS", hadoopConf.get("fs.defaultFS"))
//hadoopConf.set("fs.defaultFS", "hdfs://mycluster")
//hadoopConf.set("fs.default.name", hadoopConf.get("fs.defaultFS"))
hadoopConf.set("dfs.nameservices", hadoopConf.get("dfs.nameservices"))
hadoopConf.set("dfs.ha.namenodes.mycluster", "nn1,nn2")
hadoopConf.set("dfs.namenode.rpc-address.mycluster.nn1", "namenode1:8020")
hadoopConf.set("dfs.namenode.rpc-address.mycluster.nn2", "namenode2:8020")
hadoopConf.set("dfs.client.failover.proxy.provider.mycluster",
"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider")
println(hadoopConf)
/* val namenode = hadoopConf.get("fs.defaultFS")
println("namenode: " namenode) */
val fs = FileSystem.get(hadoopConf)
val check = fs.exists(new Path("hdfs://mycluster/apps/hive"));
//println("Checked : " check)
}
}
我們需要為這個配置設定值的任何原因,比如dfs.nameservices,fs.client.failover.proxy.provider.mycluster,dfs.namenode.rpc-address.mycluster.nn1在 hadoopconf 物件中,因為這個值已經存在于 hdfs-site.xml 檔案和 core-site.xml 中。這些配置是高可用性 Namenode 設定。
我通過 Edge 模式或本地 IntelliJ 運行的上述程式。
Hadoop 版本:2.7.3.2 Hortonworks:2.6.1
我在 Spark Scala REPL 中的觀察:
當我這樣做時val hadoopConf = new Configuration(false)。val fs = FileSystem.get(hadoopConf)這給了我本地檔案系統。所以當我在下面執行時
hadoopConf.addResource(new Path("file:///" coreSiteXML))
hadoopConf.addResource(new Path("file:///" HDFSSiteXML))
,現在檔案系統更改為 DFSFileSysyem ..我的假設是 Spark 中的某些客戶端庫在構建期間或邊緣節點公共位置的某個地方不可用。
uj5u.com熱心網友回復:
Spark 中的某些客戶端庫在構建期間或邊緣節點公共位置的某個地方不可用
這個常見的地方是$SPARK_HOME/conf和/或$HADOOP_CONF_DIR。但是,如果您只是java jar使用 IntelliJ 或使用 IntelliJ 運行常規 Scala 應用程式,那么這與 Spark 無關。
...這個值已經存在于 hdfs-site.xml 檔案和 core-site.xml
然后,應該相應地閱讀它們,但是在代碼中覆寫也不應該受到傷害。
這些值是必要的,因為它們指示實際名稱節點運行的位置;否則,它認為mycluster是只有一臺服務器的真實 DNS 名稱,當它不是
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/445657.html
