天天看點

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

一、概述(部署請跳到第二節)

1.大資料的由來

  随着計算機技術的發展,網際網路的普及,資訊的積累已經到了一個非常龐大的地步,資訊的增長也在不斷的加快,随着網際網路,物聯網建設的加快,資訊更是爆炸式增長,收集檢索,統計這些資訊越發困難,傳統的資料庫結構難以應對這種變化,必須使用新的技術來解決這些問題

2.什麼是大資料

-大資料指無法在一定時間範圍内用正常工具進行捕捉,管理和處理的資料集合

-大資料需要新處理模式才能具有更強的決策力,洞察發現力和流程優化能力的海量,高增長率和多樣化的資訊資産

-大資料是指從各種各樣類型的資料中,快速擷取有價值的資訊

3.大資料能做什麼

-企業組織利用相關資料分析幫助他們降低成本,提高效率,開發新産品,做出更明智的業務決策等

-把資料集合并進行分析得出的資訊和資料關系性,用來察覺商業趨勢,判定研究品質,避免疾病擴散,打擊犯罪或測定即使交通路況等

-大規模并行處理資料庫,資料挖掘電網,分布式檔案系統或資料庫,雲計算平和可擴充的存儲系統

4.大資料特性

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

-Volume大體量

可從數百TB到數十數百PB,甚至是EB的規模

-Variety多樣性

大資料包括各種各樣格式和形态的資料

-Velocity時效性

很多大資料需要在一定的時間限度下得到及時處理

-Veracity準确性

處理的結果要確定一定的準确性

-Value大價值

大資料包含很多深度的價值,大資料分析挖掘和利用将帶來巨大的商業價值

5.大資料與Hadoop

hadoop是什麼

-hadoop是一種分析和處理海量資料的軟體平台

-Hadoop是一款開源軟體,使用JAVA開發

-Hadoop可以提供一個分布式基礎架構

-具有高可靠性,高擴充性,高效性,高容錯性,低成本

6.Hadoop起源

2003年Google陸續釋出了3篇論文,分别是GFS,MapReduce,BigTable.此三大技術被成為Google的三駕馬車,雖然沒有公布源碼,但釋出了這三個産品的詳細設計論

GFS:

GFS是一個可擴充的分布式檔案系統,用于大型的,分布式的,對大量資料進行通路的應用,可以運作與廉價的普通硬體上,提供容錯功能

MapReduce:

MapReduce是針對分布式平行計算的一套程式設計模型,由Map和Reduce組成,Map是映射,把指令分發到多個worker上,Reduce是規約,把worker計算出的結果合并

BigTable:

Bigtable是存儲結構化資料,建立與GFS,Scheduler,Lock Service和MapReduce上

7.Hadhoop和Google的關系

Hadoop是Yahoo公司資助開發的,基于Google的三篇論文,使用Java開發,但是在性能上要比Google差很多,但是開源啊,老百姓都可以用,是以漸漸的就成為一種大資料的主流工具,後來Google開發的大資料工具也妥協了,選擇相容Hadoop

Hadoop是基于Google的三篇論文開發出來的,也有三大支撐技術,HDFS,MapReduce,Hbase

Hadoop與Google三篇論文的關系:

GFS-->HDFS

MapReduce-->MapReduce

BigTable-->Hbase

7.Hadoop常用元件

HDFS:Hadoop分布式檔案系統(核心)

MapReduce:分布式計算架構(核心)

Yarn:叢集資源管理系統(核心)

Zookeeper:分布式協作服務

Hbase:分布式列存資料庫

Hive:基于Hadoop的資料倉庫

Sqoop:資料同步工具

Pig:基于Hadoop的資料流系統

Mahout:資料挖掘算法庫

Flume:日志收集工具

8.再來看看MapReduce,Yarn,HDFS之間的關系

HDFS分布式檔案系統作為存儲節點,Yarn管理存儲在HDFS檔案系統上的資料資源,MapReduce是一套程式,用于計算并整合資料資源

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

9.細談HDFS

Hadoop叢集其實就是HDFS叢集,說到HDFS,下面來談談什麼是HDFS

HDFS:其實就是個檔案系統,和fastDFS類似,像百度雲,阿裡雲等就是個檔案存儲系統,當然一般如果僅僅是為了用來存儲檔案的話直接fastDFS這個就已經夠了,HDFS目的不單單是用來存儲檔案這麼簡單,它還涉及分布式計算等。

HDFS分布式系統有NameNode和DataNode,NameNode是整個檔案系統目錄,基于記憶體存儲,存儲的是一些檔案的詳細資訊,比如檔案名、檔案大小、建立時間、檔案位置等。Datanode是檔案的資料資訊,也就是檔案本身,不過是分割後的小檔案。上面圖已經有做了介紹了,這裡就不再贅述了。

