報錯緣由: 在運行環境沒有找到fastjson的依賴庫
解決方法: 在SPARK_HOME/jars/ 添加fastjson-VERSION.jar包。 例如個人環境下SPARK_HOME是/usr/local/service/spark/。java
[hadoop@10 ~]$ ls $SPARK_HOME/jars/fast* /usr/local/service/spark/jars/fastjson-1.2.12.jar
這個問題衍生出兩件事,把這兩件事處理完問題便可解決。node
- 不一樣集羣間解析
- 不一樣集羣屬主
先看一下不一樣集羣間解析。要想跨集羣傳輸文件,首先得肯定集羣相互"認識",即集羣間肯定經過ip或者hostname可達。在ip可達的前提下,咱們判斷集羣間是否"認識",則須要檢查hdfs-site.xml中dfs.namenode.datanode.registration.ip-hostname-check這項配置。它表示是否將ip反向解析成主機名,默認爲true。若是未設置這一項,則須要對/etc/hosts添加主機解析,對於HDFS這種規模性集羣來講,這很顯然是比較繁瑣的。mysql
對於不一樣集羣屬主來講,能夠經過修改被傳文件權限或經過添加用戶、附加組使用戶得到文件的讀取權限。web
故障描述:sql
18/11/27 22:53:00 ERROR datanode.DataNode: Initialization failed for Block pool BP-958982478-10.0.220.44-1543329751956 (Datanode Uuid null) service to /10.0.220.44:9100 Datanode denied communication with namenode because hostname cannot be resolved (ip=10.0.220.48, hostname=10.0.220.48): DatanodeRegistration(0.0.0.0:50010, datanodeUuid=1e26933b-35a3-4d3f-8c5f-3ab03f10ca62, infoPort=50075, infoSecurePort=0, ipcPort=50020, storageInfo=lv=-56;cid=CID-1f213b85-b28c-4824-a44c-813c95ce7ecc;nsid=1612667934;c=0) at org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager.registerDatanode(DatanodeManager.java:852) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.registerDatanode(FSNamesystem.java:4486) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.registerDatanode(NameNodeRpcServer.java:1286) at org.apache.hadoop.hdfs.protocolPB.DatanodeProtocolServerSideTranslatorPB.registerDatanode(DatanodeProtocolServerSideTranslatorPB.java:96) at org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos$DatanodeProtocolService$2.callBlockingMethod(DatanodeProtocolProtos.java:28752) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1758) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2213)
問題分析:
首先想到的就是NN與DN通訊出現了問題。可是如題所述"直接使用ip",也就是說不在/etc/hosts作任何配置的前提下能正常工做。這時就須要考慮怎樣在hdfs的配置裏面可以使DN直接經過ip來訪問NN,即禁用對DN的ip作反向域名解析。
解決方法:
在NameNode節點 的 hdfs-site.xml添加以下內容shell
<property> <name>dfs.namenode.datanode.registration.ip-hostname-check</name> <value>false</value> </property>
報錯日誌以下apache
Caused by: java.sql.SQLException: Access denied for user 'hive'@'xx.xx.xx.xx'(using password: YES) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:927) at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1709) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1252) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2488) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2521) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2306) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:839) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49) at sun.reflect.GeneratedConstructorAccessor17.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:421) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:350) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:208) at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:361) at com.jolbox.bonecp.BoneCP.<init>(BoneCP.java:416) ... 71 more
手動鏈接mysql依然鏈接不上,檢查發現鏈接權限不夠,從新受權後,啓動成功。json
在生產環境中可能會遇到退役(下線)服務器需求,對於計算節點來講強制下線節點影響的只是task做業,可是對於HDFS來講,就會出現數據丟失的風險。固然hadoop也提供了平滑下線的機制。服務器
2.1.1 在namenode節點hdfs-site.xml中增長配置,PATH路徑根據本身實際狀況進行修改ide
<property> <name>dfs.hosts.exclude</name> <value>/usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts</value> </property>
2.1.2 在相關文件中添加須要退役的主機
[hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts 10.0.0.1 10.0.0.2
2.1.3 在NameNode 運行如下命令,將通過審覈的DataNode更新至NameNode
[hadoop@10 ~]$ hdfs dfsadmin -refreshNodes
2.1.4 查看下線狀況
hdfs dfsadmin -report
Decomissioning標記的即爲正在下線的DataNode,hadoop集羣會將下線的DataNode數據塊複製到其餘節點。
複製完成以後會變成Decommission Status : Decommissioned。
2.1.5 下線完成後,清空/usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts 文件
[hadoop@10 ~]$ > /usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts
注意: 若是hadoop集羣爲HA,則須要在2個主控節點作相同操做
2.2.1 在RM(ResourceManager)節點yarn-site.xml中增長配置,PATH路徑根據本身實際狀況進行修改
<property> <name>yarn.resourcemanager.nodes.exclude-path</name> <value>/usr/local/service/hadoop/etc/hadoop/yarnexcludedhosts</value> </property>
2.2.2 在相關文件中添加須要退役的主機
[hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/yarnexcludedhosts 10.0.0.1 10.0.0.2
2.2.3 在RM節點 運行如下命令,將通過審覈的NodeManager更新至RM
[hadoop@10 ~]$ yarn rmadmin -refreshNodes
2.2.4 下線完成後,在nodes include文件中去掉下線的機器,並清空exclude 文件
#yarn-site.xml 中nodes include 配置路徑,路徑根據本身實際狀況 <property> <name>yarn.resourcemanager.nodes.include-path</name> <value>/usr/local/service/hadoop/etc/hadoop/yarnhosts</value> </property>
[hadoop@10 hadoop]$ > /usr/local/service/hadoop/etc/hadoop/yarnexcludedhosts
注意: 若是hadoop集羣爲HA,則須要在2個主控節點作相同操做
2.3.1 修改dfs.hosts對應配置文件,添加須要上線的機器
[hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/hdfshosts 10.0.100.53 10.0.100.52
2.3.2 在NameNode節點運行如下命令,將通過審覈的datanode更新至namenode
[hadoop@10 ~]$ hdfs dfsadmin -refreshNodes
2.3.3 檢查是否上線成功
hdfs dfsadmin -report
注意: 若是hadoop集羣爲HA,則須要在2個主控節點作相同操做
2.4.1 在nodes include文件中添加須要上線的機器
#yarn-site.xml 中nodes include 配置路徑,路徑根據本身實際狀況 <property> <name>yarn.resourcemanager.nodes.include-path</name> <value>/usr/local/service/hadoop/etc/hadoop/yarnhosts</value> </property>
[hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/yarnhosts 10.0.100.53 10.0.100.52
2.4.2 在RM節點 運行如下命令,將通過審覈的NodeManager更新至RM
[hadoop@10 ~]$ yarn rmadmin -refreshNodes
注意: 若是hadoop集羣爲HA,則須要在2個主控節點作相同操做