1. 程式人生 > >Hadoop常見知識點總結

Hadoop常見知識點總結

Hadoop常見知識點及環境搭建

前言
Hadoop早期衍生自Nutch(Java開源的搜尋引擎),早期Nutch構建開源的搜尋引擎,同樣在少數的機器上同時執行計算任務面臨著問題,在這個時候Google釋出了GFS和Map Reduce論文。人們參考著這兩篇論文中所闡述的思想開始重建Nutch的儲存和計算模型。一開始嘗試在20臺機器的計算和儲存,不久人們發現為了滿足web服務高擴充套件性,需要將叢集規模擴充套件到幾千臺的叢集規模。就在這個時候Yahoo團隊加入後,開始將儲存和計算從Nutch中剝離出去,並且命名為Hadoop,在Yahoo團隊的幫助下,Hadoop很快成為能夠真正滿足應用的高擴充套件性。
Big Data
Big Data(大資料),或稱巨量資料,指的是所涉及的資料量規模巨大到無法通過目前主流軟體工具,在合理時間內達到擷取、管理、處理、並整理成為幫助企業經營決策更積極目的的資訊。Big Data大資料,談的不僅僅是資料量,其實包含了資料量(Volume)、時效性(Velocity)、多樣性(Variety)、可疑性(Veracity)。
Volume:資料量大量資料的產生、處理、儲存,談的就是Big Data就字面上的意思,就是談海量資料。
Velocity:就是處理的時效,既然前頭提到Big Data其中一個用途是做市場預測,那處理的時效如果太長就失去了預測的意義了,所以處理的時效對Big Data來說也是非常關鍵的,500萬筆資料的深入分析,可能只能花5分鐘的時間。
Variety[vəˈraɪɪti]:多變性指的是資料的形態,包含文字、影音、網頁、串流等等結構性、非結構性的資料。
Veracity[vəˈræsɪti]:可疑性指的是當資料的來源變得更多元時,這些資料本身的可靠度、質量是否足夠,若資料本身就是有問題的,那分析後的結果也不會是正確的。
面臨挑戰
隨著網際網路使用者量的增多,大使用者資料,大資料流量已經遠遠超過單機伺服器的處理能力,雖然摩爾定律給出在價格不變的情況下,硬體效能每隔18個月,效能都會提高提升1倍,即便如此,橫向擴充套件比縱向擴充套件成本要低得多,分散式系統由此而產生。
Hadoop課程
ZK : 分散式系統的協調服務。
Flume : 分散式日誌採集。
Kafka : 分散式訊息佇列。
Hive : HQL(Hive Query language)sql 翻譯成MapReduce程式執行 ETL hive程式設計指南
Hbase :基於列儲存資料庫,基於分散式儲存HDFS 行10億 * 百萬大資料隨機訪問
HDFS :分散式檔案儲存
MapReduce:分散式計算