角色:

-Client

切分檔案,通路HDFS,與Namenode互動,擷取檔案位置資訊,與DataNode互動,讀取和寫入資料

-Namenode

Master節點管理HDFS的名稱空間和資料塊映射資訊,配置副本政策,處理所有用戶端請求

-Secondarynode

定期合并fsimage和fsedits,推送給NameNode,緊急情況下可以協助恢複NameNode

-Datanode

資料存儲節點,存儲實際的資料,彙報存儲資訊給NameNode

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

HDFS工作原理,用文字有點難以表達,那麼我就直接畫個圖吧:

觀看順序:

1)看主節點Namenode

它的首要作用就是分割大檔案,将分割後的檔案放到子節點datanode(假設為小檔案*n),且記錄第n個小檔案的block_id(用于确認存放在哪個子節點上.并且備份子節點數-1份資料到其他子節點上

可以将其看做書本的目錄,把一篇文章分為n個小節,記錄頁碼

核心作用:分割 備份 定位

2)再看子節點datanode

主機點通過與子節點建立心跳确認子節點狀态,若子節點當機,則将自身的資料複制到其他節點

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

10.細談Yarn

Yarn是一種新的 Hadoop資料總管,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和排程,它的引入為叢集在使用率、資源統一管理和資料共享等方面帶來了巨大好處。

Yarn角色:

-ResourceManager

處理用戶端請求,啟動/監控ApplicationMaster,監控NodeManager,資源配置設定與排程

-NodeManager

單個節點上的資源管理,處理來自ResourceManager的指令,處理來自ApplicationMaster的指令

-ApplicationMaster

資料切分,為應用程式申請資源,并配置設定給内部任務,任務監控與容錯

-Container

對任務運作環境的抽象,封裝了CPU,記憶體等,多元資源以及環境變量,啟動指令等任務運作相關的資訊資源配置設定與排程

-Client

使用者與Yarn互動的用戶端程式,送出應用程式,監控應用程式的狀态,殺死應用程式等

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

11.細談MapReduce

MapReduce角色與結構:

-JobTracker

Master節點隻有一個,管理所有作業/任務的監控,錯誤處理等,将任務分解成一系列任務,并派發給TaskTracker

-TaskTracker

Slave節點,一般是多台,運作Map Task和Reduce Task,與JobTracker互動,彙報任務狀态

-Map Task

解析每條資料記錄,傳遞給使用者編寫的map()并執行,将輸出結構寫入本地磁盤,如果map-only作業,直接寫入HDFS

-Reducer Task

從Map Task的執行結果中,遠端讀取輸入資料,對資料進行排序,将資料按照分組傳遞給使用者編寫的reduce函數執行

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

Mapreduce工作原理:

MapReduce是一種程式設計模型,用于大規模資料集(大于1TB)的并行運算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數式程式設計語言裡借來的,還有從矢量程式設計語言裡借來的特性。它極大地友善了程式設計人員在不會分布式并行程式設計的情況下,将自己的程式運作在分布式系統上。目前的軟體實作是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定并發的Reduce(歸約)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。

弄懂MarReduce的關鍵在與弄懂Map函數和Reduce函數

Map将會生成一組鍵值對,以單個字元串作為鍵名,以1作為值

Reduce會歸約Map生成的鍵值對,将相同鍵名的key歸約在一起,将值累加,最終的得出某個鍵的總個數

map函數和Reduce函數是需要手動幹預編寫的,自己定義規則,以何種形式統計出資料就是大資料的核心,下圖是使用wordcount方式統計字元串出現的個數

Mapreduce工作原理如下圖:

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

MapReduce所編寫好的程式将跑在各個DataNode上,這裡有個概念就是計算向資料移動,也就是DataNode的資料檔案存儲在這裡,我的程式發送到DataNode節點上去讀取資料和分析資料就好了。期間會有出現各個DataNode之間進行資料發送,比如說節點DataNode1進行這台機讀取資料時進行shuffle時需要把相同的key作為一組調用一次reduce,那麼如果這時當然會有一些同key的在其他節點DataNode上的,是以就需要進行資料傳送。Input這裡的wordcount.txt就是DataNode上的檔案資料。Split階段是MapReduce一定會執行的,這是它的規則,而map階段就是我們必須進行手動幹預的,也就是編碼對資料進行分析,分析成map檔案,然後再shuffle階段中自發進行資料派送,規則是以同樣的key為一組調用reduce階段進行資料壓縮,reduce也是進行手動幹預的,我們編碼進行資料計算,計算同key的個數,統計完後就可以輸出一個檔案出來了,這整個過程資料的傳輸都是放在context這個上下文中。下面是借鑒網上的一張圖,HDFS與MapReduce之間的關系協助大概就是這麼個意思。

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

