1、環境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作為active主機,data1作為standby備用機,三台機器均作為數據節點,yarn資源管理器在master上開啟,在data1上備用,data1上開啟歷史伺服器 主要參考見下表 Data ...
1、環境
centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8
master作為active主機,data1作為standby備用機,三台機器均作為數據節點,yarn資源管理器在master上開啟,在data1上備用,data1上開啟歷史伺服器
主要參考見下表
master | 192.168.1.215 | Namenode DataNode QuorumPeerMain ZKFC JournalNode ResourceManager NodeManager |
data1 | 192.168.1.218 | Namenode DataNode QuorumPeerMain ZKFC JournalNode ResourceManager NodeManager JobHistoryServer ApplicationHistoryServer |
data2 | 192.168.1.219 |
DataNode QuorumPeerMain JournalNode NodeManager |
2、zookeeper集群的搭建
安裝到/usr/Apache目錄下,所有者與所屬組均為hadoop
tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/Apache/ ln -s zookeeper-3.4.9/ zookeeper cd zookeeper/conf
# 配置文件
cp zoo_sample.cfg zoo.cfg
# 編輯zoo.cfg的內容
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/Apache/zookeeper/data dataLogDir=/usr/Apache/zookeeper/data/log # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature autopurge.purgeInterval=1 # server.1=master:2888:3888 server.2=data1:2888:3888 server.3=data2:2888:3888
一般採用預設值,重點是標藍的地方。
數據的路徑單獨設,將日誌分開,並且,不要放到預設的tmp文件夾下麵,因為這個會定期刪除
dataDir=/usr/Apache/zookeeper/data dataLogDir=/usr/Apache/zookeeper/data/log
將快照打開,並且設置autopurge.purgeInterval=1,與上面的不同,快照需要定期刪除
增大客戶端的連接數量maxClientCnxns=60
先安裝到master下麵,之後進行分發
scp -r zookeeper-3.4.9 data1:usr/Apache/ scp -r zookeeper-3.4.9 data2:usr/Apache/ # 註意所屬組與所有者 chown -R hadoop:hadoop zookeeper
# 分別在三台機器的/usr/Apache/zookeeper/data目錄下建立myid文件,分別寫入數字1、2、3,這點很重要
cd /usr/Apache/zookeeper/data/
touch myid # 三台機器分別啟動 zkServer.sh start # 查看狀態 zkServer.sh status # 最後,檢查,關閉一個看是否自動選舉
3、hadoop以及yarn的高可用配置
先前安裝過,主要是配置文件的修改,註意,如果不重新安裝,需要刪除一些文件 rm -rf tmp/* data/nn/* data/jn/* data/dn/* data/dn/* logs/*
上面的data/nn data/jn data/dn data/dn 是自己建的一些文件,用於節點數據的存放。
重新安裝也不麻煩,此處選擇重新安裝,目錄選擇/usr/Apache,所有者與所屬組均為hadoop,環境變數如下:
更改環境變數,hadoop用戶下麵的~/.bashrc文件 export HADOOP_HOME=/usr/Apache/hadoop export ZOOKEEPER_HOME=/usr/Apache/zookeeper export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin # 之後 source ~/.bashrc
下麵關鍵看配置
1> core-site.xml
<configuration> <!--緩存文件存儲的路徑,可以這樣寫file:/opt/mdisk/disk02/data/tmp,file:/opt/mdisk/disk01/data/tmp--> <!--如果掛載多個數據盤,用逗號分開--> <!--配置緩存文件的目錄,註意另建新的文件夾tmp,不要在hadoop/tmp下,因為會定期刪除--> <property> <name>hadoop.tmp.dir</name> <value>/usr/Apache/hadoop/data/tmp</value> <description>A base for other temporary directories.</description> </property> <!--指定nameservice的名稱,自定義,但後面必須保持一致--> <property> <name>fs.defaultFS</name> <value>hdfs://nscluster</value> </property> <!-- 編輯日誌文件存儲的路徑,這個也可以放到hdfs-site.xml中 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/Apache/hadoop/data/jn</value> </property> <!--文件讀寫緩存大小,此處為128kb--> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <!--指定zookeeper地址,配置HA時需要,這個也可以放到hdfs-site.xml中--> <!--<property> <name>ha.zookeeper.quorum</name> <value>master:2181,data1:2181,data2:2181</value> </property>--> <!--以下不是必須的--> <!--配置hdfs文件被永久刪除前保留的時間(單位:分鐘),預設值為0表明垃圾回收站功能關閉--> <!--<property> <name>fs.trash.interval</name> <value>0</value> </property>--> <!--指定可以在任何IP訪問--> <!--<property> <name>hadoop.proxyuser.hduser.hosts</name> <value>*</value> </property>--> <!--指定所有用戶可以訪問--> <!--<property> <name>hadoop.proxyuser.hduser.groups</name> <value>*</value> </property>--> </configuration>
這裡要註意hadoop.tmp.dir這個屬性,上面的註釋也已經說了,一定不要放到暫時的hadoop/tmp中,而要放到永久的文件夾中,否則namenode的啟動可能遇到問題。
上面一些註釋掉的屬性不是必須的,下麵一樣。
2> hdfs-site.xml
註意下麵的nscluster是自定義的名稱,並且被應用於多個屬性中,部署使用時更改樣式
<configuration> <!--指定hdfs元數據存儲的路徑--> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/Apache/hadoop/data/nn</value> </property> <!--指定hdfs數據存儲的路徑--> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/Apache/hadoop/data/dn</value> </property> <!--開啟WebHDFS功能(基於REST的介面服務)--> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <!-- 數據備份的個數 --> <property> <name>dfs.replication</name> <value>3</value> </property> <!--關閉許可權驗證 --> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!--DateNode上的服務線程數,處理rpc,預設為10,可以調大--> <property> <name>dfs.datanode.handler.count</name> <value>200</value> </property> <!--文件操作的線程數,如果處理文件有很多,則調大,建議值8192--> <property> <name>dfs.datanode.max.transfer.threads</name> <value>8192</value> </property> <!--不用的數據節點,添加到excludes文件,方法同slaves文件,之後執行hadoop dfsadmin -refreshNodes命令--> <property> <name>dfs.hosts.exclude</name> <value>/usr/Apache/hadoop/etc/hadoop/excludes</value> </property> <!--以下為ha的相關配置--> <!-- 指定hdfs的nameservice的名稱為nscluster,務必與core-site.xml中的邏輯名稱相同 --> <property> <name>dfs.nameservices</name> <value>nscluster</value> </property> <!-- 指定nscluster的兩個namenode的名稱,分別是nn1,nn2,註意後面的尾碼.nscluster,這個是自定義的,如果邏輯名稱為nsc,則尾碼為.nsc,下麵一樣 --> <property> <name>dfs.ha.namenodes.nscluster</name> <value>nn1,nn2</value> </property> <!-- 配置nn1,nn2的rpc通信 埠 --> <property> <name>dfs.namenode.rpc-address.nscluster.nn1</name> <value>master:9000</value> </property> <property> <name>dfs.namenode.rpc-address.nscluster.nn2</name> <value>data1:9000</value> </property> <!-- 配置nn1,nn2的http訪問埠 --> <property> <name>dfs.namenode.http-address.nscluster.nn1</name> <value>master:50070</value> </property> <property> <name>dfs.namenode.http-address.nscluster.nn2</name> <value>data1:50070</value> </property> <!-- 指定namenode的元數據存儲在journalnode中的路徑 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;data1:8485;data2:8485/nscluster</value> </property> <!-- 開啟失敗故障自動轉移 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換的方式 --> <property> <name>dfs.client.failover.proxy.provider.nscluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置zookeeper地址,如果已經在core-site.xml中配置了,這裡不是必須的 --> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,data1:2181,data2:2181</value> </property> <!-- 配置隔離機制 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 指定秘鑰的位置 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!--配置sshfence隔離機制超時時間--> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <!--保證數據恢復--> <!--<property> <name>dfs.journalnode.http-address</name> <value>0.0.0.0:8480</value> </property>--> <!--<property> <name>dfs.journalnode.rpc-address</name> <value>0.0.0.0:8485</value> </property> --> </configuration>
3> mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!--配置 MapReduce JobHistory Server 地址 ,預設埠10020--> <property> <name>mapreduce.jobhistory.address</name> <value>0.0.0.0:10020</value> </property> <!--配置 MapReduce JobHistory Server web ui 地址, 預設埠19888--> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>0.0.0.0:19888</value> </property> <!--不用的數據節點,添加到excludes文件,之後執行hadoop dfsadmin -refreshNodes命令,--> <!--協同hdfs-site.xml中的dfs.hosts.exclude屬性--> <property> <name>mapred.hosts.exclude</name> <value>/usr/Apache/hadoop/etc/hadoop/excludes</value> </property> <property> <name>mapreduce.job.ubertask.enable</name> <value>true</value> </property> </configuration>
註意上面0.0.0.0:19888這種寫法,不能簡單的寫為19888,否則歷史伺服器不能訪問
4> yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --> <!--NodeManager上運行的附屬服務,需配置成mapreduce_shuffle才可運行MapReduce程式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 開啟日誌聚集功能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 日誌刪除時間 -1禁用,單位為秒 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> <!--修改日誌目錄hdfs://mycluster/var/log/hadoop-yarn/apps,當應用程式運行結束後,日誌被轉移到的HDFS目錄(啟用日誌聚集功能時有效)--> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/logs</value> </property> <!-- yarn記憶體,配置nodemanager可用的資源記憶體 --> <!--<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> </property>--> <!-- yarn cpu,配置nodemanager可用的資源CPU --> <!--<property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>8</value> </property>--> <!--以下為ha配置--> <!-- 開啟yarn ha --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定yarn ha的名稱 --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>nscluster-yarn</value> </property> <!--啟用自動故障轉移--> <property> <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>?? <value>true</value> </property> <!-- resourcemanager的兩個名稱 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 配置rm1、rm2的主機 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>master</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>data1</value> </property> <!-- 配置yarn web訪問的埠 --> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>master:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>data1:8088</value> </property> <!-- 配置zookeeper的地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>master:2181,data1:2181,data2:2181</value> </property> <!-- 配置zookeeper的存儲位置 --> <property> <name>yarn.resourcemanager.zk-state-store.parent-path</name> <value>/rmstore</value> </property> <!-- yarn restart--> <!-- 開啟resourcemanager restart --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 配置resourcemanager的狀態存儲到zookeeper中 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- 開啟nodemanager restart --> <property> <name>yarn.nodemanager.recovery.enabled</name> <value>true</value> </property> <!-- 配置rpc的通信埠 --> <property> <name>yarn.nodemanager.address</name> <value>0.0.0.0:45454</value> </property> <!--配置Web Application Proxy安全代理(防止yarn被攻擊)--> <property> <name>yarn.web-proxy.address</name> <value>0.0.0.0:8888</value> </property> </configuration>
註意:
A. yarn.nodemanager.address這個屬性0.0.0.0:45454,在2.6的版本中不要只寫成45454,否則會導致nodemanager啟動不了
B. yarn.nodemanager.resource.memory-mb與yarn.nodemanager.resource.cpu-vcores這兩個屬性,可以預設,在目前的hadoop版本中,如果設置不當,會導致mapreduce程式呈現accepted但是不能run的狀態。在試驗中,2cpu,1G記憶體的配置就出現了這種情況。當設置為8cpu,8G記憶體時卻正常了,即使這不是機器的真實配置。針對這種情況,另一個解決方案是添加yarn.scheduler.minimum-allocation-mb這個屬性:
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2200</value> <description>Amount of physical memory, in MB, that can be allocated for containers.</description> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>500</value> </property>
由於資源問題而導致的這種情況可參考以下:
http://stackoverflow.com/questions/20200636/mapreduce-jobs-get-stuck-in-accepted-state
http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.0.9.1/bk_installing_manually_book/content/rpm-chap1-11.html
http://zh.hortonworks.com/blog/how-to-plan-and-configure-yarn-in-hdp-2-0/
C. 如果