Hadoop是一個能夠對大量資料進行分散式處理的軟體框架,以一種可靠、高效、可伸縮的方式進行資料處理,其有許多元素構成,以下是其組成元素:
1.Hadoop Common:Hadoop體系最底層的一個模組,為Hadoop各子專案提供各種工具,如:配置檔案和日誌操作等。
2.HDFS:分散式檔案系統,提供高吞吐量的應用程式資料訪問,對外部客戶機而言,HDFS 就像一個傳統的分級檔案系統。可以建立、刪除、移動或重新命名檔案,等等。但是HDFS 的架構是基於一組特定的節點構建的(參見圖 1),這是由它自身的特點決定的。這些節點包括 NameNode(僅一個),它在 HDFS 內部提供元資料服務;DataNode,它為 HDFS 提供儲存塊。由於僅存在一個 NameNode,因此這是 HDFS 的一個缺點(單點失敗)。
儲存在 HDFS 中的檔案被分成塊,然後將這些塊複製到多個計算機中(DataNode)。這與傳統的 RAID 架構大不相同。塊的大小(通常為 64MB)和複製的塊數量在建立檔案時由客戶機決定。NameNode 可以控制所有檔案操作。HDFS 內部的所有通訊都基於標準的 TCP/IP 協議。
3.MapReduce:一個分散式海量資料處理的軟體框架集計算叢集。
4.Avro :doug cutting主持的RPC專案,主要負責資料的序列化。有點類似Google的protobuf和Facebook的thrift。avro用來做以後hadoop的RPC,使hadoop的RPC模組通訊速度更快、資料結構更緊湊。
5.Hive :類似CloudBase,也是基於hadoop分散式計算平臺上的提供data warehouse的sql功能的一套軟體。使得儲存在hadoop裡面的海量資料的彙總,即席查詢簡單化。hive提供了一套QL的查詢語言,以sql為基礎,使用起來很方便。
6.HBase :基於HadoopDistributed File System,是一個開源的,基於列儲存模型的可擴充套件的分散式資料庫,支援大型表的儲存結構化資料。
7.Pig :是一個平行計算的高階的資料流語言和執行框架 ,SQL-like語言,是在MapReduce上構建的一種高階查詢語言,把一些運算編譯進MapReduce模型的Map和Reduce中,並且使用者可以定義自己的功能。
8.ZooKeeper:Google的Chubby一個開源的實現。它是一個針對大型分散式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、分散式同步、組服務等。ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
9.Chukwa :一個管理大型分散式系統的資料採集系統 由yahoo貢獻。
10.Cassandra:無單點故障的可擴充套件的多主資料庫
11.Mahout :一個可擴充套件的機器學習和資料探勘庫

HDFS環境安裝
參考:
http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-common/SingleCluster.html

1)安裝JDK配置JAVA_HOME環境變數(jdk-7u79-linux-x64.rpm)

[[email protected] ~]# rpm -ivh jdk-7u79-linux-x64.rpm
[[email protected] ~]# vi /root/.bashrc
JAVA_HOME=/usr/java/latest
PATH= P

A T H : PATH: JAVA_HOME/bin
CLASSPATH=.
export JAVA_HOME
export PATH
export CLASSPATH
[[email protected] ~]# source .bashrc

小提示:[[email protected] ~]# yum install -y lrzsz之後鍵入rz檔案上傳,sz檔案下載
[[email protected] ~]# sz jdk-7u79-linux-x64.rpm
[[email protected] ~]# rz
2)關閉防火牆
[[email protected] ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[[email protected] ~]# chkconfig iptables off
3)配置主機名為CentOS
[[email protected] ~]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=CentOS
4)配置主機名和IP對映關係
[[email protected] ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.37.138 CentOS
5)配置SSH免密碼認證登陸(基於密匙的安全驗證)
SSH 為 Secure Shell 的縮寫,由 IETF 的網路小組(Network Working Group)所制定;SSH 為建立在應用層基礎上的安全協議。SSH 是目前較可靠,專為遠端登入會話和其他網路服務提供安全性的協議。

[[email protected] ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
39:c8:22:dd:e8:25:9d:e8:aa:ac:6b:ac:89:a1:98:eb [email protected]
The key’s randomart image is:
±-[ RSA 2048]----+
| |
| |
| |
| . * o . |
| . * B S |
| + + . |
|o o |
|=* . |
|^E. |
±----------------+
[[email protected] ~]# ssh-copy-id CentOS
等價於
[[email protected] ~]# cat .ssh/id_rsa.pub >> .ssh/authorized_keys
[[email protected] ~]# ssh CentOS
Last login: Mon Jul 23 19:42:25 2018 from centos

6)配置HDFS基本環境
1)上傳解壓hadoop-2.6.0.tar.gz解壓到/usr目錄並且配置HADOOP_HOME環境變數
[[email protected] ~]# tar -zxf hadoop-2.6.0_x64.tar.gz -C /usr/
[[email protected] ~]# vi .bashrc
HADOOP_HOME=/usr/hadoop-2.6.0
JAVA_HOME=/usr/java/latest
PATH= P A T H : PATH: JAVA_HOME/bin: H A D O O P H O M E / b i n : HADOOP_HOME/bin: HADOOP_HOME/sbin
CLASSPATH=.
export JAVA_HOME
export PATH
export CLASSPATH
export HADOOP_HOME
[[email protected] ~]# source .bashrc
2)配置hadoop配置檔案(core|hdfs-site.xml/slaves)
core-site.xml
[[email protected] ~]# vi /usr/hadoop-2.6.0/etc/hadoop/core-site.xml