12.Hadoop生态系統

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

二、 hadoop部署,單機模式

1.hadoop的部署有三種模式

-單機

-僞分布式

-完全分布式

2.Hadoop單機模式安裝與使用

需要安裝JDK,并且配置Java環境

1)安裝java環境

  1. [[email protected] ~]# yum -y install java-1.8.0-openjdk-devel  #安裝1.8以上的都可以
  2. [[email protected] ~]# java -version  
  3. openjdk version "1.8.0_131"
  4. OpenJDK Runtime Environment (build 1.8.0_131-b12)
  5. OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
  6. [[email protected] ~]# jps
  7. 1235 Jps

2)安裝hadoop

安裝hadoop需要用到幾個包,可以到我的github上下載下傳

[hadoop相關軟體]https://github.com/ck784101777/hadoop

  1. [[email protected] ~]# cd hadoop/
  2. [[email protected] hadoop]# ls  //本例需要hadoop-2.7.7.tar.gz
  3. hadoop-2.7.7.tar.gz kafka_2.12-2.1.0.tgz zookeeper-3.4.13.tar.gz
  4. [[email protected] hadoop]# tar -xf hadoop-2.7.7.tar.gz
  5. [[email protected] hadoop]# mv hadoop-2.7.7 /usr/local/hadoop #無需安裝直接放到目錄下
  6. [[email protected] hadoop]# cd /usr/local/hadoop
  7. [[email protected] hadoop]# ls
  8. bin include libexec NOTICE.txt sbin
  9. etc lib LICENSE.txt README.txt share
  10. [[email protected] hadoop]# ./bin/hadoop   //啟動報錯,JAVA_HOME沒有找到
  11. Error: JAVA_HOME is not set and could not be found.
  12. [[email protected] hadoop]#

3)解決報錯問題

報錯原因是沒有配置好JAVA_HOME環境,預設是${JAVA....},修改如下

  1. [[email protected] hadoop]# rpm -ql java-1.8.0-openjdk
  2. /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/policytool

    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/lib/amd64/libawt_xawt.so

  3. [[email protected] hadoop]# cd ./etc/hadoop/
  4. [[email protected] hadoop]# vim hadoop-env.sh #25代表行數,set nu 檢視行數
  5. 25 export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64 /jre"
  6. 33 export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop" 

4)初次使用hadoop 

本例将使用hadoop的wordcount(統計詞頻)來統計單個檔案中每個字元串出現的次數

格式:

./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar  wordcount  被統計目錄或檔案  輸出目錄

  1. [[email protected] ~]# cd /usr/local/hadoop/ 
  2. [[email protected] hadoop]# ./bin/hadoop  #再次執行不報錯
  3. Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
  4. CLASSNAME run the class named CLASSNAME
  5. .......
  6. [[email protected] hadoop]# mkdir /usr/local/hadoop/input      #建立一個目錄
  7. [[email protected] hadoop]# ls
  8. bin etc include lib libexec LICENSE.txt NOTICE.txt input README.txt sbin share
  9. [[email protected] hadoop]# cp *.txt /usr/local/hadoop/input
  10. [[email protected] hadoop]# ./bin/hadoop jar \
  11. share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount input output    
  12.  //wordcount為參數 統計input這個檔案夾,存到output這個檔案裡面(這個檔案不能存在,要是存在會報錯,是為了防止資料覆寫)
  13. [[email protected] hadoop]# cat output/part-r-00000   //檢視
  14. [[email protected] output]# cat part-r-00000    #字元串 個數

    ""AS    2

    "AS    17

    "COPYRIGHTS    1

    "Contribution"    2

    "Contributor"    2

    "Derivative    1

    "GCC    1

    "Legal    1

    "License"    1

    "License");    2

    "Licensed    1

    "Licensor"    1

三、Hadoop僞分布式檔案架構部署

僞分布式的配置和完全分布式配置類似,差別在與所有角色安裝在一台機器上(Client,NameNode,Secondary NameNode)使用本地磁盤,一般生産環境都會使用完全分布式,僞分布式用來學習和測試Hadoop的功能

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

根據HDFS分布式檔案架構圖,我們需要至少4台主機,一台NameNode(Secondary NameNode),3台DataNode

大資料Hadoop入門,Hadoop安裝與配置,HDFS僞分布式部署(一)

整個流程如下:

-配置運作環境,四台主機

-配置域名解析

-在所有主機上安裝JDK,JAVA環境

-主節點生成秘鑰并發送到各個節點機,可以免密通路四個節點

-安裝部署Hadoop,NameNode與DataNode

-修改配置檔案slave

-修改配置檔案core-site.xml

-修改配置檔案hdfs-site.xml

-格式化分區

-測試

步驟一:運作環境準備

