記錄Hadoop學習---HDFS
一、Hadoop簡介:
1、概念:
一個開源(免費)、高可靠(資料有備份,如果資料丟失,Hadoop可以自動恢復)、可擴充套件(靈活性很高,可以隨時新增服務節點)的分散式(多臺伺服器並行處理任務)計算框架。
2、解決的問題:
* 海量資料的儲存--HDFS
* 海量資料的分析--MapReduce
* 分散式資源排程--Yarn
3、產生背景:
受Google三篇論文啟發(GFS,MapReduce,BigTable)。
4、特點:
* 擴容能力:能可靠的儲存和處理千兆位元組(PB)資料;
* 成本低:可以通過普通機器組成的伺服器群來分發以及處理資料,這些伺服器群總計可達數千個節點。
* 高效率:通過分發資料,Hadoop可以在資料所在的節點上並行的處理它們,這使得速度非常快。
* 可靠性:hadoop能自動維護資料的多分副本,並且在任務失敗後能自動重新部署。
5、應用場景:
* 日誌分析
* 基於海量資料的線上應用
* 推薦系統
* 計算廣告
* 複雜演算法
* 網盤
* 搜尋引擎
* 。。。。。。
6、
7、核心元件:
* Hadoop Common: 為其他Hadoop模組提供基礎設施;
* Hadoop HDFS:一個高可靠、高吞吐量的分散式檔案系統;
* Hadoop MapReduce:一個分散式的離線平行計算框架;
* Hadoop YARN:一個新的MapReduce框架,任務排程與資源管理。
8、分散式(並行處理任務)離線(高延遲)計算框架--MapReduce
* Map任務處理:
① 讀取輸入檔案內容,解析成key、value對;
② 重寫map方法,編寫業務邏輯輸出新的key、value對;
③ 對輸出的key、value對進行分割槽(Partitioner類);
④ 對資料按照key進行排序、分組,相同key的value放到一個集合中。
* Reduce任務處理:
① 對多個map任務的輸出,按照不同的分割槽,通過網路copy到不同的reduce節點;
② 對多個map任務的輸出進行合併、排序,寫reduce函式自己的邏輯,對輸入的key、vlaue對處理,轉換成新的key、value對輸出;
③ 把reduce的輸出儲存到檔案中。
二、Hadoop前置環境安裝
1、Linux環境:
* VMWare虛擬機器、CentOS、JDK
2、配置虛擬機器:
* 關閉防火牆:service itables stop (這樣關閉在下次重啟虛擬機器時無效,需要永久關閉 chkconfig iptables off);
* 禁用selinux:vim /etc/sysconfig/selinux ,把“SELINUX”改為“disabled”;
3、修改主機名:
* 檢視當前主機名:hostname
* 修改主機名:hostname newName(虛擬機器重啟,主機名會還原),修改配置檔案永久修改主機名 vim /etc/sysconfig/network , 把“HOSTNAME”改為“新的主機名”;
4、配置對映關係,把ip地址指向新的主機名:
* vim /etc/hosts 加入一行 172.16.11.178 hadoop 儲存,reboot 重啟虛擬機器;
5、配置ssh免密碼登入:
* 使用ssh遠端登入本機: ssh 172.16.11.178 yes 輸入密碼 ,每次遠端都需要輸入密碼;
* 首先生成金鑰:ssh-keygen -t rsa 4次回車 ;
* 複製金鑰到本機:ssh-copy-id 172.16.11.178 輸入密碼,確定,完成,再次使用ssh 172.16.11.178 就不需要輸入密碼了。
6、配置JAVA環境:
* cd /home
mkdir tools (存放工具安裝包)
mkdir softwares (存放安裝的軟體)
mkdir datas (存放測試用的資料)
* 檢視系統是否自動安裝jkd :rpm -qa|grep jdk
* 檢視系統是否安裝java :rpm -qa|grep java
* 安裝上傳工具 lrzsz:yum install -y lrzsz
* 上傳jdk : rz 選擇jdk;
* 解壓jdk到sorfwares目錄下: tar -zxf jdk-x-x-x.tar.gz -C /home/softwares/
* 配置環境變數:進入jdk目錄下 cd /home/softwares/jdk-x-x/ , 檢視安裝目錄 pwd ,
修改配置檔案:vim /etc/profile,
加入 export JAVA_HOME=/home/softwares/jdk-x-x
export PATH=$PATH:$JAVA_HOME/bin
重新整理配置檔案:source /etc/profile
輸入 java -version檢視jdk是否安裝成功。
7、建立普通使用者:
* adduser hadoop01
輸入密碼 admin
再次輸入 admin 成功
切換使用者 su hadoop01
檢視當前使用者 whoami
配置許可權 切換到root su 輸入密碼
新增檔案寫許可權 chmod u+x /etc/sudoers
編輯檔案 vim /etc/sudoers
加入 hadoop01 ALL=(ALL) ALL
至此,hadoop01擁有了sudo許可權。
三、Hadoop偽分散式安裝
1、Hadoop執行模式:
* 本地模式:所有Hadoop的守護程序執行在一個jvm中;
* 偽分散式:所有Hadoop的守護程序各自執行在自己的jvm中;(適合開發學習)
* 叢集模式:多臺機器來搭建分散式叢集,每個程序執行在獨立的jvm中,並對Namenode和ResourceMananger做Ha配置(適合企業使用)
2、安裝文件:
http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/SingleCluster.html
3、下載Hadoop:
官方都是32位的,需要下載原始碼自己編譯成64位的。
hadoop-x-x-src.tar.gz 原始碼包,解壓。
編譯需要的工具:
上傳,解壓到softwares;
配置maven、findbugs的環境變數(同java環境變數)mvn -v findbugs -version
安裝protobuf,通過make來安裝:
安裝make和系統依賴:
yum -y install autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++
cd /home/softwares/protobuf-2.5.0/
./configure
make install
編譯成64位hadoop:
cd /home/softwares/hadoop-x-x-src/
mvn package -Pdist,native,docs -DskipTests -Dtar
編譯後的檔案位於maven目錄裡
4、設定hadoop
* 進入hadoop安裝目錄 cd /home/softwares/hadoop-x-x/etc/hadoop/
* vim hadoop-env.sh 設定java環境變數 echo $JAVA_HOME
* 把“export JAVA_HOME=”改為“/home/softwares/jdk-x-x”
* vim core-site.xml 加入:
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop:8020</value>
</property>
建立/home/softwares/hadoop-2.7.6/data/tmp這個目錄
<property>
<name>hadoop.tmp.dir</name>
<value>/home/softwares/hadoop-2.7.6/data/tmp</value>
</property>
fs.defaultFS:指定Namenode的通訊地址8020,
hadoop.tmp.dir:指定執行中產生資料的存放目錄/data/tmp。
*vim hdfs-site.xml 加入:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
* 格式化hdfs檔案系統:
cd /home/softwares/hadoop-x-x
bin/hadoop namenode -format
格式化成功
啟動檔案系統:sbin/start-dfs.sh , jps 檢視程序
* HDFS系統監控介面:
http://172.16.11.178:50070
* 配置yarn:
重新命名mapred-site.xml.template為mapred-site.xml
vim mapred-site.xml 加入:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
vim yarn-site.xml 加入:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
啟動yarn :sbin/start-yarn.sh
yarn監控介面:172.16.11.178:8088
cd /home/data/
建立words檔案:touch words
寫入資料:vim words
檢視words內容:more words
做詞頻統計:上傳words到hdfs
cd /home/softwares/hadoop-x-x/
bin/hadoop fs -put /home/data/words /words
hdfs系統介面裡會增加一個words檔案。
修改Windows的hosts檔案:
C:\Windows\System32\drivers\etc\目錄下hosts檔案加入:
172.16.11.178 hadoop
可以在hdfs系統介面下載上傳的檔案words了。
執行詞頻統計的demo:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /words /out
此時yarn介面有一個任務。
檢視執行結果:
bin/hadoop fs -ls /
bin/hadoop fs -ls /out
此時會有一個檔案:/out/part-r-00000記錄了執行結果,檢視檔案
bin/hadoop fs -cat /out/part-r-00000
四、HDFS架構詳解
1、分散式檔案系統
* 物理層儲存的分散式:用多臺伺服器共同儲存;
* 基於客戶機/伺服器模式:通常一個分散式檔案系統提供多個供使用者訪問的伺服器
* 通常情況下都會提供備份和容錯的功能;
* 通常情況下都是基於作業系統的本地檔案系統:
ext3,ext4
NTFS
2、分散式檔案系統的優點:
* 傳統檔案系統最大的問題是容量和吞吐量的限制;
* 多使用者多應用的並行讀寫是分散式檔案系統產生的根源
* 擴充儲存空間的成本低廉,可以使用普通的pc機代替
* 可提供冗餘備份;
* 為分散式計算提供基礎服務
3、基本概念:
* 是一個分散式檔案系統;
* 是使用java實現的、分散式的、可橫向擴充套件的檔案系統
* 是Hadoop的核心元件
* 基於*nix
* 具有很高的容錯性,提供了高吞吐量的資料訪問
* 適用於一次寫入,多次查詢的情況,不支援併發寫的情況,小檔案不合適
4、前提和設計目標:
* 硬體錯誤是常態
錯誤檢測和快速自動的恢復是HDFS最核心的架構目標
* 儲存超大檔案
HDFS適合大量儲存,總儲存量可達到PB、EB級
HDFS適合大檔案,單個檔案一般在百MB級以上
檔案數目適中
* 流式資料訪問
HDFS適合用於批量處理,不適合隨機定位訪問
* 簡單一致性模型
HDFS的應用程式需要對檔案實行一次性寫、多次讀的訪問模式
不能修改已寫入的資料
* 程式採用“資料就近”原則分配節點執行
移動計算比移動資料的代價要低
* 執行在普通廉價的伺服器上
HDFS設計理念之一就是讓它能執行在普通的硬體指上,即便硬體出現故障,也可以通過容錯策略來保證資料的高可用
5、侷限性:
* 不適合低延遲資料訪問
高吞吐量可能要求以高延遲為代價
HBase可以彌補不足
* 無法高效儲存大量小檔案
檔案數量大小的限制由namenode決定
* 不支援多使用者寫入及任意修改檔案
6、基本概念--塊
* HDFS基本儲存單位是塊,傳統的塊儲存介質中,塊是讀寫的最小資料單位(扇區)
* HDFS也使用塊的概念,Hadoop1.x版本預設為64M,Hadoop2.x版本預設為128M
可自行在hdfs-site.xml檔案中配置:
1.x版本修改:dfs.block.size , 2.x版本修改:dfs.blocksize
預設單位為位元,兆與位元的計算方法:128*1024*1024
每一個塊有一個自己的全域性ID
* HDFS將一個檔案分為一個或數個塊來儲存
每個塊是獨立的儲存單位
以塊為單位在叢集伺服器上分配儲存
7、塊--帶來的好處:
* 一個檔案的大小可以大於網路中任意一個磁碟的容量
* 簡化了儲存子系統的設計,簡化了儲存管理,消除了對元資料的顧慮
* 適合用於資料備份,提高了容錯能力和可用性
8、塊的冗餘備份:
* 每個塊在叢集上會儲存多份副本,預設三份,可以動態修改
* 簡化了儲存子系統的設計,簡化了儲存管理,消除了對元資料的顧慮
* 適合用於資料備份,提高了容錯能力和可用性
9、體系架構圖:
10、HDFS元資料:
* 檔案系統目錄樹資訊
檔名、目錄名
檔案和目錄的從屬關係
檔案和目錄的大小,建立及最後訪問時間
檔案和目錄的許可權
* 檔案和塊的對應關係
檔案由哪些塊組成
11、NameNode職責詳解:
* 管理檔案系統的名稱空間
* 記錄每個檔案資料塊在各個DataNode上的位置和副本資訊
* 記錄客戶端對檔案的方位
* 記錄名稱空間內的改動或空間本身屬性的改動
* NameNode使用事務日誌記錄HDFS元資料的變化。使用映像檔案儲存檔案系統的名稱空間,包括檔案對映、檔案屬性等
* 通過檢查點(CheckPoint)更新影像檔案,Secondary NameNode輔助完成處理
12、DataNode職責詳解:
* 負責所在物理節點的儲存管理
* 一次寫入,多次讀取,不支援修改
* 檔案由資料塊組成,典型的塊大小是64和128M
* 資料塊儘量散佈到各個節點
13、HDFS讀取檔案流程:
14、HDFS寫檔案流程:
15、HDFS可靠性
* 冗餘副本策略
可以在hdfs-site.xml中設定複製因子指定副本數量
所有資料塊都有副本
DataNode啟動時,遍歷本地檔案系統,產生一份hdfs資料塊和本地檔案的對應關係列表彙報給namenode
* 機架策略
叢集一般放在不同的機架上,機架間的頻寬要比機架內的頻寬小
預設在一個機架記憶體放2個副本,在另外一個機架記憶體放1個副本,這樣可以防止機架失效時丟失資料,也可以提高寬頻利用率
* 心跳機制
Namenode週期性從datanode接收心跳訊號和塊報告
Namenode根據塊報告驗證元資料
沒有按時傳送心跳的datanode會被標記為宕機,不會再給它任何I/O請求
如果datanode失效造成副本數量下降,並且低於預先設定的閥值,namenode會檢測出這些資料塊,並在合適的時機進行重新複製
重新複製的原因還包括資料副本本身損壞、磁碟錯誤、複製因子被增大等
* 安全模式
namenode啟動時會先經過一個“安全模式”階段
安全模式階段不會產生資料寫
在此階段Namenode收集各個datanode的報告,當資料塊達到最小副本數以上時,會被認為是“安全”的
在一定比例(可設定)的資料塊被確定為“安全”後,再過若干時間,安全模式結束
當檢測到副本數不足的資料塊時,該塊會被複制直到達到最小副本數
* 校驗和
HDFS客戶端軟體實現了對HDFS檔案內容的校驗和(Checksum)檢查
在檔案創立時,會計算每個資料塊的校驗和
校驗和會作為單獨一個隱藏檔案儲存在名稱空間下
客戶端獲取檔案時,可以檢查資料塊對應的校驗和是否和隱藏在檔案中的相同,從而發現數據塊是否損壞
如果正在讀取的資料塊損壞,則可以繼續讀取其他副本
* 回收站
刪除檔案時,其實是放入回收站/trash
回收站裡的檔案可以快速恢復
可以設定一個時間閥值,當回收站裡的檔案存放時間超過這個閥值,就被徹底刪除,並且釋放佔用的資料塊
預設回收站是關閉的,可以通過在core-site.xml中新增fs.trash.interval來開啟並配置時間閥值,時間單位是分鐘
* 元資料的保護
映像檔案和事務日誌是Namenode的核心資料,可以配置為擁有多個副本
副本會降低Namenode的處理速度,但是增加安全性
Namenode依然是單點,如果發生故障需要手工切換,Hadoop2.x版本中可配置Namenode HA解決該問題
五、HDFS Shell操作
1、HDFS常見Shell命令
* HDFS Shell文件地址:
http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/FileSystemSehell.html
* HDFS集中式快取管理文件地址:
http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/DistributedCacheDeploy.html
* HDFS小檔案歸檔文件地址:
htp://hadoop.apache.org/docs/r2.7.2/hadoop-archives/HadoopArchives.html
2、shell命令:
cd /home/softwares/hadoop-x-x/
* 檢視常見shell命令:
bin/hdfs -help
* 建立資料夾:
bin/hdfs dfs -mkdir -p /jkxy/test (/jkxy/test---在hdfs上的儲存位置)
* 上傳單個檔案到上面的目錄:
bin/hdfs dfs -put /etc/profile /jkxy/test/profile (/etc/profile--目標檔案路徑 /jkxy/test/profile---要上傳的位置路徑)
* 上傳資料夾(內含檔案)
bin/hdfs dfs -put /etc/* /jkxy/test/
* 檢視hdfs上的一個檔案內容:
bin/hdfs dfs -cat /jkxy/test/profile
* 下載hdfs上的檔案:
bin/hdfs dfs -get /jkxy/test/profile /home/data/ (/jkxy/test/profile---要下載的檔案在hdfs的路徑 /home/data/---要儲存在本地的路徑 )
* 刪除hdfs裡的檔案:
bin/hdfs dfs -rm -r /jkxy/test/profile
* 刪除的檔案會在回收站保留一定時間,這個時間可以設定:
vim core-site.xml 加入:
<property>
<name>fs.trash.interval</name>
<value>10</value> <!--單位是分鐘 -->
</property>
重啟hdfs
刪除一個檔案,檢視hdfs系統/user/root/.Trash/jkxy/test目錄下有個剛才刪除的檔案,至此回收站配置完成
* 集中式快取管理:
檢視所有快取池:
bin/hdfs cacheadmin -listPools
新建快取池:
bin/hdfs cacheadmin -addPool test (test---新建快取池名稱)
hdfs中的檔案放入快取池中:
bin/hdfs cacheadmin -addDirective -path /jkxy/test -pool test (/jkxy/test---要操作的檔案路徑 test---要放入的快取池名稱 )
檢視某個快取池下的檔案:
bin/hdfs cacheadmin -listDirectives -pool test
檢視hdfs中的檔案內容:
bin/hdfs dfs -cat /jkxy/test/xxxx.xml
* 小檔案歸檔:
屬於Hadoop的一個指令碼,使用bin/hadoop 檢視幫助,要啟動hdfs和yarn
bin/hadoop archive -archiveName conf.har -p /jkxy/test -r 1 /conf(conf.har---要歸檔成為的檔名,.har字尾代表是歸檔檔案 /jkxy/test---要歸檔的小檔案路徑 1---歸檔的備份數 /conf---歸檔後要存放在hdfs上的位置)
* 檢視歸檔檔案:
bin/hdfs dfs -ls har:///conf/conf.har (///conf/conf.har---hdfs上的路徑)
* 解壓歸檔檔案:
bin/hdfs dfs -cp har:///conf/conf.har /har (///conf/conf.har---要解壓的檔案在hdfs上的路徑 /har---要解壓到hdfs上的位置)
hdfs系統裡多了一個har,裡面的檔案跟/jkxy/test/下的檔案一樣,至此,小檔案歸檔成功