集群配置
三台ECS雲服務器
配置步驟
1.准備工作
1.1 創建/bigdata目錄
mkdir /bigdata
cd /bigdata
mkdir /app
1.2修改主機名為node01、node02、node03
1.3修改hosts文件
vim /etc/hosts
添加node01~node03內網IP映射
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.237.91 node01 172.16.237.90 node02 172.16.221.55 node03
1.4安裝jdk
1.5配置SSH免密登陸
1.6安裝zookeeper,
2.開始配置
2.1 配置前的准備
將hadoop安裝包上傳解壓到/bigdata/app路徑下
tar -zxvf hadoop-2.8.4.tar.gz -C /bigdata/app
創建軟鏈接
ln -s /bigdata/app/hadoop-2.8.4 /usr/local/hadoop
將hadoop配置信息添加到環境變量中
注意:Hadoop配置文件路徑是/usr/local/hadoop/etc/hadoop
vim /etc/profile
添加內容如下:
export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_HOME=$HADOOP_HOME export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
重新編譯環境變量使配置生效
source /etc/profile
2.2 配置HDFS
2.2.1進入到Hadoop配置文件路徑
cd /usr/local/hadoop/etc/hadoop
2.2.2修改hadoo-env.sh
修改JDK路徑
export JAVA_HOME=/usr/local/jdk
2.2.3 配置core-site.xml
2.2.4 配置hdfs-site.xml
配置文件在下面
2.3 配置YARN
2.3.1 修改yarn-site.xml
2.3.2 修改mapred-site.xml
配置文件在下面
2.3.3 在/usr/local/hadoop路徑下創建hdpdata文件夾
cd /usr/local/hadoop mkdir hdpdata
2.4 修改/usr/local/hadoop/etc/hadoop下的slaves文件
設置datanode和nodemanager啟動節點主機名稱
在slaves文件中添加節點的主機名稱
node02
node03
2.5將配置好的hadoop拷貝
scp -r hadoop-2.8.4 root@node02:/bigdata/app
scp -r hadoop-2.8.4 root@node03:/bigdata/app
在每個節點分別執行如下三步操作
第一步:使用root用戶創建軟鏈接
ln -s /bigdata/app/hadoop-2.8.4 /usr/local/hadoop
第二步:設置環境變量
vim /etc/profile
添加內容:
export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_HOME=$HADOOP_HOME export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
第三步:重新編譯環境變量使配置生效
source /etc/profile
3.集群啟動(注意嚴格按照順序啟動)
3.1 啟動journalnode(分別在node01、node02、node03上執行啟動)
/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
運行jps命令檢驗,node01、node02、node03上多了JournalNode進程
3.2 格式化HDFS
在node01上執行命令:
hdfs namenode -format
格式化成功之后會在core-site.xml中的hadoop.tmp.dir指定的路徑下生成dfs文件夾,將該文件夾拷貝到node02的相同路徑下
scp -r hdpdata root@node02:/usr/local/hadoop
3.3 在node01上執行格式化ZKFC操作
hdfs zkfc -formatZK
執行成功,日志輸出如下信息
INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK
3.4 在node01上啟動HDFS
sbin/start-dfs.sh
3.5在node02上啟動YARN
sbin/start-yarn.sh
在node01單獨啟動一個ResourceManger作為備份節點
sbin/yarn-daemon.sh start resourcemanager
3.6在node02上啟動JobHistoryServer
sbin/mr-jobhistory-daemon.sh start historyserver
啟動完成node02會增加一個JobHistoryServer進程
3.7hadoop安裝啟動完成
HDFS HTTP訪問地址
NameNode (active):http://node01:50070
NameNode (standby):http://node02:50070
ResourceManager HTTP訪問地址
ResourceManager :http://node02:8088
歷史日志HTTP訪問地址
JobHistoryServer:http:/node02:19888
4.集群驗證
4.1 驗證HDFS 是否正常工作及HA高可用首先向hdfs上傳一個文件
hadoop fs -put /usr/local/hadoop/README.txt /
在active節點手動關閉active的namenode
sbin/hadoop-daemon.sh stop namenode
通過HTTP 50070端口查看standby namenode的狀態是否轉換為active
手動啟動上一步關閉的namenode
sbin/hadoop-daemon.sh start namenode
4.2驗證ResourceManager HA高可用
手動關閉node02的ResourceManager
sbin/yarn-daemon.sh stop resourcemanager
通過HTTP 8088端口訪問node01的ResourceManager查看狀態
手動啟動node02 的ResourceManager
sbin/yarn-daemon.sh start resourcemanager
啟動腳本
配置文件
core-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- 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. --> <!-- Put site-specific property overrides in this file. --> <configuration> <!-- 指定hdfs的nameservice名稱空間為ns --> <property> <name>fs.defaultFS</name> <value>hdfs://ns</value> </property> <!-- 指定hadoop臨時目錄,默認在/tmp/{$user}目錄下,不安全,每次開機都會被清空--> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/hdpdata/</value> <description>需要手動創建hdpdata目錄</description> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>node01:2181,node02:2181,node03:2181</value> <description>zookeeper地址,多個用逗號隔開</description> </property> </configuration>
hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- 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. --> <!-- Put site-specific property overrides in this file. --> <configuration> <!-- NameNode HA配置 --> <property> <name>dfs.nameservices</name> <value>ns</value> <description>指定hdfs的nameservice為ns,需要和core-site.xml中的保持一致</description> </property> <property> <name>dfs.ha.namenodes.ns</name> <value>nn1,nn2</value> <description>ns命名空間下有兩個NameNode,邏輯代號,隨便起名字,分別是nn1,nn2</description> </property> <property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>node01:9000</value> <description>nn1的RPC通信地址</description> </property> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>node01:50070</value> <description>nn1的http通信地址</description> </property> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>node02:9000</value> <description>nn2的RPC通信地址</description> </property> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>node02:50070</value> <description>nn2的http通信地址</description> </property> <!--JournalNode配置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node01:8485;node02:8485;node03:8485/ns</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/journaldata</value> <description>指定JournalNode在本地磁盤存放數據的位置</description> </property> <!--namenode高可用主備切換配置 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description>開啟NameNode失敗自動切換</description> </property> <property> <name>dfs.client.failover.proxy.provider.ns</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>配置失敗自動切換實現方式,使用內置的zkfc</description> </property> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> <description>配置隔離機制,多個機制用換行分割,先執行sshfence,執行失敗后執行shell(/bin/true),/bin/true會直接返回0表示成功</description> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> <description>使用sshfence隔離機制時需要ssh免登陸</description> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> <description>配置sshfence隔離機制超時時間</description> </property> <!--dfs文件屬性設置--> <property> <name>dfs.replication</name> <value>3</value> <description>默認block副本數為3,測試環境這里設置為1,注意生產環境一定要設置3個副本以上</description> </property> <property> <name>dfs.block.size</name> <value>134217728</value> <description>設置block大小是128M</description> </property>
<!-- 如果是通過公網IP訪問阿里雲上內網搭建的集群 -->
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
<description>only cofig in clients</description>
</property>
</configuration>
mapred-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- 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. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>指定mr框架為yarn方式 </description> </property> <!-- 歷史日志服務jobhistory相關配置 --> <property> <name>mapreduce.jobhistory.address</name> <value>node02:10020</value> <description>歷史服務器端口號</description> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node02:19888</value> <description>歷史服務器的WEB UI端口號</description> </property> </configuration>
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> <!-- 開啟RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id,一組高可用的rm共同的邏輯id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</value> </property> <!-- 指定RM的名字,可以隨便自定義 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分別指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node01</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:8088</value> <description>HTTP訪問的端口號</description> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node02</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:8088</value> </property> <!-- 指定zookeeper集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>node01:2181,node02:2181,node03:2181</value> </property> <!--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> <!-- 日志聚合HDFS目錄 --> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/data/hadoop/yarn-logs</value> </property> <!-- 日志保存時間3days,單位秒 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>259200</value> </property> </configuration>
問題
namenode連接不上,查看日志發現
java.io.IOException: There appears to be a gap in the edit log. We expected txid 1, but got txid 2.
在hadoop的bin目錄下修復元數據
hadoop namenode -recover
先選y后選c
概念
守護進程是在后台運行不受終端控制的進程(如輸入、輸出等),一般的網絡服務都是以守護進程的方式運行。守護進程脫離終端的主要原因有兩點:(1)用來啟動守護進程的終端在啟動守護進程之后,需要執行其他任務。(2)(如其他用戶登錄該終端后,以前的守護進程的錯誤信息不應出現)由終端上的一些鍵所產生的信號(如中斷信號),不應對以前從該終端上啟動的任何守護進程造成影響。要注意守護進程與后台運行程序(即加&啟動的程序)的區別。
守護進程和后台程序
(a)守護進程已經完全脫離終端控制台了,而后台程序並未完全脫離終端,在終端未關閉前還是會往終端輸出結果
(b)守護進程在關閉終端控制台時不會受影響,而后台程序會隨用戶退出而停止,需要在以nohup command & 格式運行才能避免影響
(c)守護進程的會話組和當前目錄,文件描述符都是獨立的。后台運行只是終端進行了一次fork,讓程序在后台執行,這些都沒改變。
hadoop目錄結構
1.$HADOOP_HOME/bin目錄下文件及作用
文件名稱 | 說明 |
hadoop | 用於執行hadoop腳本命令,被hadoop-daemon.sh調用執行,也可以單獨執行,一切命令的核心 |
2.$HADOOP_HOME/sbin目錄下文件及作用
文件名稱 | 說明 |
hadoop-daemon.sh | 通過執行hadoop命令來啟動/停止一個守護進程(daemon);該命令會被bin目錄下面所有以start或stop開頭的所有命令調用來執行命令, hadoop-daemons.sh也是通過調用hadoop-daemon.sh來執行命令的,而hadoop-daemon.sh本身就是通過調用hadoop命令來執行任務。 |
start-all.sh | 全部啟動,它會調用start-dfs.sh及start-mapred.sh |
start-dfs.sh | 啟動NameNode、DataNode以及SecondaryNameNode |
start-mapred.sh | 啟動MapReduce |
stop-all.sh | 全部停止,它會調用stop-dfs.sh及stop-mapred.sh |
stop-balancer.sh | 停止balancer |
stop-dfs.sh | 停止NameNode、DataNode及SecondaryNameNode |
stop-mapred.sh | 停止MapReduce |
3.$HADOOP_HOME/etc/hadoop目錄下文件及作用
文件名稱 | 說明 |
core-site.xml | Hadoop核心全局配置文件,可以其他配置文件中引用該文件中定義的屬性,如在hdfs-site.xml及mapred-site.xml中會引用該文件的屬性; 該文件的模板文件存在於$HADOOP_HOME/src/core/core-default.xml,可將模板文件復制到conf目錄,再進行修改。 |
hadoop-env.sh | Hadoop環境變量 |
hdfs-site.xml | HDFS配置文件,該模板的屬性繼承於core-site.xml;該文件的模板文件存於$HADOOP_HOME/src/hdfs/hdfs-default.xml,可將模板文件復制到conf目錄,再進行修改 |
mapred-site.xml | MapReduce的配置文件,該模板的屬性繼承於core-site.xml;該文件的模板文件存於$HADOOP_HOME/src/mapred/mapredd-default.xml, 可將模板文件復制到conf目錄,再進行修改 |
slaves | 用於設置所有的slave的名稱或IP,每行存放一個。如果是名稱,那么設置的slave名稱必須在/etc/hosts有IP映射配置 |
4.$HADOOP_HOME/lib目錄
該目錄下存放的是Hadoop運行時依賴的jar包,Hadoop在執行時會把lib目錄下面的jar全部加到classpath中。
5.$HADOOP_HOME/logs目錄
該目錄存放的是Hadoop運行的日志,查看日志對尋找Hadoop運行錯誤非常有幫助。
6.$HADOOP_HOME/include目錄
對外提供的編程庫頭文件(具體動態庫和靜態庫在lib目錄中),這些頭文件均是用C++定義的,通常用於C++程序訪問HDFS或者編寫MapReduce程序。
7.$HADOOP_HOME/libexec目錄
各個服務對用的shell配置文件所在的目錄,可用於配置日志輸出、啟動參數(比如JVM參數)等基本信息。
8.$HADOOP_HOME/share目錄
Hadoop各個模塊編譯后的jar包所在的目錄。
端口
原文: Hadoop常用端口和定義方法Hadoop集群的各部分一般都會使用到多個端口,有些是daemon之間進行交互之用,有些是用於RPC訪問以及HTTP訪問。而隨着Hadoop周邊組件的增多,完全記不住哪個端口對應哪個應用,特收集記錄如此,以便查詢。
這里包含我們使用到的組件:HDFS, YARN, HBase, Hive, ZooKeeper:
組件
節點
默認端口
配置
用途說明
HDFS
DataNode
50010
dfs.datanode.address
datanode服務端口,用於數據傳輸
HDFS
DataNode
50075
dfs.datanode.http.address
http服務的端口
HDFS
DataNode
50475
dfs.datanode.https.address
https服務的端口
HDFS
DataNode
50020
dfs.datanode.ipc.address
ipc服務的端口
HDFS
NameNode
50070
dfs.namenode.http-address
http服務的端口
HDFS
NameNode
50470
dfs.namenode.https-address
https服務的端口
HDFS
NameNode
8020
fs.defaultFS
接收Client連接的RPC端口,用於獲取文件系統metadata信息。
HDFS
journalnode
8485
dfs.journalnode.rpc-address
RPC服務
HDFS
journalnode
8480
dfs.journalnode.http-address
HTTP服務
HDFS
ZKFC
8019
dfs.ha.zkfc.port
ZooKeeper FailoverController,用於NN HA
YARN
ResourceManager
8032
yarn.resourcemanager.address
RM的applications manager(ASM)端口
YARN
ResourceManager
8030
yarn.resourcemanager.scheduler.address
scheduler組件的IPC端口
YARN
ResourceManager
8031
yarn.resourcemanager.resource-tracker.address
IPC
YARN
ResourceManager
8033
yarn.resourcemanager.admin.address
IPC
YARN
ResourceManager
8088
yarn.resourcemanager.webapp.address
http服務端口
YARN
NodeManager
8040
yarn.nodemanager.localizer.address
localizer IPC
YARN
NodeManager
8042
yarn.nodemanager.webapp.address
http服務端口
YARN
NodeManager
8041
yarn.nodemanager.address
NM中container manager的端口
YARN
JobHistory Server
10020
mapreduce.jobhistory.address
IPC
YARN
JobHistory Server
19888
mapreduce.jobhistory.webapp.address
http服務端口
HBase
Master
60000
hbase.master.port
IPC
HBase
Master
60010
hbase.master.info.port
http服務端口
HBase
RegionServer
60020
hbase.regionserver.port
IPC
HBase
RegionServer
60030
hbase.regionserver.info.port
http服務端口
HBase
HQuorumPeer
2181
hbase.zookeeper.property.clientPort
HBase-managed ZK mode,使用獨立的ZooKeeper集群則不會啟用該端口。
HBase
HQuorumPeer
2888
hbase.zookeeper.peerport
HBase-managed ZK mode,使用獨立的ZooKeeper集群則不會啟用該端口。
HBase
HQuorumPeer
3888
hbase.zookeeper.leaderport
HBase-managed ZK mode,使用獨立的ZooKeeper集群則不會啟用該端口。
Hive
Metastore
9083
/etc/default/hive-metastore中export PORT=來更新默認端口
Hive
HiveServer
10000
/etc/hive/conf/hive-env.sh中export HIVE_SERVER2_THRIFT_PORT=來更新默認端口
ZooKeeper
Server
2181
/etc/zookeeper/conf/zoo.cfg中clientPort=
對客戶端提供服務的端口
ZooKeeper
Server
2888
/etc/zookeeper/conf/zoo.cfg中server.x=[hostname]:nnnnn[:nnnnn],標藍部分
follower用來連接到leader,只在leader上監聽該端口。
ZooKeeper
Server
3888
/etc/zookeeper/conf/zoo.cfg中server.x=[hostname]:nnnnn[:nnnnn],標藍部分
用於leader選舉的。只在electionAlg是1,2或3(默認)時需要。
所有端口協議均基於TCP。
對於存在Web UI(HTTP服務)的所有hadoop daemon,有如下url:
/logs
日志文件列表,用於下載和查看
/logLevel
允許你設定log4j的日志記錄級別,類似於hadoop daemonlog
/stacks
所有線程的stack trace,對於debug很有幫助
/jmx
服務端的Metrics,以JSON格式輸出。
/jmx?qry=Hadoop:*會返回所有hadoop相關指標。
/jmx?get=MXBeanName::AttributeName 查詢指定bean指定屬性的值,例如/jmx?get=Hadoop:service=NameNode,name=NameNodeInfo::ClusterId會返回ClusterId。
這個請求的處理類:org.apache.hadoop.jmx.JMXJsonServlet
而特定的Daemon又有特定的URL路徑特定相應信息。
NameNode:http://:50070/
/dfshealth.jsp
HDFS信息頁面,其中有鏈接可以查看文件系統
/dfsnodelist.jsp?whatNodes=(DEAD|LIVE)
顯示DEAD或LIVE狀態的datanode
/fsck
運行fsck命令,不推薦在集群繁忙時使用!
DataNode:http://:50075/
/blockScannerReport
每個datanode都會指定間隔驗證塊信息