fs.defaultFS
hdfs://CentOS:9000


hadoop.tmp.dir
/usr/hadoop-2.6.0/hadoop-${user.name}

hdfs-site.xml
[[email protected] ~]# vi /usr/hadoop-2.6.0/etc/hadoop/hdfs-site.xml

dfs.replication
1

slaves
[[email protected] ~]# vi /usr/hadoop-2.6.0/etc/hadoop/slaves
CentOS
附註:hadoop安裝檔案目錄說明
[[email protected] ~]# yum install -y tree

7)啟動HDFS環境
1.首次啟動hdfs
[[email protected] ~]# hdfs namenode -format

18/07/23 20:06:58 INFO namenode.NNConf: XAttrs enabled? true
18/07/23 20:06:58 INFO namenode.NNConf: Maximum size of an xattr: 16384
18/07/23 20:06:58 INFO namenode.FSImage: Allocated new BlockPoolId: BP-258224419-192.168.37.138-1532347618173
18/07/23 20:06:58 INFO common.Storage: Storage directory /usr/hadoop-2.6.0/hadoop-root/dfs/name has been successfully formatted.
18/07/23 20:06:58 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
18/07/23 20:06:58 INFO util.ExitUtil: Exiting with status 0
附註:生成fsimage映象檔案
[[email protected] ~]# tree /usr/hadoop-2.6.0/hadoop-root/
/usr/hadoop-2.6.0/hadoop-root/
└── dfs
└── name
└── current
├── fsimage_0000000000000000000
├── fsimage_0000000000000000000.md5
├── seen_txid
└── VERSION

3 directories, 4 files
2.執行start命令啟動HDFS
[[email protected] ~]# start-dfs.sh 啟動HDFS
Starting namenodes on [CentOS]
CentOS: starting namenode, logging to /usr/hadoop-2.6.0/logs/hadoop-root-namenode-CentOS.out
CentOS: starting datanode, logging to /usr/hadoop-2.6.0/logs/hadoop-root-datanode-CentOS.out
Starting secondary namenodes [0.0.0.0]
The authenticity of host ‘0.0.0.0 (0.0.0.0)’ can’t be established.
RSA key fingerprint is 02:cc:8c:da:b9:6d:c9:66:6c:e8:93:64:53:8e:a1:af.
Are you sure you want to continue connecting (yes/no)? yes
0.0.0.0: Warning: Permanently added ‘0.0.0.0’ (RSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /usr/hadoop-2.6.0/logs/hadoop-root-secondarynamenode-CentOS.out
3)檢查是否成功
[[email protected] ~]# jps
2700 Jps
2597 SecondaryNameNode
2357 NameNode
2436 DataNode
或者:http://192.168.37.138:50070(namenode的web訪問入口)
如果出現詭異錯誤記得檢視啟動日誌
[[email protected] ~]# ls /usr/hadoop-2.6.0/logs/

HDFS架構 (Architecture 架構)

HDFS(Hadoop Distributed File System)是Hadoop專案的核心子專案,是分散式計算中資料儲存管理的基礎,是基於流資料模式訪問和處理超大檔案的需求而開發的,可以運行於廉價的商用伺服器上。它所具有的高容錯、高可靠性、高可擴充套件性、高獲得性、高吞吐率等特徵為海量資料提供了不怕故障的儲存,為超大資料集(Large Data Set)的應用處理帶來了很多便利。

