天天看點

大資料技術 - 學習之路(一)

緣起

大學的時候,記得班裡好多同學學習Android、iOS開發,那時候用戶端開發非常火,并且工作後工資也很高。但是我并沒有心動,我覺得這麼多人去學并不一定是件好事,很可能跟網站開發一樣,一段時間市場飽和後就不會有那麼大的需求量,現在看來這個判斷是正确的。我想學習一門技術現在處于起步期,但是未來比較長的一段時間裡發展前景比較好。那個時候是大四,正在跟同學做一個小創業項目,我在裡面負責網站方面的建設,沒事的時候經常上網,偶然發現大資料相關的文章。我覺得這可能是個新方向,移動網際網路時代,我們上網的頻率更高,時間更長,會有更多的資料産生,進而需要大資料技術做存儲和計算。自從那以後就開始找大資料相關的資料,然後知道有 Hadoop 這麼個東西,剛開始在網上找了幾節入門級的免費視訊,看完之後還是雲裡霧裡,對大資料技術沒有任何感覺。并且那個時候(14年)大資料方面的工作機會比較小,小公司基本沒有相關的技術,我還擔心學了之後不好找工作。為了避免翻車,就買了付費的視訊開始學習。每天睜開眼就開始學,一直學到半夜12點。堅持了倆月,最後找了大資料崗位的實習工作,算是正式上車了。到目前為止從事大資料相關的工作已經快4年了,技術方面接觸了 Flume、Kafka、Hadoop、Spark、Hbase、Hive、Kylin 等架構,業務方面接觸過定位資料、視訊資料、搜尋資料。覺得在大資料方面有一些積累,是以想做一個大資料技術方面的教程,供初學者參考。

學習路線

現在關于大資料入門教程很多,如果時間比較充裕可以找一套視訊慢慢跟着學,畢竟聽别人講比自己看書學的要快。現在比較知名的一些教育訓練網站應該都有免費的入門視訊,可以找找看。如果沒有大塊的時候,可以看書或者看部落格。學習大資料一般是先學 Hadoop,Hadoop在大資料領域的地位就不用在強調了。有些人可能會說是不是 Hadoop 已經過時了,其實并沒有。一方面,Hive、Kylin等架構計算層面對 Hadoop 有依賴,并且 Spark 等新興的架構也是基于Hadoop 的思想;另一方面,目前不少企業資料存儲用的是 HDFS,資料處理仍然用 MapReduce,對于一些實時性要求不高的任務,MapReduce跑起來還是很穩的。

學習Hadoop 核心在于學習分布式存儲和計算。學習大資料技術一個比較高的門檻就是要了解分布式。以前我們寫的程式都是單機的,最多也就是個多線程。但大資料架構都是分布式的,需要學習資料如何分布式存儲、如何保證可靠、機器之間如何通信、資料如何分散到不同的機器計算等,這是思維方式的轉變。初學者可以在網上先找一些評論比較高的入門資料,也可以跟着本教程學習,先整體了解分布式的概念。有了點基礎之後再學習《Hadoop權威指南》,學完之後基本上對Hadoop架構有了深入了解,能夠熟練的寫 MapReduce 做資料處理。

掌握 Hadoop 之後,再往下走有兩個方向。一個方向是做實時計算,需要學習 Spark 和 Flink 等架構,這兩個架構都是批流統一分布式計算架構。Spark 目前比較主流,社群也比較完善,但是開發語言用 Scala,并且分布式計算的思想在 Hadoop 之上又抽象了許多概念,是以入門有些門檻,一旦入門口後再開發就很順手了。Spark的書可以看看《Spark技術内幕》。Flink 之前生态不如 Spark,但最近阿裡将 Blink 貢獻給 Flink 社群,相信以後 Flink 的發展會更好,社群會更強大。Flink 做更适合做硬實時的計算。另一個方向就是資料倉庫建設,用到 Hive、Kylin 等架構。基本上每個公司都有數倉建設團隊,Hive 适合離線大資料計算,使用SQL語言開發。SQL語言門檻比較低,所有有些公司會培養業務人員或者産品經理寫SQL,而程式員更專注數倉的建設。Kylin主要是滿足互動式查詢,适合做多元分析。多元分析的架構除了Kylin還有很多,大家可以自行上網查閱對比。這個方向更加側重資料模組化,相關的的書推薦《Hive權威指南》、《次元模組化工具箱》、《阿裡巴巴大資料之路》。