1)三台機器配置主機名為node1、node2、node3,配置ip位址(ip如圖-1所示),yum源(系統源)

2)編輯/etc/hosts(四台主機同樣操作,以nn01為例)

配置hosts,使他們可以通過主機名通信

  1. [[email protected] ~]# vim /etc/hosts
  2. 192.168.1.60 nn01
  3. 192.168.1.61 node1
  4. 192.168.1.62 node2
  5. 192.168.1.63 node3

3)安裝java環境,在node1,node2,node3上面操作(以node1為例)

  1. [[email protected] ~]# yum -y install java-1.8.0-openjdk-devel

4)布置SSH信任關系

在DataNode上生成密鑰對發送給各個節點

  1. [[email protected]n01 ~]# vim /etc/ssh/ssh_config //第一次登陸不需要輸入yes
  2. Host *
  3. GSSAPIAuthentication yes
  4. StrictHostKeyChecking no
  5. [[email protected] .ssh]# ssh-keygen
  6. [[email protected] .ssh]# for i in 61 62 63 64 ; do ssh-copy-id 192.168.1.$i; done
  7. //部署公鑰給nn01,node1,node2,node3

5)測試信任關系

無需密碼登入證明建立了信任關系

  1. [[email protected] .ssh]# ssh node1
  2. Last login: Fri Sep 7 16:52:00 2018 from 192.168.1.60
  3. [[email protected] ~]# exit
  4. logout
  5. Connection to node1 closed.
  6. [[email protected] .ssh]# ssh node2
  7. Last login: Fri Sep 7 16:52:05 2018 from 192.168.1.60
  8. [[email protected] ~]# exit
  9. logout
  10. Connection to node2 closed.
  11. [[email protected] .ssh]# ssh node3

步驟二:配置hadoop

環境配置檔案:hadoop-env.sh

核心配置檔案:core-site.xml

HDFS配置檔案:hdfs-site.xml

節點配置檔案:slaves

安裝hadoop在第二節有介紹

1)修改slaves檔案

在DataNode上修改

  1. [[email protected] ~]# cd /usr/local/hadoop/etc/hadoop
  2. [[email protected] hadoop]# vim slaves
  3. node1
  4. node2
  5. node3

2)hadoop的核心配置檔案core-site

fs.defaultFS:檔案系統配置參數

hadoop.tmp.dir:資料目錄配置參數

  1. [[email protected] hadoop]# vim core-site.xml
  2. <configuration>
  3. <property>
  4. <name>fs.defaultFS</name>
  5. <value>hdfs://nn01:9000</value>     #hdfs://自定義命名
  6. </property>
  7. <property>
  8. <name>hadoop.tmp.dir</name>
  9. <value>/var/hadoop</value>      #儲存hadoop檔案的目錄
  10. </property>
  11. </configuration>
  12. [[email protected] hadoop]# mkdir /var/hadoop        //hadoop的資料根目錄

3)配置hdfs-site檔案

定義NameNode和SecondNode,在一台主機上,從節點設定3台

  1. [[email protected] hadoop]# vim hdfs-site.xml
  2. <configuration>
  3. <property>
  4. <name>dfs.namenode.http-address</name>
  5. <value>nn01:50070</value>
  6. </property>
  7. <property>
  8. <name>dfs.namenode.secondary.http-address</name>
  9. <value>nn01:50090</value>
  10. </property>
  11. <property>
  12. <name>dfs.replication</name>
  13. <value>2</value>
  14. </property>
  15. </configuration>

4)同步配置到node1,node2,node3

使用rsync指令将hadoop同步到節點機上

  1. [[email protected] hadoop]# for i in 62 63 64 ; do rsync -aSH --delete /usr/local/hadoop/
  2. \ 192.168.1.$i:/usr/local/hadoop/ -e 'ssh' & done
  3. [1] 23260
  4. [2] 23261
  5. [3] 23262

5)檢視是否同步成功

  1. [[email protected] hadoop]# ssh node1 ls /usr/local/hadoop/
  2. .............

步驟三:格式化

格式化namenode,驗證是否存在角色,檢視叢集是否建立成功,有多少個節點

  1. [[email protected] hadoop]# cd /usr/local/hadoop/
  2. [[email protected] hadoop]# ./bin/hdfs namenode -format            //格式化 namenode
  3. [[email protected] hadoop]# ./sbin/start-dfs.sh                             //啟動
  4. [[email protected] hadoop]# jps                                                  //驗證角色
  5. 23408 NameNode
  6. 23700 Jps
  7. 23591 SecondaryNameNode
  8. [[email protected] hadoop]# ./bin/hdfs dfsadmin -report        //檢視叢集是否組建成功
  9. Live datanodes (3):                                                   //有三個角色成功

繼續閱讀