Hadoop初探

本文轉自:https://blog.csdn.net/column/details/14334.html

前言

Hadoop是什麼? 用百科上的話說:「Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。用戶能夠在不瞭解分佈式底層細節的狀況下,開發分佈式程序。充分利用集羣的威力進行高速運算和存儲。」 可能有些抽象,這個問題能夠在一步步學習Hadoop的各類知識之後再回過頭來從新看待。html

Hadoop你們族

Hadoop不是一個單一的項目,通過10年的發展,Hadoop已經成爲了一個擁有近20個產品的龐你們族。 其中最核心的包括如下9個產品,而且咱們將按照下面的順序一步步學習。java

Hadoop:是Apache開源組織的一個分佈式計算開源框架,提供了一個分佈式文件系統子項目(HDFS)和支持MapReduce分佈式計算的軟件架構 Hive:基於Hadoop的一個數據倉庫工具 Pig:基於Hadoop的大規模數據分析工具 Zookeeper:是一個爲分佈式應用所設計的分佈的、開源的協調服務,它主要是用來解決分佈式應用中常常遇到的一些數據管理問題,簡化分佈式應用協調及其管理的難度,提供高性能的分佈式服務 HBase:是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集羣 Mahout:基於Hadoop的機器學習和數據挖掘的一個分佈式框架 Sqoop:是一個用來將Hadoop和關係型數據庫中的數據相互轉移的工具,能夠將一個關係型數據庫(MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也能夠將HDFS的數據導進到關係型數據庫中。 Cassandra::是一套開源分佈式NoSQL數據庫系統 Flume:是一個分佈的、可靠的、高可用的海量日誌聚合的系統,可用於日誌數據收集,日誌數據處理,日誌數據傳輸。node


好,接下來開始正式學習Hadoop。linux

1 環境搭建

Hadoop安裝有以下三種方式:nginx

單機模式:安裝簡單,幾乎不用做任何配置,但僅限於調試用途; 僞分佈模式:在單節點上同時啓動NameNode、DataNode、JobTracker、TaskTracker、 Secondary Namenode等5個進程,模擬分佈式運行的各個節點; 徹底分佈式模式:正常的Hadoop集羣,由多個各司其職的節點構成sql

接下來,咱們進行僞分佈式環境的搭建。數據庫

操做系統:Ubuntu 16.04 LTS JDK: JDK1.8 Hadoop:2.6.0apache

S1 建立hadoop用戶

首先切換到root用戶編程

 
1 su root
 

建立用戶,設置密碼,併爲其分配管理員權限ubuntu

useradd -m hadoop -s /bin/bash passwd hadoop adduser hadoop sudo

建立成功後註銷當前用戶,使用hadoop用戶從新登入。

S2 更新apt

後續須要使用apt進行軟件的安裝,在這裏先更新一下apt,執行以下命令:

sudo apt-get update

S3 安裝vim

安裝用於修改文件的vim

sudo apt-get install vim

S4 安裝SSH

安裝SSH用於遠程登錄控制。 ubuntu默認安裝了SSH client,咱們須要安裝SSH server,使用以下命令:

sudo apt-get install openssh-server

使用以下命令便可登入本機

ssh localhost

S5 安裝JDK

首先在官網下載jdk1.8安裝包,我下載的是: jdk-8u111-linux-x64.tar.gz 在usr/lib目錄下新建jvm文件夾並受權:

cd /user/lib sudo mkdir jvm sudo chown hadoop ./jvm sudo chmod -R 777 ./jvm

將下載的安裝包拷貝到jvm目錄下。 在jvm目錄下,執行下面命令進行解壓,並重命名

sudo tar zxvf jdk-8u111-linux-x64.tar.gz sudo mv jdk1.8.0_111 java

繼續在jvm目錄下執行下面命令進入vim編輯器,按」I」進入編輯模式,

vim ~/.bashrc

光標移到最前面,輸入下面內容(必須寫到開頭,寫在末尾在後邊會出現找不到java_home的狀況):

export JAVA_HOME=/usr/lib/jvm/java export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib;${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH

先按ESC鍵,而後按shift+zz保存退出,回到命令行模式輸入下面命令使修改生效

source ~/.bashrc

這樣就配置完了,可使用下面命令驗證是否安裝成功。

echo ¥JAVA_HOME
java -version $JAVA_HOME/bin/java -version

S6 安裝Hadoop2

http://mirror.bit.edu.cn/apache/hadoop/common/ 頁面下載hadoop-2.6.0.tar.gz和hadoop-2.6.0.tar.gz.mds

新建hadoop文件並受權

cd /usr/local sudo mkdir hadoop sudo chown hadoop ./hadoop sudo chmod -R 777 ./hadoop

將下載好的文件拷貝到該目錄下 執行下面命令(我也不清楚幹嗎用)

cat /usr/local/hadoop/hadoop-2.6.0.tar.gz.mds|grep 'MD5' md5sum /usr/local/hadoop/hadoop-2.6.0.tar.gz|tr "a-z" "A-Z"

切換到/usr/local/hadoop目錄,進行解壓並重命名:

cd /usr/local/hadoop sudo tar -zxf hadoop-2.6.0.tar.gz sudo mv hadoop-2.6.0 hadoop2

hadoop解壓後便可用,使用下面命令驗證:

cd /usr/local/hadoop/hadoop2 ./bin/hadoop version

S7 僞分佈式配置

Hadoop的運行方式是以配置文件決定的。 文件位於/usr/local/hadoop/hadoop2/etc/hadoop/中,須要對core-site.xmlh和hdfs-site.xml文件進行修改。 先爲用戶受權:

cd /usr/local/hadoop sudo chown hadoop ./hadoop2 sudo chmod -R 777 ./hadoop2

執行下面命令:

cd /usr/local/hadoop/hadoop2 gedit ./etc/hadoop/core-site.xml

修改成以下配置並保存:

<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/hadoop2/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>

執行下面命令:

gedit ./etc/hadoop/hdfs-site.xml

修改成以下配置並保存:

<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>

若是須要改成非分佈式,再把修改的內容刪掉便可。 執行下面命令進行namenode的格式化(hadoop2目錄下執行)

./bin/hdfs namenode -format

看到Successfully formatted即爲成功。 執行下面命令開去NameNodeDataNode的守護進程

./sbin/start-dfs.sh

按提示一步步操做,啓動完成後使用下面命令驗證:

jps

出現「NameNode」、」DataNode」 和 「SecondaryNameNode」即表示啓動成功。SecondaryNameNode沒有啓動的話請從新啓動,其餘兩個沒有啓動的話檢查以前的配置。 啓動成功後,瀏覽器地址欄輸入:localhost:50070能夠查看NameNode和Datanode的信息。

2 Hadoop初探

把環境搭建好,內心就踏實了,接下來先了解一些必要的理論知識。

2.1 爲何用Hadoop?

任何事物的產生都有其必然性。 從2012年開始,大數據這個詞被愈來愈多的說起,如今咱們已經進入了大數據時代。在這個信息爆炸的時代,天天產生的數據量十分龐大。而大數據也不只僅只是說數據多,大數據有四個特色: 數據量大,類型繁多,價值密度低,速度快時效高。 根據這幾個特色,咱們須要一個東西,具有如下功能:

1.能夠存儲大量數據

2.能夠快速處理大量數據

3.能夠從大量數據中進行分析

因而就產生了Hadoop這個模型:

 

看起來就像一個系統,HDFS和MapReduce是底層,Hive,Pig,Mathout,Zookeeper,Flume,Sqoop,HBase是基於底層系統的一些軟件。 因此Hadoop核心中的核心是HDFS和MapReduce。

因此說: Hadoop就是一個用於處理大數據的計算框架,Hadoop具備分佈式、可靠、可伸縮的特性。 分佈式:Hadoop經過將文件和任務分配到衆多的計算機節點上來提升效率。 可靠:因爲是分佈式的,因此其中一個或幾個節點出現故障,並不會影響整個程序的運行。 可伸縮:任何一個節點的添加和刪除都不會影響程序的運行。

2.2 單節點體系

實際應用中咱們是使用一個有N多臺計算機構成的集羣(也可使用多個建立多個虛擬機來模擬)來使用Hadoop的,若是僅僅只有一臺計算機,那就失去了Hadoop存在的意義。 每臺計算機,咱們稱之爲一個節點,咱們須要爲每個節點都配置Hadoop,經過上邊的配置過程,咱們能夠知道,單節點(即每一臺計算機)adoop的體系結構就像下面的圖;

2.2 HDFS

HDFS全稱是Hadoop Distribute file system ,即Hadoopp分佈式文件系統。 如今的數據量已經達到了PB級(1PB=1024T),對於單個硬盤來講,存儲這個數量級的數據具備至關大的壓力。因此很天然的咱們就會想到將數據切割開來,存儲到多個計算機中,由此誕生了分佈式文件系統。 爲了實現數據的可靠性安全性,HDFS會對每份數據建立副本,默認值是3,及默認狀況下一份數據存儲在三個不一樣的節點上,由此致使HDFS具備以下特色:

1.高度的數據冗餘**:這也是沒有辦法的事,要提升可靠性,冗餘是必不可少的。

2.適合一次寫入,屢次讀取:因爲在寫入數據的時候須要爲數據建立副本,因此寫入的成本很高,若是涉及到了高頻率的IO寫入,不適合使用Hadoop

3.適合存儲大文件,不適合小文件:在HDFS中存在Block的概念,Block是HDFS的存儲單元,默認是64M,不少企業已經調整爲128M。在存儲文件時,會把大文件分割開來存儲在一個個的Block塊中,一個Block塊只會存儲一個文件。因此若是存儲的小文件過多將形成大量存儲空間的浪費。

4.對硬件的要求低:能夠運用於廉價的商業服務器上,不須要使用性能很高但昂貴的服務器。

2.2.1 NameNode,dataNode以及secondary namenode

HDFS集羣是以Master-Slave模式運行的,其實也能夠像nginx中那樣說成是Master-worker,一個意思。主要涉及到兩種節點,一是nameNode,即Master,另外一個是大量的dataNode即worker. 下圖是Apache官網關於NameNode和dataNode的關係圖:

NameNode只有一個,負責維護整個文件系統的元數據,這裏的元數據包含每一個文件、文件位置以及這些文件及其所在的DataNode內的全部數據塊的內存映射。 dataNode存在於每個節點中,負責具體的工做,包括爲讀寫請求提供服務以及按照NameNode的指令執行數據塊建立、刪除和複製。 客戶端(client)表明用戶與namenode和datanode交互來訪問整個文件系統。客戶端提供了一些列的文件系統接口,所以咱們在編程時,幾乎無須知道datanode和namenode,便可完成咱們所須要的功能。 secondary NameNode 要了解secondary NameNode,首先須要先了解namenode的容錯機制。 從上圖能夠看出,一個Hadoop集羣中只要一個nameNode,一旦namenode出現故障,整個集羣將會癱瘓,因此namenode必需要有良好的容錯機制。 第一種方式是遠程備份:即在namenode將數據寫入磁盤時,同步在一個遠程服務器上建立數據的副本。 第二種方式是使用輔助namenode即secondary namenode: 首先咱們須要知道的是namenode將數據保存在了Namespace鏡像和操做日誌中,secondary namenode的主要做用是將這兩個文件按期進行合併。 可是因爲是按期執行,secondaryname並不能實時同步主namenode的數據,因此一旦namenode掛掉,不可避免的會形成數據丟失,因此穩妥的方式就是結合兩種方法,當主namenode宕掉時,將secondary namenode的數據拷貝到secondary namenode,而後再讓secondarynamenode充當namenode的做用。

2.3 MapReduce

MapReduce是Hadoop的分佈式計算框架,如今咱們只作初步的瞭解。 MapReduce=Map+Reduce,即MapReduce分爲Map的過程和Reduce的過程。這兩個剛纔都是須要咱們經過程序來控制的。 先看下面這張圖:

 

這張圖是在網上找的。 如上圖所示就是MapReduce處理的一個完整的過程。 Input:最左邊是輸入的過程,輸入了圖示的數據。 Split分片:mapreduce會根據輸入的文件計算分片,每一個分片對應與一個map任務。而分片的過程和HDFS密切相關,好比HDFS的一個block大小爲64M,咱們輸入的三個文件分比爲10M,65M,128M,這樣的話第一個文件生成一個10M的分片,第二個文件生成一個64M的分片和一個1M的分片,第三個文件生生成兩個64M的分片,這樣的話就會一共生成5個分片。 Map:map階段是由編程人員經過代碼來控制的,圖中所示的大概內容就是將字符串分割開來,做爲鍵存儲在map中,值的位置存儲1,表示數量。 shuffle洗牌:洗牌階段,因爲以前生成map中存在不少鍵相同的map,在洗牌階段將鍵相同的進行合併。 Reduce:reduce階段也是有開發人員經過代碼控制,本例中是將鍵相同的map的value值進行求和,得出最終的map 這樣最後輸出的數據就是每一個字符串出現的次數。

總結

寫到這裏,這篇文章就基本上告一段落了,這篇文章主要包含兩個內容: 1.在Ubuntu環境搭建僞分佈式Hadoop環境。 2.關於Hadoop的一些簡單的必要的理論知識,主要是HDFS和MapReduce

本文轉自:https://blog.csdn.net/u012116457/article/details/53859594

相關文章
相關標籤/搜索