工具以及技術掌握熟練之後,再往下走就是資料分析。資料最終是要提供決策,是以,資料分析的能力很重要。如果隻是寫個SQL、跑個數,長期下去并不利于我們的成長。我們要經常對資料作分析,培養資料的敏感度,能夠通過資料對産品提出指導意見。這個過程可能會用到資料挖掘相關的技術。做大資料相關的工作跟其他的程式員還是有比較大的差別。 一方面我們能夠掌握所有的資料,另一方面我們可以通過資料分析指導決策。

本章剩下的部分就從搭建 Hadoop 叢集開始,學習 Hadoop 技術。搭建 Hadoop 叢集一般用 Cloudera Manager 或者 HortonWorks,搭建起來很容易。我在之前的公司是用 Cloudera Manager 搭建 Hadoop 叢集,并且公司經常需要到客戶的伺服器單獨部署大資料計算服務,是以對 Cloudera 那套東西非常熟。熟到什麼程度呢,通過搭建本地 Http 服務,基本上10分鐘左右就能搭建一個叢集。但我們現在是在學習 Hadoop 技術,是以還是自己親子搭建叢集更利于我們學習。

準備

至少得是一台 8G 記憶體的電腦,我們做開發 CPU 基本上差不到哪兒去。安裝VMware或者VirtualBox,搭建三台虛拟機。我的電腦 16G 記憶體,三台虛拟機配置如下:

作業系統:Centos 7.3 64位
記憶體:1GB
硬碟: 40G
CPU:1核
主機名與IP對應關系
192.168.29.132 hadoop0
192.168.29.133 hadoop1
192.168.29.134 hadoop2      

 下載下傳 JDK 和 穩定版的 Hadoop,我用JDK8 + Hadoop 2.9.2,對應的檔案名為 jdk-8u151-linux-x64.tar.gz hadoop-2.9.2.tar.gz。

配置hosts

首先,需要給每個虛拟機設定 hostname

hostnamectl set-hostname hadoop0      

在 /etc/hosts檔案中加入三台主機的IP和hostname的對應關系

192.168.29.132 hadoop0
192.168.29.133 hadoop1
192.168.29.134 hadoop2      

關閉防火牆

打開防火牆不友善機器之前的通信,并且公司的 Hadoop 叢集一般是再内網搭建,是以可以關閉防火牆。需要在這三台主機執行以下指令

systemctl stop firewalld.service    #關閉防火牆
systemctl disable firewalld.service #禁止開啟啟動      

設定SSH免密碼登入

我們可能需要在一台機器上啟動叢集其他主機的服務,就需要SSH登入到其他主機,這時候設定SSH免密碼登入會比較方面。在三台機器上執行以下指令

ssh-keygen -t rsa      

執行完畢後,會在 ~/.ssh 目錄裡發現 id_rsa.pub 檔案。在主機 hadoop0 中執行以下指令

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys      

執行後,将其他兩台主機的 ~/.ssh/id_rsa.pub 檔案中的内容複制到 hadoop0 的 ~/.ssh/authorized_keys 檔案中,然後執行以下指令

scp ~/.ssh/authorized_keys hadoop1:~/.ssh
scp ~/.ssh/authorized_keys hadoop2:~/.ssh      

這樣便可以實作在任意一台機器都可以通過SSH免密碼登入到其他兩台機器。

安裝JDK

在三台主機中都要安裝JDK,安裝JDK直接解壓 tar.gz 檔案即可。将解壓後的目錄配置到環境變量中,環境變量可以在 /etc/profile 檔案中配置,内容如下

# /etc/profile
JAVA_HOME=/work/software/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH      

修改檔案後,直接 source /etc/profile 使配置生效,再通過 java -version 指令驗證配置是否正确。

安裝并配置 Hadoop

安裝 Hadoop 在 hadoop0 一台機器操作即可,安裝 Hadoop 也是解壓 tar.gz 檔案,同時在 /etc/profile 中配置 HADOOP_HOME,檔案内容如下

