Hadoop在大數據技術體系中的地位相當重要,Hadoop是大數據技術的基礎。java
這是一篇記錄我本身學習的文章,Hadoop的學習方法不少,網上也有不少學習路線圖。node
Hadoop是一個可以對海量數據進行分佈式處理的系統架構。我採用的是hadoop-2.8.0,它主要包含3大塊:算法
Hadoop的核心是:HDFS和MapReduce。apache
HDFS(Hadoop Distributed File System,Hadoop 分佈式文件系統)是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS 能提供高吞吐量的數據訪問,適合那些有着超大數據集(largedata set)的應用程序。HDFS負責大數據的存儲,經過將大文件分塊後進行分佈式存儲方式,突破了服務器硬盤大小的限制,解決了單臺機器沒法存儲大文件的問題,HDFS是個相對獨立的模塊,能夠爲YARN提供服務,也能夠爲HBase等其餘模塊提供服務。安全
核心bash
HDFS是一個主從結構,一個HDFS集羣由一個名字節點(NameNode)和多個數據節點(DataNode)組成。服務器
1.高容錯性 HDFS 認爲全部計算機均可能會出問題,爲了防止某個主機失效讀取不到該主機的塊文件,它將同一個文件塊副本分配到其它某幾個主機上,若是其中一臺主機失效,能夠迅速找另外一塊副本取文件。數據自動保存多個節點;備份丟失後,自動恢復。網絡
2.海量數據的存儲 很是適合上T 級別的大文件或者一堆大數據文件的存儲數據結構
3.文件分塊存儲 HDFS 將一個完整的大文件平均分塊(一般每塊64M)存儲到不一樣計算機上,這樣讀取文件能夠同時從多個主機取不一樣區塊的文件,多主機讀取比單主機讀取效率要高得多得多。架構
4.移動計算 在數據存儲的地方進行計算,而不是把數據拉取到計算的地方,下降了成本,提升了性能!
5.流式數據訪問 一次寫入,並行讀取。不支持動態改變文件內容,而是要求讓文件一次寫入就不作變化,要變化也只能在文件末添加內容。
6.可構建在廉價的機器上 經過多副本提升可靠性,提供了容錯和恢復機制。HDFS 能夠應用在普通PC 機上,這種機制可以讓一些公司用幾十臺廉價的計算機就能夠撐起一個大數據集羣。
做用
FsImage和Editlog是HDFS的核心數據結構。這些文件的損壞會致使整個集羣的失效。所以,名字節點能夠配置成支持多個FsImage和EditLog的副本。任何FsImage和EditLog的更新都會同步到每一份副本中。
做用
執行流程
做用
文件解析
能夠經過修改hdfs-site.xml的dfs.replication屬性設置產生副本的個數!默認是3!
基本操做
MapReduce分佈式處理框架爲海量的數據提供了計算。MapReduce是一個計算框架,它給出了一種數據處理的方式,即經過Map階段、Reduce階段來分佈式地流式處理數據。它只適用於大數據的離線處理,對實時性要求很高的應用不適用。
簡介
原語一般由若干條指令組成,用來實現某個特定的操做。經過一段不可分割的或不可中斷的程序實現其功能。且常駐內存。可是這樣一來,若是原語執行須要的開銷超過了機器能給予的開銷,則該原語在機器上沒法執行,一般解決該問題的辦法是增長機器配置,但計算機的配置在上層每提高一點所須要的資金都是翻倍的。所以根據分佈式文件系統的原理,MapReduce誕生了。它將原語分紅了兩個步驟即map()和reduce(),同時兩個階段還能夠分紅多個模塊在不一樣的機器上執行。
vi /etc/prifile
複製代碼
添加配置
export HADOOP_HOME="/opt/modules/hadoop-2.8.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
複製代碼
執行:
source /etc/profile
複製代碼
使得配置生效,並驗證參數
echo ${HADOOP_HOME}
複製代碼
修改JAVA_HOME參數爲java的安裝路徑
如何查看java安裝路徑:
4.配置core-site.xml
如下操做都是在hadoop解壓後的目錄中操做
vi etc/hadoop/core-site.xml
複製代碼
其中:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
複製代碼
若是是全分佈模式配置,該配置能夠以下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
</configuration>
複製代碼
更多配置屬性介紹能夠查看這裏
5.配置hdfs-site.xml
vi etc/hadoop/hdfs-site.xml
複製代碼
dfs.replication - 配置的是HDFS存儲時的備份數量,由於這裏是僞分佈式環境只有一個節點,因此這裏設置爲1。
hdfs namenode -format
複製代碼
格式化是對HDFS這個分佈式文件系統中的DataNode進行分塊,統計全部分塊後的初始元數據的存儲在NameNode中。格式化後,查看core-site.xml裏hadoop.tmp.dir(本例是/opt/data目錄)指定的目錄下是否有了dfs目錄,若是有,說明格式化成功。
ll /opt/data/tmp
複製代碼
注意:
sudo chown -R hadoop:hadoop /opt/data
複製代碼
查看NameNode格式化後的目錄
ll /opt/data/tmp/dfs/name/current
複製代碼
hdfs dfs -mkdir /demol
複製代碼
經過hdfs建立的目錄咱們直接用ls是查看不到的,此時可使用如下命令查看
hdfs dfs -ls /
複製代碼
hdfs dfs -put {本地文件路徑} /demol
複製代碼
這裏我遇到了一個問題,上傳的時候提示我datanode沒有啓動,後來我用jps命令查看了發現datanode自動關閉了,這個問題的緣由是由於datanode的clusterID 和 namenode的clusterID 不匹配。
解決辦法,檢查hdfs-site.xml和core-site.xml的配置,若是沒有錯誤,則查看tmp/dfs下的name和data的VERISON中的集羣id是否匹配,若是不匹配則刪除datanode中current下的文件而後從新啓動;或者直接修改集羣id
hdfs dfs -get {HDFS文件路徑}
複製代碼
默認沒有mapred-site.xml文件,可是有個mapred-site.xml.template配置模板文件。複製模板生成mapred-site.xml
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
複製代碼
添加配置以下:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
複製代碼
指定mapreduce運行在yarn框架上。
配置yarn-site.xml,添加配置以下:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>0.0.0.0</value>
</property>
複製代碼
更多屬性查看
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
複製代碼
經過jsp查看是否成功開啓
在hadoop的share目錄裏,自帶了一些jar包,裏面帶有一些mapreduce實例的小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,這裏運行一個經典的單詞統計實例
建立測試用的input文件
建立輸入目錄並將文件上傳上去
hdfs dfs -mkdir -p /wordcount/input
hdfs dfs -put /opt/data/wc.input /wordcount/input
複製代碼
運行wordcount mapreduce job
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar wordcount /wordcount/input /wordcount/output
複製代碼
查看結果目錄
hdfs dfs -ls /wordcount/output
複製代碼
output目錄中有兩個文件,_SUCCESS文件是空文件,有這個文件說明Job執行成功。
part-r-00000文件是結果文件,其中-r-說明這個文件是Reduce階段產生的結果,mapreduce程序執行時,能夠沒有reduce階段,可是確定會有map階段,若是沒有reduce階段這個地方有是-m-。
一個reduce會產生一個part-r-開頭的文件。
查看結果文件