CentOS 7.0 hadoop 安裝與配置
蔣小超 2015.04.03
背景介紹
hadoop 是一種大數(shù)據(jù)分布式運算解決方案。
hadoop 是什么杜恰?
實際上 hadoop 就是 Google 的 MapReduce 核心算法的一個開源實現(xiàn)佑惠,主要用于海量數(shù)據(jù)的處理憋飞。
一般來說數(shù)據(jù)量超過 1T 就可以算海量數(shù)據(jù)了敏弃,當然如果只是一個簡單的文件超過 1T 還是很容易的笛辟,但是這里說的是數(shù)據(jù)羽利,就是一個一個小的數(shù)據(jù)記錄的集合宫患,比如淘寶這樣的很多商品,比如 Google 這樣的搜索引擎这弧。
那么就有個疑問了娃闲,如果只是數(shù)據(jù)記錄, hadoop 相比數(shù)據(jù)庫有什么優(yōu)勢匾浪?數(shù)據(jù)庫也是大量數(shù)據(jù)的集合盎拾铩?這就牽扯到了分布式計算蛋辈, hadoop 在設計時就考慮過用大量性能不是那么強的節(jié)點合并在一起工作属拾,而數(shù)據(jù)庫往往有一個主數(shù)據(jù)庫,能力往往取決于主要設備的性能冷溶。實際上 hadoop 還有一個 hive 分支用來做和數(shù)據(jù)庫差不多的事情渐白。
hadoop 能做什么?
就像上面說的逞频, hadoop 主要目的就是海量數(shù)據(jù)處理纯衍,根據(jù)它的設計可以做:
大量數(shù)據(jù)的保存。這個其實不是主要功能苗胀,不過 hadoop 可以在保存文件的時候保存幾個備份襟诸,而且還會把他們放到不同的節(jié)點里面,所以當做 RAID 也是可以的基协。
數(shù)據(jù)倉庫/數(shù)據(jù)挖掘歌亲。比如大量日志的分析等等
搜索引擎。這是設計初衷了堡掏,就是想快速索引和查詢
云計算。收集用戶方方面面的信息然后從中間獲取信息(看起來像數(shù)據(jù)挖掘刨疼?)
研究泉唁。分布式計算什么的挺前沿的,可以研究一下咯揩慕。而且云計算的本質(zhì)也就是海量數(shù)據(jù)的存儲和并行處理
這里是hadoop 主頁
大數(shù)據(jù)集群中不同主機扮演不同角色亭畜,主要分為下面幾種:
-
Master
NameNode
NameNode 用于管理文件系統(tǒng) HDFS ,維護文件系統(tǒng)樹結(jié)構和文件元數(shù)據(jù)迎卤。當有新文件要寫入系統(tǒng)時客戶端會先向 NameNode 查詢當前文件系統(tǒng)的狀態(tài)拴鸵,然后得知自己可以往哪里寫入,最后實際寫入文件系統(tǒng),這中間 NameNode 就是管理主要信息的核心設備劲藐。ResourceManager
ResourceManager 用于管理和分配工作八堡,它是所有工作的總調(diào)度程序。
-
Slave
DataNode
DataNode 提供文件存儲聘芜,它將自己的存儲空間分塊兄渺,然后向 NameNode 報告自己的存儲狀態(tài)并負責真正保存文件NodeManager
NodeManager 用于接受 ResourceManager 分配的工作并實際工作,是所有工作的實際執(zhí)行者汰现。
這篇文檔實際上是參考 這里 加上自己的實際試驗寫出來了挂谍,原文沒有使用 CentOS 7,而且版本稍微有點老瞎饲,我僅僅是更新了一下口叙。
安裝和配置步驟
安裝環(huán)境
我這里的安裝環(huán)境基于虛擬機,有3個 CentOS 7.0 虛擬機嗅战,IP地址分別為:
- 192.168.110.10 Master.hadoop
- 192.168.110.11 Slave_1.hadoop
- 192.168.110.12 Slave_2.hadoop
因為 hadoop 要求所有參與設備的環(huán)境都相同妄田,包括有相同用戶,相同安裝目錄等仗哨,所以可以先把準備工作做好形庭。
準備工作
-
創(chuàng)建用戶 'hadoop',用戶密碼和用戶名相同厌漂。這個用戶用于實際工作萨醒,root 用戶僅用于配置環(huán)境
useradd hadoop passwd hadoop
-
主機命名和注冊
首先修改每臺主機的 /etc/hostname 文件,確定主機名然后修改每臺主機的 /etc/hosts 文件苇倡,將主機名和 IP 地址對應關系都寫進去
-
開啟不需要密碼的 ssh 登錄
hadoop 對其他 DataNode 的操作都用的是 ssh 連接富纸,頻繁操作肯定不能不停的輸入密碼。理論上每個設備都應該創(chuàng)建密鑰并在其他設備上注冊旨椒,但其實在 NameNode 上做下面的操作也可以晓褪,因為一般情況下都是 NameNode 操作 DataNode.# 創(chuàng)建用戶密鑰,root 用戶和 hadoop 用戶都要創(chuàng)建 ssh-keygen -t rsa # 將密鑰在 DataNode 上注冊综慎,注意要切換用戶 ssh-copy-id root@Master.hadoop ssh-copy-id hadoop@Master.hadoop
上面的動作都完成后應該可以用下面的命令測試:
```bash
# 必須獲得響應
ping Slave_1.hadoop
# 不需要輸入密碼即可登錄其他設備
ssh Slave_1.hadoop
```
- 在每個 slave 上面用 ssh-copy-id 將自己的私鑰在 Master 上注冊涣仿,slave 之間就不需要注冊了
下載和安裝
對于 hadoop 來說有 2 個必要組件,分別是:
hadoop
下載站點-
Java 運行環(huán)境
CentOS 自帶 Java 環(huán)境示惊,只要用 yum 安裝就可以了yum install openjdk
環(huán)境變量最好加入 /etc/profile 文件里好港,在文件里加入下面的內(nèi)容:
export JAVA_HOME=/usr/lib/jvm/java-openjdk export JRE_HOME=/usr/lib/jvm/java-openjdk/jre export CLASSPATH=.:${CLASSPATH}:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin
然后讓配置生效:
source /etc/profile
將配置文件復制到其他客戶端:
scp /etc/profile root@slave_1:/etc
如果沒有意外的話 java 應該就可用了,可以用下面的命令檢查:
[root@Master etc]# java -version java version "1.7.0_51" OpenJDK Runtime Environment (rhel-2.4.5.5.el7-x86_64 u51-b31) OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
配置 hadoop
我這里下載的是 hadoop-2.6.0.tar.gz 文件米罚,將它復制到 /usr 目錄下钧汹,然后用下面的命令解壓并把它交給 hadoop 用戶:
```bash
cd /usr
tar zxvf hadoop-2.6.0.tar.gz
mv hadoop-2.6.0 hadoop
chown -R hadoop:hadoop hadoop
```
從現(xiàn)在開始就要切換到 hadoop 用戶了,之后的命令中如果有需要 root 權限的都會專門說明录择。
-
先在 hadoop 安裝目錄中創(chuàng)建一個 tmp 目錄拔莱,未來的查詢都可以在這個目錄下進行
cd /usr/hadoop mkdir tmp
-
將 hadoop 需要的環(huán)境變量加入 /etc/profile 文件中去碗降,這個步驟需要 root 權限
在文件最后加上下面的內(nèi)容,然后拷貝到其他主機中去:
# Set hadoop environment export HADOOP_HOME=/usr/hadoop export PATH=$PATH:$HADOOP_HOME/bin
現(xiàn)在開始真正配置 hadoop 了塘秦,下面的文件都在 hadoop 安裝目錄的 etc/hadoop 目錄下讼渊,注意先備份。
最開始的時候 hadoop 配置文件很少嗤形,不過隨著項目越來越大配置文件也開始增加了精偿,到現(xiàn)在為止 hadoop 的代碼大致分為了 core , hdfs 和 map/reduce 三部分赋兵,配置文件也被分成了三個笔咽。不過 mapred-site.xml 其實可以不配置 :
- core- site.xml
- hdfs-site.xml
- mapred-site.xml
其中 core-site.xml 和 hdfs-site.xml 是站在 HDFS 角度上配置文件; core-site.xml 和 mapred-site.xml 是站在 MapReduce 角度上配置文件霹期。
-
配置 hadoop-env.sh
這里真正要配置的其實就是 JAVA_HOME 這個參數(shù)叶组,不過其實不配置也可以在上面步驟中的環(huán)境變量中得到
export JAVA_HOME=/usr/lib/jvm/java-openjdk
-
配置 core-site.xml
按照下面的內(nèi)容配置 Master (NameNode/ResourceManager) 的地址和端口號柱蟀,進行下面的配置前一定要創(chuàng)建 /usr/hadoop/tmp 目錄媳溺。
fs.defaultFS 用來指定 ResourceManager 設備
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://Master.hadoop</value> </property> <!-- file system properties --> <property> <name>fs.default.name</name> <value>hdfs://Master.hadoop:9000</value> </property> </configuration>
上面的 hadoop.tmp.dir 如果不配置的話默認就會用臨時目錄 /tmp/hadoo-hadoop 芹扭。這個目錄每次重啟后都會被刪掉亿胸,必須重新執(zhí)行format才行,否則會出錯润樱。
-
配置 hdfs-site.xml
下面配置中的 dfs.replication 參數(shù)用來指定每個文件保存多少份瑰剃,對于普通使用來說 1 份就可以歪沃,但這種沒有備份的情況可能一個 DataNode 損壞就丟失文件了臣淤,如果文件比較重要最好還是多備份一份橄霉,這里設置為 2 是因為我們有 2 臺 DataNode 正好每個上面?zhèn)浞菀粋€,如果配置的 DataNode 數(shù)量不夠會報警邑蒋。如果不配置這個參數(shù)那么默認是 3
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>
-
配置 mapred-site.xml
hadoop 2.6 不需要配置這個文件
-
主機配置
-
修改 /usr/hadoop/etc/hadoop/masters 文件姓蜂,默認如果沒有那么就得新建一個,在里面加上一行:
192.168.110.11
或者名稱也可以Master.hadoop
-
修改 /usr/hadoop/etc/hadoop/slaves 文件医吊,在里面把其他 DataNode 加進來
Slave_1.hadoop Slave_2.hadoop
-
好了钱慢,到這里 Master 上的配置就完成了,之后需要將配置好的目錄用 scp 拷貝到其他 slave 機器上卿堂。理論上來說 slave 上面應該單獨配置束莫,不過直接復制其實也是可以的。復制完成了一定記得到 slave 主機上把 hadoop 目錄的權限交給 hadoop:
```bash
scp -r /usr/hadoop root@192.168.110.12:/usr
chown -R hadoop:hadoop /usr/hadoop
```
記得把 /etc/profile 文件也復制到客戶機上去草描,主要是那幾個系統(tǒng)變量:
`scp /etc/profile root@192.168.110.12:/etc`
啟動和功能驗證
下面的操作都是用 hadoop 用戶在 Master 上進行的览绿。
格式化 HDFS 系統(tǒng)
在 NameNode 上要格式化 HDFS 系統(tǒng),這個動作只需要做一次就可以了:
`hadoop namenode -format`
我這里執(zhí)行后的輸出如下陶珠,看到 Exiting with status 0 嗎挟裂?
```bash
[hadoop@Master hadoop]$ hadoop namenode -format
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
15/04/07 18:15:30 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = Master.hadoop/192.168.110.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.6.0
STARTUP_MSG: classpath = ...
STARTUP_MSG: build = https://git-wip-us.apache.org/repos/asf/hadoop.git -r e3496499ecb8d220fba99dc5ed4c99c8f9e33bb1; compiled by 'jenkins' on 2014-11-13T21:10Z
STARTUP_MSG: java = 1.7.0_51
************************************************************/
15/04/07 18:15:30 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
15/04/07 18:15:30 INFO namenode.NameNode: createNameNode [-format]
Formatting using clusterid: CID-8762898e-f67e-4cc9-b9ff-199c054c3051
15/04/07 18:15:31 INFO namenode.FSNamesystem: No KeyProvider found.
15/04/07 18:15:31 INFO namenode.FSNamesystem: fsLock is fair:true
15/04/07 18:15:31 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000
15/04/07 18:15:31 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true
15/04/07 18:15:31 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.000
15/04/07 18:15:31 INFO blockmanagement.BlockManager: The block deletion will start around 2015 Apr 07 18:15:31
15/04/07 18:15:31 INFO util.GSet: Computing capacity for map BlocksMap
15/04/07 18:15:31 INFO util.GSet: VM type = 64-bit
15/04/07 18:15:32 INFO util.GSet: 2.0% max memory 889 MB = 17.8 MB
15/04/07 18:15:32 INFO util.GSet: capacity = 2^21 = 2097152 entries
15/04/07 18:15:32 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false
15/04/07 18:15:32 INFO blockmanagement.BlockManager: defaultReplication = 2
15/04/07 18:15:32 INFO blockmanagement.BlockManager: maxReplication = 512
15/04/07 18:15:32 INFO blockmanagement.BlockManager: minReplication = 1
15/04/07 18:15:32 INFO blockmanagement.BlockManager: maxReplicationStreams = 2
15/04/07 18:15:32 INFO blockmanagement.BlockManager: shouldCheckForEnoughRacks = false
15/04/07 18:15:32 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000
15/04/07 18:15:32 INFO blockmanagement.BlockManager: encryptDataTransfer = false
15/04/07 18:15:32 INFO blockmanagement.BlockManager: maxNumBlocksToLog = 1000
15/04/07 18:15:32 INFO namenode.FSNamesystem: fsOwner = hadoop (auth:SIMPLE)
15/04/07 18:15:32 INFO namenode.FSNamesystem: supergroup = supergroup
15/04/07 18:15:32 INFO namenode.FSNamesystem: isPermissionEnabled = true
15/04/07 18:15:32 INFO namenode.FSNamesystem: HA Enabled: false
15/04/07 18:15:32 INFO namenode.FSNamesystem: Append Enabled: true
15/04/07 18:15:32 INFO util.GSet: Computing capacity for map INodeMap
15/04/07 18:15:32 INFO util.GSet: VM type = 64-bit
15/04/07 18:15:32 INFO util.GSet: 1.0% max memory 889 MB = 8.9 MB
15/04/07 18:15:32 INFO util.GSet: capacity = 2^20 = 1048576 entries
15/04/07 18:15:32 INFO namenode.NameNode: Caching file names occuring more than 10 times
15/04/07 18:15:32 INFO util.GSet: Computing capacity for map cachedBlocks
15/04/07 18:15:32 INFO util.GSet: VM type = 64-bit
15/04/07 18:15:32 INFO util.GSet: 0.25% max memory 889 MB = 2.2 MB
15/04/07 18:15:32 INFO util.GSet: capacity = 2^18 = 262144 entries
15/04/07 18:15:32 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033
15/04/07 18:15:32 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0
15/04/07 18:15:32 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension = 30000
15/04/07 18:15:32 INFO namenode.FSNamesystem: Retry cache on namenode is enabled
15/04/07 18:15:32 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis
15/04/07 18:15:32 INFO util.GSet: Computing capacity for map NameNodeRetryCache
15/04/07 18:15:32 INFO util.GSet: VM type = 64-bit
15/04/07 18:15:32 INFO util.GSet: 0.029999999329447746% max memory 889 MB = 273.1 KB
15/04/07 18:15:32 INFO util.GSet: capacity = 2^15 = 32768 entries
15/04/07 18:15:32 INFO namenode.NNConf: ACLs enabled? false
15/04/07 18:15:32 INFO namenode.NNConf: XAttrs enabled? true
15/04/07 18:15:32 INFO namenode.NNConf: Maximum size of an xattr: 16384
15/04/07 18:15:32 INFO namenode.FSImage: Allocated new BlockPoolId: BP-1017743206-192.168.110.11-1428401732358
15/04/07 18:15:32 INFO common.Storage: Storage directory /usr/hadoop/tmp/dfs/name has been successfully formatted.
15/04/07 18:15:32 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
15/04/07 18:15:32 INFO util.ExitUtil: Exiting with status 0
15/04/07 18:15:32 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at Master.hadoop/192.168.110.11
************************************************************/
```
啟動 hadoop
以前的時候都是用 sbin/start-all.sh 腳本啟動享钞,不過現(xiàn)在已經(jīng)不建議這么做了揍诽,建議的方式是分別執(zhí)行下面 2 個腳本:
```bash
./sbin/start-dfs.sh
./sbin/start-yarn.sh
```
執(zhí)行上面命令之前最好關閉集群中其他設備的防火墻诀蓉,有可能會被奇怪的擋住……另外只需要在 Master 上執(zhí)行即可,不需要找 Slave
我這里的輸出是這樣的:
```bash
[hadoop@Master hadoop]$ ./sbin/start-dfs.sh
Starting namenodes on [localhost]
localhost: starting namenode, logging to /usr/hadoop/logs/hadoop-hadoop-namenode-Master.hadoop.out
Slave_1.hadoop: starting datanode, logging to /usr/hadoop/logs/hadoop-hadoop-datanode-Slave_1.hadoop.out
Slave_2.hadoop: starting datanode, logging to /usr/hadoop/logs/hadoop-hadoop-datanode-Slave_2.hadoop.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: secondarynamenode running as process 32261. Stop it first.
```
```bash
[hadoop@Master hadoop]$ ./sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /usr/hadoop/logs/yarn-hadoop-resourcemanager-Master.hadoop.out
Slave_1.hadoop: starting nodemanager, logging to /usr/hadoop/logs/yarn-hadoop-nodemanager-Slave_1.hadoop.out
Slave_2.hadoop: starting nodemanager, logging to /usr/hadoop/logs/yarn-hadoop-nodemanager-Slave_2.hadoop.out
```
如果都正確啟動的話可以在 slave 主機上去看看 /usr/hadoop/tmp 目錄暑脆,里面應該有這 2 個目錄的渠啤,都是自動創(chuàng)建的:
```bash
[root@Salve_1 hadoop]# ll tmp/
total 0
drwxrwxr-x 3 hadoop hadoop 17 Apr 7 18:34 dfs
drwxr-xr-x 5 hadoop hadoop 54 Apr 7 18:37 nm-local-dir
```
驗證是否啟動
下面的方法都可以驗證:
-
使用 java 的 jps 小工具可以看到 ResourceManager , NameNode 都啟動了:
# On Master [hadoop@Master hadoop]$ jps 29011 ResourceManager 21836 NameNode 2159 Jps 32261 SecondaryNameNode # On Slave [root@Salve_1 hadoop]# jps 4799 DataNode 20182 Jps 11010 NodeManager
-
用
./bin/hdfs dfsadmin -report
查看狀態(tài)# On Master [hadoop@Master hadoop]$ ./bin/hdfs dfsadmin -report Configured Capacity: 107321753600 (99.95 GB) Present Capacity: 95001157632 (88.48 GB) DFS Remaining: 95001149440 (88.48 GB) DFS Used: 8192 (8 KB) DFS Used%: 0.00% Under replicated blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 ------------------------------------------------- Live datanodes (2): Name: 192.168.110.12:50010 (Slave_1.hadoop) Hostname: Slave_1.hadoop Decommission Status : Normal Configured Capacity: 53660876800 (49.98 GB) DFS Used: 4096 (4 KB) Non DFS Used: 6159425536 (5.74 GB) DFS Remaining: 47501447168 (44.24 GB) DFS Used%: 0.00% DFS Remaining%: 88.52% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Thu Apr 09 10:49:27 CST 2015 Name: 192.168.110.13:50010 (Slave_2.hadoop) Hostname: Slave_2.hadoop Decommission Status : Normal Configured Capacity: 53660876800 (49.98 GB) DFS Used: 4096 (4 KB) Non DFS Used: 6161170432 (5.74 GB) DFS Remaining: 47499702272 (44.24 GB) DFS Used%: 0.00% DFS Remaining%: 88.52% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Thu Apr 09 10:49:27 CST 2015
-
如果都運行了,就可以用瀏覽器查看了添吗。在系統(tǒng)中使用下面的命令可以看到 hadoop 使用的端口:
[hadoop@Master hadoop]$ netstat -tnulp | grep java (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 21836/java tcp 0 0 0.0.0.0:50090 0.0.0.0:* LISTEN 32261/java tcp 0 0 0.0.0.0:50070 0.0.0.0:* LISTEN 21836/java tcp6 0 0 :::8030 :::* LISTEN 29011/java tcp6 0 0 :::8031 :::* LISTEN 29011/java tcp6 0 0 :::8032 :::* LISTEN 29011/java tcp6 0 0 :::8033 :::* LISTEN 29011/java tcp6 0 0 :::8088 :::* LISTEN 29011/java
hadoop 在進程中的表現(xiàn)就是 java 程序沥曹, IPv6 的幾個端口用于內(nèi)部通訊, IPv4 的 3 個端口分別是數(shù)據(jù)通訊RPC端口(9000)碟联、DFS 狀態(tài)查看(50070)和整體狀態(tài)查詢(50090)
附錄
正常情況下各個進程情況
-
Master
Master 有 3 個主要進程就可以了妓美,以前還有 JobTracker ,不過現(xiàn)在這個進程會在每次開始工作時自動啟動鲤孵,完成后退出[hadoop@Master hadoop]$ jps 15336 SecondaryNameNode 23851 Jps 16195 ResourceManager 14081 NameNode
-
Slave
Slave 有 2 個即可壶栋, TaskTracker 也是需要時啟動[hadoop@Slave_1 logs]$ jps 9683 NodeManager 18383 Jps 8749 DataNode