首先咱們來認識一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分佈式文件系統。它實際上是將一個大文件分紅若干塊保存在不一樣服務器的多個節點中。經過聯網讓用戶感受像是在本地同樣查看文件,爲了下降文件丟失形成的錯誤,它會爲每一個小文件複製多個副本(默認爲三個),以此來實現多機器上的多用戶分享文件和存儲空間。html
Hadoop主要包含三個模塊:java
本節將會介紹Hadoop集羣的配置,目標主機咱們能夠選擇虛擬機中的多臺主機或者多臺阿里雲服務器。node
注意:如下全部操做都是在root用戶下執行的,所以基本不會出現權限錯誤問題。linux
VMware虛擬機有三種網絡模式,分別是Bridged(橋接模式)、NAT(網絡地址轉換模式)、Host-only(主機模式):web
橋接:選擇橋接模式的話虛擬機和宿主機在網絡上就是平級的關係,至關於鏈接在同一交換機上;算法
NAT:NAT模式就是虛擬機要聯網得先經過宿主機才能和外面進行通訊;apache
具體區別能夠參考博客:Vmware虛擬機下三種網絡模式配置。vim
VMware Workstation Pro 15中文破解版下載地址:http://www.zdfans.com/html/16025.html,參考安裝破解教程進行安裝。centos
CentOS7下載地址;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso。安全
在Vmware中安裝CentOS7的步驟能夠參考博客:VMware安裝Centos7超詳細過程(圖文)(包含克隆模式)。
一、網絡模式配置爲橋接模式,CentOS7網絡IP配置參考博客:Centos7虛擬機橋接模式設置靜態ip。
二、配置主機名
vi /etc/sysconfig/network
三、配置Host
vi /etc/hosts
192.168.1.100爲CentOS7網絡IP配置中設置的本機的靜態IP地址。
四、關閉防火牆和selinux
service iptables stop
vim /etc/sysconfig/selinux
若是能夠申請到阿里雲服務器推薦使用阿里雲服務器,這裏申請的時CentOS 7.2,相關步驟能夠參考博客:大數據 -- zookeeper和kafka集羣環境搭建第一節。
查看防火牆狀態:
systemctl status firewalld
若是是開啓,須要利用命令將防火牆關閉:
systemctl stop firewalld systemctl disable firewalld
JDK安裝能夠參考博客大數據 -- zookeeper和kafka集羣環境搭建第二節。
Hadoop部署模式主要有:本地模式、僞分佈模式、徹底分佈式模式、HA徹底分佈式模式。
區分的依據是NameNode、DataNode、ResourceManager、NodeManager等模塊運行在幾個JVM進程、幾個機器。
模式名稱 | 各個模塊佔用的JVM進程數 | 各個模塊運行在幾個機器數上 |
---|---|---|
本地模式 | 1個 | 1個 |
僞分佈式模式 | N個 | 1個 |
徹底分佈式模式 | N個 | N個 |
HA徹底分佈式 | N個 | N個 |
下面我選擇將Hadoop僞分佈式模式安裝在阿里雲服務器zy1主機上。僞分佈式模式能夠看做是徹底分佈式,可是跑在一個節點上,全部的進程都配置在一個節點上,擁有分佈式文件系統,只不過這個系統只有一個節點。
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz tar -zxvf hadoop-2.8.5.tar.gz -C /opt/bigdata
從新命名:
mv hadoop-2.8.5 hadoop
vim /etc/profile
追加配置:
export HADOOP_HOME=/opt/bigdata/hadoop export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
使配置生效:
. /etc/profile
echo $HADOOP_HOME
修改hadoop-env.sh:
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
修改JAVA_HOME參數爲:
export JAVA_HOME=/usr/lib/jvm/java
vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
添加內容以下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://zy1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/bigdata/data/hadoop</value> </property> </configuration>
建立臨時目錄:
mkdir -p /opt/bigdata/data/hadoop
vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
添加內容以下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
dfs.replication配置的是HDFS存儲時的備份數量,由於這裏是僞分佈式環境只有一個節點,因此這裏設置爲1。
hdfs namenode -format
注意:若是格式化成功了,不能夠再繼續格式化,若是想繼續格式化能夠參考Hadoop1從新格式化HDFS。若是沒有格式化成功,須要一直格式化。
格式化後,查看core-site.xml裏hadoop.tmp.dir(本例是/opt/bigdata/data/hadoop目錄)指定的目錄下是否有了dfs目錄,若是有,說明格式化成功。
ll /opt/bigdata/data/hadoop
其中/opt/bigdata/data/hadoop/dfs/name/current下文件以下:
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
jps
HDFS上建立目錄:
hdfs dfs -mkdir /demo1
上傳本地文件到HDFS上:
hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /demo1
讀取HDFS上的文件內容:
hdfs dfs -cat /demo1/core-site.xml
從HDFS上下載文件到本地:
hdfs dfs -get /demo1/core-site.xml
更多hdfs文件系統的命令能夠查看:
hdfs dfs
默認沒有mapred-site.xml文件,可是有個mapred-site.xml.template配置模板文件。複製模板生成mapred-site.xml:
cd /opt/bigdata/hadoop/
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
添加配置
vim etc/hadoop/mapred-site.xml
指定mapreduce運行在yarn框架上。
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
vim etc/hadoop/yarn-site.xml
yarn.nodemanager.aux-services配置了yarn的默認混洗方式,選擇爲mapreduce的默認混洗算法。
yarn.resourcemanager.hostname指定了Resourcemanager運行在哪一個節點上。
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>zy1</value>
</property>
</configuration>
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
能夠看到ResourceManager、NodeManager已經啓動成功了。
YARN的Web客戶端端口號是8088,經過http://106.15.74.155:8088/能夠查看當前執行的job。
注意:因爲使用到了8088端口。須要在阿里雲中配置入規則,具體能夠參考阿里雲官方收藏:同一個地域、不一樣帳號下的實例實現內網互通 。
hdfs的Web客戶端端口號是50070,經過http://106.15.74.155:50070/能夠查看。
在Hadoop的share目錄裏,自帶了一些jar包,裏面帶有一些mapreduce實例小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar,能夠運行這些例子體驗剛搭建好的Hadoop平臺,咱們這裏來運行最經典的WordCount實例。
在hdfs文件系統上建立測試用的Input文件:
hdfs dfs -mkdir -p /wordcountdemo/input
建立原始文件:
在本地/opt/bigdata/data/hadoop目錄建立一個文件wc.input,vim /opt/bigdata/data/hadoop/wc.input內容以下:
doop mapreduce hive hbase spark storm sqoop hadoop hive spark hadoop
將wc.input文件上傳到HDFS的/wordcountdemo/input目錄中:
hdfs dfs -put /opt/bigdata/data/hadoop/wc.input /wordcountdemo/input
運行WordCount MapReduce Job:
cd /opt/bigdata/hadoop yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /wordcountdemo/input /wordcountdemo/output
注意:若是執行一直卡在map 0% reduce 0%,多是因爲硬件配置較低的緣由:
更多錯誤能夠查看日誌:$HADOOP_HOME/logs:
more $HADOOP_HOME/logs/yarn-root-nodemanager-zy1.log more $HADOOP_HOME/logs/yarn-root-resourcemanager-zy1.log
若是運行成功,查看輸出結果目錄:
hdfs dfs -ls /wordcountdemo/output
output目錄中有兩個文件:
查看輸出文件內容:
hdfs dfs -cat /wordcountdemo/output/part-r-00000
結果是按照鍵值排好序的。
hadoop-daemon.sh stop namenode hadoop-daemon.sh stop datanode hadoop-daemon.sh stop secondarynamenode yarn-daemon.sh stop resourcemanager yarn-daemon.sh stop nodemanager
Hadoop開啓歷史服務能夠在web頁面上查看Yarn上執行job狀況的詳細信息。能夠經過歷史服務器查看已經運行完的Mapreduce做業記錄,好比用了多少個Map、用了多少個Reduce、做業提交時間、做業啓動時間、做業完成時間等信息。
mr-jobhistory-daemon.sh start historyserver
開啓後,能夠經過Web頁面查看歷史服務器:http://106.15.74.155:19888/
MapReduce是在各個機器上運行的,在運行過程當中產生的日誌存在於各個機器上,爲了可以統一查看各個機器的運行日誌,將日誌集中存放在HDFS上,這個過程就是日誌彙集。
Hadoop默認是不啓用日誌彙集的。在yarn-site.xml文件裏配置啓用日誌彙集。
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>106800</value> </property>
yarn.log-aggregation-enable:是否啓用日誌彙集功能。
yarn.log-aggregation.retain-seconds:設置日誌保留時間,單位是秒。
重啓Yarn進程:
stop-yarn.sh start-yarn.sh
重啓HistoryServer進程:
mr-jobhistory-daemon.sh stop historyserver mr-jobhistory-daemon.sh start historyserver
測試日誌彙集:運行一個demo MapReduce,使之產生日誌:
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /wordcountdemo/input /wordcountdemo/output
運行Job後,就能夠在歷史服務器Web頁面查看各個Map和Reduce的日誌了。
徹底分部式是真正利用多臺Linux主機來進行部署Hadoop,對Linux機器集羣進行規劃,使得Hadoop各個模塊分別部署在不一樣的多臺機器上。
若是以前你是在虛擬機上建立了zy1主機,那麼你能夠利用Vmware的克隆功能建立zy二、zy3主機,而後你須要按照第二節的步驟,配置網絡、主機名、Host、這裏就不過多介紹了。
下面咱們以阿里雲的三臺主機zy一、zy二、zy3爲例,搭建徹底分佈式。
zy1 | zy2 | zy3 |
---|---|---|
NameNode | ResourceManage | |
DataNode | DataNode | DataNode |
NodeManager | NodeManager | NodeManager |
HistoryServer | SecondaryNameNode |
在zy1節點安裝新的Hadoop:
爲了和以前zy1機器上安裝僞分佈式Hadoop區分開來,咱們將zy1上的Hadoop服務都中止掉,將僞分佈式hadoop的安裝目錄改成hadoop-wei,修改配置core-site.xml,中的hadoop.tmp.dir爲/opt/bigdata/data/hadoop-wei,而後/opt/bigdata/下安裝另一個Hadoop。
hadoop-daemon.sh stop namenode hadoop-daemon.sh stop datanode hadoop-daemon.sh stop secondarynamenode yarn-daemon.sh stop resourcemanager yarn-daemon.sh stop nodemanager
cd /opt/bigdata
mv hadoop hadoop-wei
vim hadoop-wei/etc/hadoop/core-site.xml #修改hadoop.tmp.dir
mv /opt/bigdata/data/hadoop /opt/bigdata/data/hadoop-wei
咱們採用先在第一臺機器上解壓、配置Hadoop,而後再分發到其餘兩臺機器上的方式來安裝集羣。
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz tar -zxvf hadoop-2.8.5.tar.gz -C /opt/bigdata
mv hadoop-2.8.5 hadoop
因爲在僞分佈式安裝時,咱們已經配置了hadoop的環境變量,這裏就不須要再重複配置了。咱們能夠經過如下命令驗證:
echo $HADOOP_HOME
好比修改hadoop-env.sh:
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
修改JAVA_HOME參數爲:
export JAVA_HOME=/usr/lib/jvm/java
vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
添加內容以下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://zy1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/bigdata/data/hadoop</value> </property>
<property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/dfs/data</value> </property> </configuration>
mkdir /opt/bigdata/data/hadoop
注意:NameNode使用到了9000端口,用於創建與datanode節點的通訊。所以namenode節點須要在阿里雲中配置入規則,具體能夠參考阿里雲官方收藏:同一個地域、不一樣帳號下的實例實現內網互通 。
vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
添加如下內容:
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>zy3:50090</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.client.use.datanode.hostname</name> <value>true</value> </property> <property> <name>dfs.datanode.use.datanode.hostname</name> <value>true</value> </property> </configuration>
fs.client.use.datanode.hostname:是否客戶端應該使用DN的HostName,在鏈接DN時,默認是使用IP;(必須設置爲true)
dfs.datanode.use.datanode.hostname:是否DN應該使用HostName鏈接其它DN,在數據傳輸時。默認是是IP。(必須設置爲true)
cd hadoop
vim etc/hadoop/masters
vim etc/hadoop/slaves
masters修改成:
slavers:
masters文件是指定HDFS的主節點。
slaves文件是指定HDFS上有哪些DataNode節點。
默認沒有mapred-site.xml文件,可是有個mapred-site.xml.template配置模板文件。複製模板生成mapred-site.xml:
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
添加配置:
vim etc/hadoop/mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>zy1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>zy1:19888</value> </property> </configuration>
vim etc/hadoop/yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>zy2</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>106800</value> </property> </configuration>
yarn.log-aggregation-enable
是配置是否啓用日誌彙集功能;yarn.log-aggregation.retain-seconds
是配置彙集的日誌在HDFS上最多保存多長時間;Hadoop集羣中的各個機器間會相互地經過SSH訪問,每次訪問都輸入密碼是不現實的,因此要配置各個機器間的SSH是無密碼登陸的。
在zy1上生成公鑰:
ssh-keygen -t rsa
一路回車,都設置爲默認值,而後再當前用戶的Home目錄下的.ssh
目錄中會生成公鑰文件(id_rsa.pub)
和私鑰文件(id_rsa)
。
分發公鑰:
ssh-copy-id zy1 ssh-copy-id zy2 ssh-copy-id zy3
設置zy二、zy3到其餘機器的無密鑰登陸:一樣的在zy二、zy3上生成公鑰和私鑰後,將公鑰分發到三臺機器上。
經過Scp分發:Hadoop根目錄下的share/doc目錄是存放的hadoop的文檔,文件至關大,建議在分發以前將這個目錄刪除掉,能夠節省硬盤空間並能提升分發的速度。
cd /opt/bigdata rm -rf hadoop/share/doc scp -r /opt/bigdata/hadoop/ zy2:/opt/bigdata scp -r /opt/bigdata/hadoop/ zy3:/opt/bigdata
在每一個節點下執行:
mkdir /opt/bigdata/data/hadoop
在使用hadoop以前,全新的HDFS安裝須要進行格式化。經過建立存儲目錄和初始化版本的namenode持久數據結構,格式化將建立一個空的文件系統。
在NameNode機器上(節點zy1)執行格式化:
hdfs namenode -format
注意:若是須要從新格式化NameNode,須要先將原來NameNode和DataNode下的文件所有刪除,否則會報錯,NameNode和DataNode所在目錄是在core-site.xml中hadoop.tmp.dir、dfs.namenode.name.dir、dfs.datanode.data.dir屬性配置的。
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://zy1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/bigdata/data/hadoop</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/dfs/data</value> </property> </configuration>
每次格式化,默認是建立一個集羣ID,並寫入NameNode的VERSION文件中(VERSION文件所在目錄爲dfs/name/current )。
此時並無將集羣ID寫入DataNode的VERSION之中,因爲namenode管理全部的文件系統的元數據,datanode能夠動態的加入或離開集羣,因此初始的格式化過程不涉及datanode。
只有在啓動HDFS時,纔會將ID寫入DataNode的VERSION之中。若是咱們從新格式化HDFS,從新格式化時,默認會生成一個新的集羣ID,若是不刪除原來的數據目錄,會致使namenode中的VERSION文件中是新的集羣ID,而DataNode中是舊的集羣ID,不一致時會報錯。
在zy1節點運行如下命令:
start-dfs.sh
zy3中的QuorumPeerMain進程不用管,這個是zookeeper進程。
咱們來查看如下各個節點的NameNode和DataNode目錄:
能夠看到已經將集羣ID寫入DataNode的VERSION之中:
start-yarn.sh
在zy2上啓動ResourceManager:
yarn-daemon.sh start resourcemanager
由於咱們規劃的是在zy1服務器上運行MapReduce日誌服務,因此要在zy1上啓動:
mr-jobhistory-daemon.sh start historyserver
如今來查看如下每一個節點下的日誌文件:
hdfs的Web客戶端端口號是50070,經過http://106.15.74.155:50070/能夠查看。
YARN的Web客戶端端口號是8088,因爲ResourceManager設置在zy2節點上,所以經過http://47.103.134.70:8088/查看當前執行的job。
測試部分能夠參考僞分佈式測試內容http://www.javashuo.com/article/p-hsmxgagy-by.html。
在測試時會出現以下錯誤:
咱們須要配置阿里雲的入規則,開放三個節點的50010端口:
此外,咱們還須要在阿里雲安全組規則入規則開放每一個節點的803一、803二、50020等等。每一個節點具體須要開放什麼端口,咱們能夠經過查看日誌得到,以節點zy2,爲例:
cat logs/hadoop-root-datanode-zy2.log
cat logs/yarn-root-nodemanager-zy2.log
經過如下命令,能夠查看該節點監聽的端口:
netstat -ant
若是實在不知道須要在阿里雲安全組規則中配置哪些端口,那就打開所有端口,可是這樣可能並不安全:
Hadoop更多端口相關的配置參考:hadoop端口號配置信息、ResourceManager相關配置參數。
更多Hadoop的參數配置能夠慘開:hadoop 參數配置。
在各個節點下運行以下命令:
cd /opt/bigdata/hadoop sbin/stop-all.sh
在每一個節點運行以下命令:
cd /opt/bigdata/hadoop sbin/stop-all.sh rm -rf logs/* rm -rf ../data/hadoop/*
在namenode節點(zy1)運行:
hdfs namenode -format
而後在每一個節點運行相應啓動hadoop的命令。
若是hadoop啓動出現出錯,要學會查看日誌,日誌位於hadoop安裝路徑下的logs目錄下。
外網沒法方位HDFS能夠參考:外網沒法訪問雲主機HDFS文件系統。
參考文章