Hadoop集羣搭建
前言
hadoop集羣搭建一般都採用3條服務器來演練,爲什麼是3呢?之前以爲跟redis類似,由主從投票策略決定,後來想了想應該不是,因爲主節點是nameNode節點,而從節點是dataNode節點,你的從節點在此時升級爲master也沒用吧。。。
後邊找到一些資料說是跟hadoop的副本策略有關係,默認爲3。所以,服務器數量小於3,意味着一臺機器至少存有2個副本,大於3對於目的只是模擬測試來說、又有點浪費。。
搭建
hadoop不同版本似乎有些差別,下面是搭建的基本環境:
- 本文采用Hadoop 2.10.0版本
- CentOS Linux release 7.6.1810 (Core)
- 3臺服務器(一臺master、兩臺salve)
- 已安裝JDK1.8
hadoop version
域名設置
爲了方便文件傳輸總得標記一個ip,採用域名可以減少這種麻煩。
在3臺機器的hosts文件輸入如下內容:
192.168.0.28 master
192.168.0.14 node2
192.168.0.23 node1
在master機器的hostname文件中輸入如下內容,slave節點的機器的hostname文件則分別輸入node1、node2
master
注意,如果域名設置好了之後,後邊想更改機器時,比如把ndoe2分配給其他機器,此時可能因爲DNS緩存設置不成功。
service nscd restart
服務器免密登錄
master連接slave節點時如果需要密碼,可能連接會失敗,所以需要設置下免密登錄:
安裝openssh-server服務
yum install openssh-server
master服務器輸入以下指令一直回車,生成公鑰和私鑰:
ssh-keygen -t rsa
在master上將公鑰放入authorized_keys(linux 操作系統下,專門用來存放公鑰的地方,只要公鑰放到了服務器的正確位置,並且擁有正確的權限,你纔可以通過你的私鑰,免密登錄linux服務器),命令如下
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
發送公鑰到node1、node2節點上,然後在master主機上試試ssh node1
或者ssh node2
能不能成功。一開始可能還會提示輸入一遍密碼,後邊就不用了
scp ~/.ssh/authorized_keys root@node1:~/.ssh/
scp ~/.ssh/authorized_keys root@node2:~/.ssh
下載
最好將下載的包移動到一個區別其他目錄的目錄。
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz
解壓
tar zxvf hadoop-2.10.0.tar.gz
添加hadoop文件路徑到配置文件中:
export PATH=$PATH:/hadoop/hadoop-2.10.0/bin:/hadoop/hadoop-2.10.0/sbin
source /etc/profile
配置
創建hdfs
創建我們的HDFS(hadoop file system)文件系統。數據存儲於該位置。
進入hdfs文件,分別創建如下目錄:
name 存儲namenode文件
data 存儲數據
tmp 存儲臨時文件
修改XML文件
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
- hadoop-env.sh
- slaves
上述文件都在hadoop的etc/hadoop/
目錄中:(圖中漏了一個slaves的標記)
core-site.xml
注意,name屬性不是想設置啥就設置啥的,它們是經過專業訓練的,一開始傻傻的設置了一套,結果啓動一直不行,重新改了回來,後來想想就覺得搞笑,如果可以隨便設置的話,那hadoop啓動掃描時豈不是得有很多繁瑣的判斷。
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:8000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/hadoop-2.10.0/hdfs/tmp</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>hdfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/hadoop/hadoop-2.10.0/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/hadoop/hadoop-2.10.0/hdfs/data</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-service</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
hadoop-env.sh
這個文件主要配置了JDK的路徑,注意!待會會將hadoop所有文件發送到從節點上,如果從節點的jdk路徑跟master節點不一樣,記得修改!!!
slaves
主要配置從節點的主機名,也就是node1和node2:
發送
將hadoop整個目錄發送至node1和node2節點上:
scp -r hadoop-2.10.0 root@node1:/hadoop/
scp -r hadoop-2.10.0 root@node1:/hadoop/
啓動
格式化
master運行如下命令,格式化後,name目錄會多出current目錄。
hadoop namenode -format
拓展
Current:裏面包含edits、fsimage、seen_txid、VERSION文件。
- edits 日誌文件:客戶端執行寫操作會先寫入edits日誌,並且在內存中保留。
- fsimage文件:nameNode的鏡像文件,每次checkpoing(合併所有edits到一個fsimage的過程)產生的最終的fsimage,同時會生成一個.md5的文件用來對文件做完整性校驗。
- Seen_txid :非常重要,代表namenode的edits*文件尾數,namenode重啓時會循序從頭跑 edits_0000001~到 seen_txid 的數字。但format格式化之後會是0。
- Version :記錄了集羣的信息,如上圖所示,它的信息有namespaceID/clusterID/blockpoolID。
在集羣中,會有多個 NameNode 獨立工作,每個NameNode 提供唯一的命名空(namespaceID),並管理一組唯一的文件塊池(blockpoolID)。
cTime 存儲系統創建時間,首次格式化文件系統爲 0,當文件系統升級之後,該值會更新到升級之後的時間戳。
啓動集羣
start-all.sh
master啓動上述指令,輸入JPS查看master進程
node節點輸入jps查看進程
輸入master網址,默認端口50070 http://192.168.0. 28:50070/