Hadoop那些事兒(一)–Hadoop初探

來源:互聯網
上載者:User

標籤:時代   節點   類型   遠程   vbscript   tty   south   att   mon   

前言

Hadoop是什嗎?
用百科上的話說:“Hadoop是一個由Apache基金會所開發的分布式系統基礎架構。使用者可以在不瞭解分布式底層細節的情況下,開發分布式程式。充分利用叢集的威力進行高速運算和儲存。”
可能有些抽象,這個問題可以在一步步學習Hadoop的各種知識以後再回過頭來重新看待。

Hadoop大家族

Hadoop不是一個單一的項目,經過10年的發展,Hadoop已經成為了一個擁有近20個產品的龐大家族。
其中最核心的包括以下9個產品,並且我們將按照下面的順序一步步學習。

Hadoop:是Apache開源組織的一個分散式運算開源架構,提供了一個Distributed File System子項目(HDFS)和支援MapReduce分散式運算的軟體架構
Hive:基於Hadoop的一個資料倉儲工具
Pig:基於Hadoop的大規模資料分析工具
Zookeeper:是一個為分布式應用所設計的分布的、開源的協調服務,它主要是用來解決分布式應用中經常遇到的一些資料管理問題,簡化分布式應用協調及其管理的難度,提供高效能的分布式服務
HBase:是一個高可靠性、高效能、面向列、可伸縮的分布式儲存系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化儲存叢集
Mahout:基於Hadoop的機器學習和資料採礦的一個分布式架構
Sqoop:是一個用來將Hadoop和關係型資料庫中的資料相互轉移的工具,可以將一個關係型資料庫(MySQL ,Oracle ,Postgres等)中的資料導進到Hadoop的HDFS中,也可以將HDFS的資料導進到關係型資料庫中。
Cassandra::是一套開源分布式NoSQL資料庫系統
Flume:是一個分布的、可靠的、高可用的海量日誌彙總的系統,可用於日誌資料收集,日誌資料處理,日誌資料轉送。

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

1 環境搭建

Hadoop安裝有如下三種方式:

單機模式:安裝簡單,幾乎不用作任何配置,但僅限於調試用途;
偽分布模式:在單節點上同時啟動NameNode、DataNode、JobTracker、TaskTracker、 Secondary Namenode等5個進程,類比分布式啟動並執行各個節點;
完全分布式模式:正常的Hadoop叢集,由多個各司其職的節點構成

接下來,我們進行偽分布式環境的搭建。

作業系統:Ubuntu 16.04 LTS
JDK: JDK1.8
Hadoop:2.6.0

S1 建立hadoop使用者

首先切換到root使用者

su root

建立使用者,設定密碼,並為其分配管理員權限

useradd -m hadoop -s /bin/bashpasswd hadoopadduser 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/libsudo mkdir jvmsudo chown hadoop ./jvmsudo chmod -R 777 ./jvm

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

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

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

vim ~/.bashrc

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

export JAVA_HOME=/usr/lib/jvm/javaexport JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib;${JRE_HOME}/libexport PATH=${JAVA_HOME}/bin:$PATH

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

source ~/.bashrc

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

echo ¥JAVA_HOMEjava -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/localsudo mkdir hadoopsudo chown hadoop ./hadoopsudo 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/hadoopsudo tar -zxf hadoop-2.6.0.tar.gzsudo 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/hadoopsudo chown hadoop ./hadoop2sudo chmod -R 777 ./hadoop2

執行下面命令:

cd /usr/local/hadoop/hadoop2gedit ./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即為成功。
執行下面命令開去NameNode和DataNode的守護進程

./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 ,即HadooppDistributed File System。
現在的資料量已經達到了PB級(1PB=1024T),對於單個硬碟來說,儲存這個數量級的資料具有相當大的壓力。所以很自然的我們就會想到將資料切割開來,儲存到多個電腦中,由此誕生了Distributed File System。
為了實現資料的可靠性安全性,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.
【如有不當的地方,希望各位不吝指出】

Hadoop那些事兒(一)–Hadoop初探

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.