# /etc/profile
JAVA_HOME=/work/software/jdk1.8.0_151
HADOOP_HOME=/work/software/hadoop-2.9.2
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH      

Hadoop的配置主要包括 hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 、slaves 檔案。這些檔案在 Hadoop 解壓目錄中 etc/hadoop 目錄裡。在進行配置之前,先簡單看一下 hadoop 架構中幾個元件

HDFS NameNode:資料存儲主節點,管理檔案系統和命名空間,一般1個,可以兩個做高可用
HDFS DataNode:資料存儲從節點,主要是用來存儲資料,一般跟叢集機器節點個數一樣
ResourceManager:資源管理的節點,接受任務并配置設定資源,一般1個,也可以2個做高可用
NodeManager:運作任務的容器,一般跟DataNode節點在一起
JobHistoryServer:管理曆史任務      

了解基本概念後, 接下來看看具體的配置。

hadoop-env.sh

主要設定 JAVA_HOME,打開 hadoop-env.sh 檔案,找到 JAVA_HOME 的指派語句,修改如下

export JAVA_HOME=/work/software/jdk1.8.0_151      

core-site.xml

<configuration>
        <property> <!--配置hdfs namenode節點-->
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop0:9000</value>
        </property>
</configuration>      

hdfs-site.xml

<configuration>
        <property> <!--NameNode namespace等資訊存儲路徑-->
                <name>dfs.namenode.name.dir</name>
                <value>/data/dfs/name</value>
        </property>
        <property>  <!--DataNode 存儲資料的路徑,需要在本地建立/data/dfs目錄 -->
                <name>dfs.datanode.data.dir</name>
                <value>/data/dfs/data</value>
        </property>
        <property>  <!--配置secondarynamnode節點-->
                <name>dfs.namenode.secondary.http-address</name>
                <value>hadoop1:50090</value>
        </property>
</configuration>      

yarn-site.xml

<configuration>
        <property> <!--配置resourcemanager節點-->
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop0</value>
        </property>
        <property> <!--指定shuffle-->
       <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
         </property>
         <property><!--打開日志聚合-->
             <name>yarn.log-aggregation-enable</name>
             <value>true</value>
         </property>
</configuration>               

mapred-site.xml

<configuration>
        <property> <!--配置資源管理架構-->
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>  <!--配置 jobhistory 節點-->
                <name>mapreduce.jobhistory.address</name>
                <value>hadoop2:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>hadoop2:19888</value>
        </property>
</configuration>      

slaves

hadoop0
hadoop1
hadoop2      

配置完畢後,将 hadoop-2.9.2 目錄,複制到另外兩台機器中, 并配置這兩台機器的 HADOOP_HOME,并建立 DataNode 存儲資料的目錄 /data/dfs

scp -r /work/software/hadoop-2.9.2 hadoop1:/work/software
scp -r /work/software/hadoop-2.9.2 hadoop2:/work/software      

啟動叢集

在主機 hadoop0 中,進入 /work/software/hadoop-2.9.2 目錄中,執行以下指令

./sbin/start-dfs.sh
./sbin/start-yarn.sh      

可以看到指令執行過程中列印的日志,會根據 slaves 檔案到其他的機器啟動相應的程序。可以在每台機器執行 jps 指令,看看啟動了哪些程序。

在 hadoop2 機器中,啟動 jobhistoryserver 程序,同樣進入到 /work/software/hadoop-2.9.2,執行以下指令

./sbin/mr-jobhistory-daemon.sh --config etc/hadoop start historyserver      

驗證叢集

可以通過 jps 指令,看看叢集中的每台機器是不是啟動了相應的服務。同時,可以通過web界面檢視叢集的狀态以及配置,可以在實體機通路以下頁面,需要在實體機配置hosts,否則需要用 IP 位址通路

NameNode web頁面:        hadoop0:50070
ResourceManager web頁面:     hadoop0:8088
HistoryServer web頁面:      hadoop2:19888      

總結

這篇文章主要介紹了大資料一些基本概念, 學習路線,最後動手搭建了 Hadoop 叢集,希望能夠對初學的同學有幫助。後續講解 Hadoop 技術架構的細節。