Hadoop Yarn 高可用配置時的錯誤解決辦法

找不到或無法加載主類 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

配置Yarn ResourceManager 高可用時,遇到了一個坑。
找不到或無法加載主類 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
參考了網上各種解決辦法,運行演示程序 cd $HADOOP_HOME/share/hadoop/mapreduce; hadoop jar hadoop-mapreduce-examples-3.2.0.jar pi 50 100000;ls;

總是報這個錯誤。
肯定是哪裏配置錯了,於是寫了個java 類,先驗證一下,到底路徑上有沒有這個類.

[hadoop@hadoop-namenode1 test]$ more FindClass.java

public class FindClass {

public static void main(String[] args){

ClassLoader classLoader = FindClass.class.getClassLoader();

try {
    Class aClass = classLoader.loadClass("org.apache.hadoop.mapreduce.v2.app.MRAppMaster");
    System.out.println("找到了類 aClass.getName() = " + aClass.getName());
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

}
}

javac FindClass.java
java FindClass

在這裏插入圖片描述

如上圖所示,

[hadoop@hadoop-namenode1 test]$ hadoop classpath
WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX.
/var/server/hadoop/etc/hadoop:/var/server/hadoop/share/hadoop/common/lib/:/var/server/hadoop/share/hadoop/common/:/var/server/hadoop/share/hadoop/hdfs:/var/server/hadoop/share/hadoop/hdfs/lib/:/var/server/hadoop/share/hadoop/hdfs/:/var/server/hadoop/share/hadoop/mapreduce/lib/:/var/server/hadoop/share/hadoop/mapreduce/:/var/server/hadoop/share/hadoop/yarn:/var/server/hadoop/share/hadoop/yarn/lib/:/var/server/hadoop/share/hadoop/yarn/
[hadoop@hadoop-namenode1 test]$ yarn classpath
WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX.
WARNING: YARN_LOG_DIR has been replaced by HADOOP_LOG_DIR. Using value of YARN_LOG_DIR.
/var/server/hadoop/etc/hadoop:/var/server/hadoop/share/hadoop/common/lib/:/var/server/hadoop/share/hadoop/common/:/var/server/hadoop/share/hadoop/hdfs:/var/server/hadoop/share/hadoop/hdfs/lib/:/var/server/hadoop/share/hadoop/hdfs/:/var/server/hadoop/share/hadoop/mapreduce/lib/:/var/server/hadoop/share/hadoop/mapreduce/:/var/server/hadoop/share/hadoop/yarn:/var/server/hadoop/share/hadoop/yarn/lib/:/var/server/hadoop/share/hadoop/yarn/
[hadoop@hadoop-namenode1 test]$

export CLASSPATH=$(hadoop classpath):.
java FindClass
在這裏插入圖片描述

說明類路徑上確實是有這個org.apache.hadoop.mapreduce.v2.app.MRAppMaster類的.

於是認真看了yarn-site.xml
發現重複設置了2次yarn.application.classpath屬性,後面的屬性是空的,把前面的有效屬性覆蓋了,正確的配置如下:

[hadoop@hadoop-namenode1 hadoop]$ more yarn-site.xml
<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<property>
        <name>yarn.application.classpath</name>
        <value>/var/server/hadoop/etc/hadoop:/var/server/hadoop/share/hadoop/common/lib/*:/var/server/hadoop/share/hadoop/common/*:/var/server/hadoop/share/hadoop/hdfs:/var/server/hadoop/share/hadoop/hdfs/lib/*:/var/server/hadoop/share/ha
doop/hdfs/*:/var/server/hadoop/share/hadoop/mapreduce/lib/*:/var/server/hadoop/share/hadoop/mapreduce/*:/var/server/hadoop/share/hadoop/yarn:/var/server/hadoop/share/hadoop/yarn/lib/*:/var/server/hadoop/share/hadoop/yarn/*</value>
</property>
<!-- Site specific YARN configuration properties -->
<!-- 是否啓用日誌聚合.應用程序完成後,日誌彙總收集每個容器的日誌,這些日誌移動到文件系統,例如HDFS. -->
<!-- 用戶可以通過配置"yarn.nodemanager.remote-app-log-dir"、"yarn.nodemanager.remote-app-log-dir-suffix"來確定日誌移動到的位置 -->
<!-- 用戶可以通過應用程序時間服務器訪問日誌 -->

<!-- 啓用日誌聚合功能,應用程序完成後,收集各個節點的日誌到一起便於查看 -->
	<property>
			<name>yarn.log-aggregation-enable</name>
			<value>true</value>
	</property>

<!--開啓resource manager HA,默認爲false-->
<property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
</property>
<!-- 集羣的Id,使用該值確保RM不會做爲其它集羣的active -->
<property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>mycluster</value>
</property>
<!--配置resource manager  命名-->
<property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2,rm3</value>
</property>
<!-- 配置第一臺機器的resourceManager -->
<property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop-namenode1</value>
</property>
<!-- 配置第二臺機器的resourceManager -->
<property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop-namenode2</value>
</property>
<!-- 配置第三臺機器的resourceManager -->
<property>
        <name>yarn.resourcemanager.hostname.rm3</name>
        <value>hadoop-namenode3</value>
</property>

<!-- 配置第一臺機器的resourceManager通信地址 -->
<property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>hadoop-namenode1:8032</value>
</property>
<property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>hadoop-namenode1:8030</value>
</property>
<property>
        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>hadoop-namenode1:8031</value>
</property>
<property>
        <name>yarn.resourcemanager.admin.address.rm1</name>
        <value>hadoop-namenode1:8033</value>
</property>
<property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hadoop-namenode1:8088</value>
</property>

<!-- 配置第二臺機器的resourceManager通信地址 -->
<property>
        <name>yarn.resourcemanager.address.rm2</name>
        <value>hadoop-namenode2:8032</value>
</property>
<property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>hadoop-namenode2:8030</value>
</property>
<property>
        <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
        <value>hadoop-namenode2:8031</value>
</property>
<property>
        <name>yarn.resourcemanager.admin.address.rm2</name>
        <value>hadoop-namenode2:8033</value>
</property>
<property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hadoop-namenode2:8088</value>
</property>
<!-- 配置第三臺機器的resourceManager通信地址 -->
<property>
        <name>yarn.resourcemanager.address.rm3</name>
        <value>hadoop-namenode3:8032</value>
</property>
<property>
        <name>yarn.resourcemanager.scheduler.address.rm3</name>
        <value>hadoop-namenode3:8030</value>
</property>
<property>
        <name>yarn.resourcemanager.resource-tracker.address.rm3</name>
        <value>hadoop-namenode3:8031</value>
</property>
<property>
        <name>yarn.resourcemanager.admin.address.rm3</name>
        <value>hadoop-namenode3:8033</value>
</property>
<property>
        <name>yarn.resourcemanager.webapp.address.rm3</name>
        <value>hadoop-namenode3:8088</value>
</property>
<!--開啓resourcemanager自動恢復功能-->
<property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
</property>
<!--在node1上配置rm1,在node2上配置rm2,注意:一般都喜歡把配置好的文件遠程複製到其它機器上,但這個在YARN的另一個機器上一定要修改,其他機器上不配置此項-->
	<property>
		<name>yarn.resourcemanager.ha.id</name>
		<value>rm1</value>
       <description>If we want to launch more than one RM in single node, we need this configuration</description>
	</property>

	   <!--用於持久存儲的類。嘗試開啓-->
<property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
        <name>hadoop.zk.address</name>
        <value>10.6.1.51:2181,10.6.1.52:2181,10.6.1.53:2181</value>
        <description>For multiple zk services, separate them with comma</description>
</property>
<!--開啓resourcemanager故障自動切換,指定機器-->
<property>
        <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
        <value>true</value>
        <description>Enable automatic failover; By default, it is enabled only when HA is enabled.</description>
</property>
<property>
        <name>yarn.client.failover-proxy-provider</name>
        <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
</property>
<!-- 允許分配給一個任務最大的CPU核數,默認是8 -->
<property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>4</value>
</property>
<!-- 每個節點可用內存,單位MB -->
<property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>12288</value>
</property>
<!-- 單個任務可申請最少內存,默認1024MB -->
<property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value>
</property>
<!-- 單個任務可申請最大內存,默認8192MB -->
<property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>12288</value>
</property>
<!--多長時間聚合刪除一次日誌 此處-->
<property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>2592000</value><!--30 day-->
</property>
<!--時間在幾秒鐘內保留用戶日誌。只適用於如果日誌聚合是禁用的-->
<property>
        <name>yarn.nodemanager.log.retain-seconds</name>
        <value>604800</value><!--7 day-->
</property>
<!--指定文件壓縮類型用於壓縮彙總日誌-->
<property>
        <name>yarn.nodemanager.log-aggregation.compression-type</name>
        <value>gz</value>
</property>
<!-- nodemanager本地文件存儲目錄-->
<property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/var/server/yarn/local</value>
</property>
<!-- resourceManager  保存最大的任務完成個數 -->
<property>
        <name>yarn.resourcemanager.max-completed-applications</name>
        <value>1000</value>
</property>
<!-- 逗號隔開的服務列表,列表名稱應該只包含a-zA-Z0-9_,不能以數字開始-->
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>

<!--rm失聯後重新鏈接的時間-->
<property>
        <name>yarn.resourcemanager.connect.retry-interval.ms</name>
        <value>2000</value>
</property>

</configuration>

echo "一鍵啓動hadoop集羣,替代默認的start-all.sh"
su hadoop
 hdfs zkfc -formatZK -force
 cat $HADOOP_PREFIX/etc/hadoop/datanode-hosts-exclude | xargs -i -t ssh hadoop@{} "rm -rf /var/server/hadoop/tmp/hadoop-hadoop-zkfc.pid;hdfs --daemon start zkfc"

 cat $HADOOP_PREFIX/etc/hadoop/datanode-hosts-exclude | xargs -i -t ssh hadoop@{} "hdfs --daemon start journalnode"

 cat $HADOOP_PREFIX/etc/hadoop/datanode-hosts-exclude | xargs -i -t ssh hadoop@{} "hdfs --daemon start namenode"

 cat $HADOOP_PREFIX/etc/hadoop/slaves | xargs -i -t ssh hadoop@{} "hdfs --daemon  start datanode"

pwd;
 #分2次
 su yarn; 

$HADOOP_PREFIX/sbin/start-yarn.sh
cat $HADOOP_PREFIX/etc/hadoop/slaves | xargs -i -t ssh yarn@{} "yarn --daemon start nodemanager"
pwd;
echo "查看resource manager 高可用是否正常."
                    yarn rmadmin -getServiceState rm1;
                    yarn rmadmin -getServiceState rm2;
                    yarn rmadmin -getServiceState rm3;


                    echo "批量關閉防火牆"

cat $HADOOP_PREFIX/etc/hadoop/datanode-hosts-exclude | xargs -i -t ssh root@{} "systemctl disable firewalld;systemctl stop firewalld"

 cat $HADOOP_PREFIX/etc/hadoop/slaves | xargs -i -t ssh root@{} "systemctl disable firewalld;systemctl stop firewalld"
 
su hadoop
                     echo "運行官方map reduce 實例,測試系統是否正常運行"
                    #cd $HADOOP_HOME/share/hadoop/mapreduce; hadoop jar hadoop-mapreduce-examples-3.0.0-beta1.jar pi 50 100000;ls;
                    cd $HADOOP_HOME/share/hadoop/mapreduce; hadoop jar hadoop-mapreduce-examples-3.2.0.jar pi 50 100000;ls;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章