我又回來了,這兩天學校事情有點多,因此沒有怎麼勤快更新,昨天看到有小夥伴留言催更,別說,第一次被催更的感受仍是挺幸福的,回到正題,在上一篇文章寫給後端的Hadoop初級入門教程(三):Hadoop運行環境搭建中,咱們主要講了一下Hadoop的基本環境的搭建,這個雖然簡單,可是很是重要,若是基本環境都沒有,後面代碼跑不起來講啥都是扯蛋,Hadoop雖然是大數據分佈式框架,但不是誰都能搞起來一套分佈式環境,有的電腦配置比較低,跑一臺虛擬機就已經不堪重負了,跑個集羣直接cpu就爆炸了,可是電腦配置低也想使用hadoop。這怎麼辦呢,因而Hadoop就支持另一種模式運行,那就是僞分佈式運行模式,就是否是分佈式運行,可是比較像分佈式。今天呢,咱們就從僞分佈式運行模式的配置入手,經過一步一步修改配置文件,來詳細實現咱們Hadoop的僞分佈式運行的一個配置過程。php
不說廢話,直接上東西。html
首先咱們要作的就是啓動配置並啓動咱們的Hadoop
分佈式文件系統,找到咱們的hadoop環境配置文件,hadoop-env.sh
,我這裏呢路徑以下:java
/opt/module/hadoop-2.7.2/etc/hadoop
複製代碼
而後就是咱們須要拿到咱們以前配置的JAVA_HOME
地址,命令以下:node
[hanshu@hadoop100 hadoop]$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk/jre/
複製代碼
使用vim編輯器打開hadoop-env.sh
文件,我這裏只列舉一部分linux
# The java implementation to use.
export JAVA_HOME=${JAVA_HOME}
# The jsvc implementation to use. Jsvc is required to run secure datanodes
# that bind to privileged ports to provide authentication of data transfer
# protocol. Jsvc is not required if SASL is configured for authentication of
# data transfer protocol using non-privileged ports.
#export JSVC_HOME=${JSVC_HOME}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
複製代碼
修改JAVA_HOME
的值爲咱們上文獲取到的java
安裝目錄:git
# The java implementation to use.
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk/jre/
複製代碼
保存,配置,一鼓作氣。github
而後咱們須要配置咱們的NameNode
和咱們的DataNode
,這個須要在core-site.xml
這個配置文件裏面配置,這個配置文件仍然在咱們的etc/hadoop
目錄下.web
咱們使用vim打開,內容以下:shell
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- 省去一堆註釋 -->
<configuration>
</configuration>
複製代碼
能夠看到裏面空空如也,如一塊還沒有開墾的荒地,咱們略微一發善心,將它充分利用,在裏面添加以下內容:編程
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- 省去一堆註釋 -->
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
複製代碼
這還沒完,以前咱們好像提到過,默認hadoop
文件是會建立三個副本,這我如今僞分佈式,只有一個電腦,只有一個地方存東西,變不出來仨,因此接下來咱們須要修改hadoop
默認副本數量爲1,這個配置文件叫:hdfs-site.xml
仍是在這個目錄下,咱們使用vim打開一探究竟:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- 空空如也. -->
<configuration>
</configuration>
複製代碼
啥也沒有,不要緊,加上咱們的配置不就有了嗎,以下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- 空空如也. -->
<configuration>
<!-- 指定HDFS副本的數量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
複製代碼
這個時候是否是就能啓動咱們的HDFS
系統了?理論上來講是沒問題的,可是因爲是第一次啓動,仍是建議你們先將NameNode
格式化一下,這一步的做用就相似於不少時候咱們剛買來U盤,須要先格式化一下再用是一個道理,固然,沒有人沒事兒就格式化本身U盤,因此除了第一次以後不建議你們沒事兒就給NameNode
卡卡格式化一會兒,由於格式化NameNode,會產生新的集羣id,致使NameNode和DataNode的集羣id不一致,集羣找不到已往數據。因此,格式NameNode時,必定記得要先刪除data數據和log日誌,而後再格式化NameNode,要不就有可能致使集羣啓動失敗
格式化NameNode
:
[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs namenode -format
複製代碼
輸出的內容太多了,我隨便複製給大家看這篇文章分分鐘成萬字長文了,因此若是最後沒有報錯的話,那就是格式化成功了,就跟你格式化優盤同樣,不多會有格式化失敗的狀況。
啓動NameNode
:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-hanshu-namenode-hadoop100.out
複製代碼
提示:
這裏面用的都是相對路徑,注意個人目錄,注意個人目錄,注意個人目錄。
啓動DataNode
:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-hanshu-datanode-hadoop100.out
複製代碼
弄完以後,這下咱們以前點名配置的java
開發插件jps
就派上用場了,以下所示:
[hanshu@hadoop100 hadoop-2.7.2]$ jps
4243 Jps
4038 NameNode
4157 DataNode
複製代碼
至此,咱們的Hdfs
算是配置完成了,固然,這還不夠,你口口聲聲說什麼分佈式文件系統,那難道就沒有什麼文件管理器這種讓我能看着(zao)的東西嗎?固然有,hadoop
提供了web端來幫助咱們直觀的查看HDFS
文件系統,網址以下:
http://localhost:50070/dfshealth.html#tab-overview
打開後長這樣
不過首頁咱們通常不怎麼用,真正查看文件的地方在,算了,懶得打字了,直接看圖吧:
課外小知識:
hadoop 日誌文件在 /opt/module/hadoop-2.7.2/logs 路徑下面,若是集羣啓動失敗,或者出現錯誤,能夠在這裏查看錯誤信息。
既然是文件系統,那確定得支持什麼建立文件夾,建立文件這種常規操做吧,要不都很差意思叫本身文件系統,那必須的,因爲今天咱們的重點是配置,不是使用,因此我就簡單列舉幾個先,往後我寫到HDFS
的時候,再詳細地列舉各類花式文件操做的命令 。
建立一個文件夾:
[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /user/hanshu/input
複製代碼
把我剛剛建立的hanshuzuishuai.txt
這個文件傳到剛纔建立的文件夾裏面去:
[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -put hanshuzuishuai.txt /user/hanshu/input/
複製代碼
查看上傳的文件是否正確:
[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -ls /user/hanshu/input/
Found 1 items
-rw-r--r-- 1 hanshu supergroup 13 2019-12-20 15:07 /user/hanshu/input/hanshuzuishuai.txt
複製代碼
查看文件內容:
[hanshu@hadoop100 hadoop-2.7.2]$ bin/hdfs dfs -cat /user/hanshu/input/hanshuzuishuai.txt
韓數最帥
複製代碼
你看看,這虛擬機,瞎說什麼大實話,管不住了,你們見諒,別和小虛擬機通常見識(滑稽)。
在web端看看咱們文件傳上去了沒:
下載文件內容:
[hanshu@hadoop100 hadoop-2.7.2]$ hdfs dfs -get /user/hanshu/input/hanshuzuishuai.txt
複製代碼
刪除文件內容:
[hanshu@hadoop100 hadoop-2.7.2]$ hdfs dfs -rm -r /user/hanshu/input/hanshuzuishuai.txt
複製代碼
到這纔算Hdfs
簡單地寫完了,累死我了,從兩點敲到三點多,早知道出個三部曲了,分開寫,一天寫一點,算了,都寫到這了,今天寫完吧,繼續幹:
HDFS咱們是配置完了,剩下的就是配置咱們的Yarn了,真的,若是如今你Yarn還不知道是啥,我建議你把我上上一篇組成部分看看再來看這塊內容,配置Yarn也不復雜,也是修改那幾個配置文件就好了。
首先第一個落網的就是yarn-env.sh
,第一個就改它,仍是在那個etc/hadoop
路徑下面。使用vim打開:
# User for YARN daemons
export HADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}
# resolve links - $0 may be a softlink
export YARN_CONF_DIR="${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}"
# some Java parameters
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
複製代碼
配置JAVA_HOME:
export JAVA_HOME= /usr/lib/jvm/java-1.8.0-openjdk/jre/
複製代碼
第二個不幸要被改的是yarn-site.xml
,使用vim打開:
<?xml version="1.0"?>
<configuration>
<!-- 依然空空如也 -->
</configuration>
複製代碼
不要緊,立刻就不空了,添加以下內容:
<?xml version="1.0"?>
<configuration>
<!-- Reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
</configuration>
複製代碼
第三個輪到咱們的mapred-env.sh
配置文件了,使用vim打開,
看到JAVA_HOME了嗎,OMG,兄弟們,朋友們,就這個,配他!(李佳奇梗)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk/jre/
複製代碼
最後就是修改mapred-site.xml
了,這個時候有人要問了,我沒找着啊,完了,我沒這個文件,我和韓數的教程脫軌了,這之後咋學啊,學不會了,仍是回去賣哈密瓜賣烤紅薯吧。
淡定,看到那個mapred-site.xml.template
文件了嗎,咱們把它改爲mapred-site.xml
,而後再配它就好了:
[hanshu@hadoop100 hadoop]$ mv mapred-site.xml.template mapred-site.xml
複製代碼
使用vim打開,你們猜裏面會是什麼?每錯,空空如也,修改配置文件以下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR運行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
複製代碼
到這,咱們的yarn也算配好了,那是否是能啓動了?
且慢,咱們以前說過,Yarn是幹啥的,作資源調度的,因此啓動Yarn以前咱們的NameNode
和 DataNode
必定要啓動起來,要不Yarn啓動的時候一看,沒資源讓本身調度,心想那還不如回家睡覺呢。
啓動ResourceManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-hanshu-resourcemanager-hadoop100.out
複製代碼
啓動NodeManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-hanshu-nodemanager-hadoop100.out
複製代碼
用jps命令看看啓動成功了沒:
[hanshu@hadoop100 hadoop-2.7.2]$ jps
5986 Jps
5620 ResourceManager
4038 NameNode
4157 DataNode
5870 NodeManager
複製代碼
歐了,這個時候確定會有人內心面想,你怎麼這麼熟練呢,hhh,緣由很簡單,我怎麼可能把我中間配錯的那些坑寫文章裏(得意)。
一樣的,Yarn也提供了相關的web端來幫助咱們查看和使用:
到這一步,咱們Yarn也算是配置完成了。
爲了查看程序的歷史運行狀況,須要配置一下歷史服務器。這個就好配多了,打開咱們的mapred-site.xml
配置文件,加入如下內容:
<!-- 歷史服務器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>localhost:10020</value>
</property>
<!-- 歷史服務器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>localhost:19888</value>
</property>
複製代碼
啓動歷史服務器:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/module/hadoop-2.7.2/logs/mapred-hanshu-historyserver-hadoop100.out
複製代碼
使用jps查看是否啓動成功:
[hanshu@hadoop100 hadoop-2.7.2]$ jps
5620 ResourceManager
6565 Jps
4038 NameNode
4157 DataNode
5870 NodeManager
6479 JobHistoryServer
複製代碼
不用多說,web端,也有
http://localhost:19888/jobhistory
結束了嗎?沒有,感受有好多東西要配啊。我也以爲。
什麼是日誌彙集呢,就是班委收做業,咱們把日誌都收集起來放一塊,之後程序再出了什麼問題,方便調試:
由於要從新開始彙集日誌,因此要從新啓動NodeManager
、ResourceManager
和HistoryManager
。
一樣須要修改配置文件,感受本身又學會了一項編程方法:
面向配置編程。
配置yarn-site.xml
增長以下配置:
<!-- 日誌彙集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日誌保留時間設置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
複製代碼
關閉NodeManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop resourcemanager
stopping resourcemanager
複製代碼
關閉ResourceManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager
複製代碼
關閉HistoryManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh stop historyserver
stopping historyserver
複製代碼
啓動NodeManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-hanshu-nodemanager-hadoop100.out
複製代碼
啓動ResourceManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-hanshu-resourcemanager-hadoop100.out
複製代碼
啓動HistoryManager:
[hanshu@hadoop100 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/module/hadoop-2.7.2/logs/mapred-hanshu-historyserver-hadoop100.out
複製代碼
到這裏咱們的僞分佈式運行環境就真的已經配置完成了。
真的,不騙你。
今天咱們主要寫了Hadoop僞分佈式環境的配置,我想已經不能再詳細了,固然後面還有一個番外篇,畢竟如今咱們HDFS和Yarn都配了,MR尚未,因此,咱們下面將以咱們此次配置的爲基礎,將出一期番外篇,運行官方自帶的WordCount案例,看看咱們的日誌收集,Yarn是如何調度的。最後:
很是感謝能讀到這裏的朋友,大家的支持和關注是我堅持高質量分享下去的動力。
相關代碼已經上傳至本人github。必定要點個star啊啊啊啊啊啊啊
萬水千山老是情,給個star行不行
歡迎點贊,關注我,有你好果子吃(滑稽)