(二) HDFS的優缺點比較
HDFS 的優點:
1、高容錯性
1)資料自動儲存多個副本。它通過增加副本的形式,提高容錯性

2)某一個副本丟失以後,它可以自動恢復,這是由 HDFS 內部機制實現的,我們不必關心。
2、適合批處理
1)它是通過移動計算而不是移動資料

2)它會把資料位置暴露給計算框架。
3、適合大資料處理
1)處理資料達到 GB、TB、甚至PB級別的資料。
2)能夠處理百萬規模以上的檔案數量,數量相當之大。

3)能夠處理10K節點的規模
4、流式檔案訪問

1)一次寫入,多次讀取。檔案一旦寫入不能修改,只能追加。

2)它能保證資料的一致性。
5、可構建在廉價機器上

1)它通過多副本機制,提高可靠性。
2)它提供了容錯和恢復機制。比如某一個副本丟失,可以通過其它副本來恢復。

HDFS 缺點(不適用適用HDFS的場景):
1、低延時資料訪問
1)比如毫秒級的來儲存資料,這是不行的,它做不到。

2)它適合高吞吐率的場景,就是在某一時間內寫入大量的資料。但是它在低延時的情況下是不行的,比如毫秒級以內讀取資料,這樣它是很難做到的。
2、小檔案儲存
1)儲存大量小檔案的話,它會佔用 NameNode大量的記憶體來儲存檔案、目錄和塊資訊。這樣是不可取的,因為NameNode的記憶體總是有限的。

2)小檔案儲存的尋道時間會超過讀取時間,它違反了HDFS的設計目標。

3、併發寫入、檔案隨機修改
1)一個檔案只能有一個寫,不允許多個執行緒同時寫。
2)僅支援資料 append(追加),不支援檔案的隨機修改。

NameNode和DataNode的軟體設計商品的機器上執行。 這些機器通常執行GNU / Linux作業系統(OS)。 HDFS是使用Java語言; 任何支援Java的機器可以執行NameNode或DataNode軟體。 使用Java語言具有高度的可移植性意味著HDFS可以部署在一個廣泛的機器。 一個典型的部署有專用機器,只能NameNode執行軟體。 每一個叢集中的其他機器執行一個例項的DataNode軟體。 架構並不排除在同一臺機器上執行多個datanode但在實際部署,這種情況很少見。
叢集中的一個NameNode的存在極大地簡化了系統的體系結構。 NameNode是所有HDFS的仲裁員和儲存庫的元資料。 系統設計以這樣一種方式,使用者資料不會流經NameNode。
null
HDFS支援傳統的分層檔案組織。 使用者或應用程式可以建立目錄和儲存檔案在這些目錄。 檔案系統名稱空間層次結構類似於其他大多數現有的檔案系統; 可以建立和刪除檔案,一個檔案從一個目錄移到另一個,或重新命名一個檔案。 HDFS尚未實現使用者配額或訪問許可權。 HDFS不支援硬連結和軟連結。 然而,HDFS架構並不排除實現這些特性。
NameNode維護檔案系統名稱空間。 任何改變檔案系統名稱空間或其屬性被NameNode記錄。 應用程式可以指定檔案的副本的數量應該由HDFS。 檔案的拷貝數稱為該檔案的複製因子。 這些資訊儲存NameNode。
資料複製
HDFS被設計為地可靠地儲存海量的檔案在一個大叢集中可以跨機器。 它儲存塊的每個檔案作為一個序列; 檔案除了最後一個塊中的所有塊是相同的大小。 檔案的塊複製容錯。 塊大小和複製每個檔案都是可配置的因素。 應用程式可以指定檔案的副本的數量。 複製因子可以指定在建立檔案時,可以改變。 在HDFS檔案寫一次,嚴格的一位作家。
關於複製塊NameNode作出所有決定。 它定期接收心跳和Blockreport從每個datanode的叢集。 收到心跳意味著DataNode正常運作。 一個Blockreport DataNode包含所有模組的列表。