Hadoop快速入門

背景介紹

1.1 什麼是HADOOP
  1. HADOOP是apache旗下的一套開源軟件平臺
  2. HADOOP提供的功能:利用服務器集羣,根據用戶的自定義業務邏輯,對海量數據進行分佈式處理
  3. HADOOP的核心組件有

A. HDFS(分佈式文件系統)java

B. YARN(運算資源調度系統)node

C. MAPREDUCE(分佈式運算編程框架)python

  1. 廣義上來講,HADOOP一般是指一個更普遍的概念——HADOOP生態圈
1.2 HADOOP產生背景
  1. HADOOP最先起源於Nutch。Nutch的設計目標是構建一個大型的全網搜索引擎,包括網頁抓取、索引、查詢等功能,但隨着抓取網頁數量的增長,遇到了嚴重的可擴展性問題——如何解決數十億網頁的存儲和索引問題。mysql

  2. 2003年、2004年穀歌發表的兩篇論文爲該問題提供了可行的解決方案。jquery

——分佈式文件系統(GFS),可用於處理海量網頁的存儲nginx

——分佈式計算框架MAPREDUCE,可用於處理海量網頁的索引計算問題。web

  1. Nutch的開發人員完成了相應的開源實現HDFS和MAPREDUCE,並從Nutch中剝離成爲獨立項目HADOOP,到2008年1月,HADOOP成爲Apache頂級項目,迎來了它的快速發展期。
1.3 HADOOP在大數據、雲計算中的位置和關係
  1. 雲計算是分佈式計算、並行計算、網格計算、多核計算、網絡存儲、虛擬化、負載均衡等傳統計算機技術和互聯網技術融合發展的產物。藉助IaaS(基礎設施即服務)、PaaS(平臺即服務)、SaaS(軟件即服務)等業務模式,把強大的計算能力提供給終端用戶。ajax

  2. 現階段,雲計算的兩大底層支撐技術爲「虛擬化」和「大數據技術」算法

  3. 而HADOOP則是雲計算的PaaS層的解決方案之一,並不等同於PaaS,更不等同於雲計算自己。sql

1.4 國內外HADOOP應用案例介紹

一、HADOOP應用於數據服務基礎平臺建設

2/HADOOP用於用戶畫像

三、HADOOP用於網站點擊流日誌數據挖掘

1.5 國內HADOOP的就業狀況分析

一、 HADOOP就業總體狀況

A. 大數據產業已歸入國家十三五規劃

B. 各大城市都在進行智慧城市項目建設,而智慧城市的根基就是大數據綜合平臺

C. 互聯網時代數據的種類,增加都呈現爆發式增加,各行業對數據的價值日益重視

D. 相對於傳統JAVAEE技術領域來講,大數據領域的人才相對稀缺

E. 隨着現代社會的發展,數據處理和數據挖掘的重要性只會增不會減,所以,大數據技術是一個尚在蓬勃發展且具備長遠前景的領域

二、 HADOOP就業職位要求
大數據是個複合專業,包括應用開發、軟件平臺、算法、數據挖掘等,所以,大數據技術領域的就業選擇是多樣的,但就HADOOP而言,一般都須要具有如下技能或知識:

A. HADOOP分佈式集羣的平臺搭建

B. HADOOP分佈式文件系統HDFS的原理理解及使用

C. HADOOP分佈式運算框架MAPREDUCE的原理理解及編程

D. Hive數據倉庫工具的熟練應用

E. Flume、sqoop、oozie等輔助工具的熟練使用

F. Shell/python等腳本語言的開發能力

三、 HADOOP相關職位的薪資水平
大數據技術或具體到HADOOP的就業需求目前主要集中在北上廣深一線城市,薪資待遇廣泛高於傳統JAVAEE開發人員,以北京爲例:

1.6 HADOOP生態圈以及各組成部分的簡介

重點組件:

  • HDFS:分佈式文件系統

  • MAPREDUCE:分佈式運算程序開發框架

  • HIVE:基於大數據技術(文件系統+運算框架)的SQL數據倉庫工具

HBASE:基於HADOOP的分佈式海量數據庫

  • ZOOKEEPER:分佈式協調服務基礎組件

  • Mahout:基於mapreduce/spark/flink等分佈式運算框架的機器學習算法庫

Oozie:工做流調度框架

Sqoop:數據導入導出工具

Flume:日誌數據採集框架

2 分佈式系統概述

注:因爲大數據技術領域的各種技術框架基本上都是分佈式系統,所以,理解hadoop、storm、spark等技術框架,都須要具有基本的分佈式系統概念

2.1 分佈式軟件系統(Distributed Software Systems)

該軟件系統會劃分紅多個子系統或模塊,各自運行在不一樣的機器上,子系統或模塊之間經過網絡通訊進行協做,實現最終的總體功能

好比分佈式操做系統、分佈式程序設計語言及其編譯(解釋)系統、分佈式文件系統和分佈式數據庫系統等。

2.2 分佈式軟件系統舉例:solrcloud

A. 一個solrcloud集羣一般有多臺solr服務器

B. 每個solr服務器節點負責存儲整個索引庫的若干個shard(數據分片)

C. 每個shard又有多臺服務器存放若干個副本互爲主備用

D. 索引的創建和查詢會在整個集羣的各個節點上併發執行

E. solrcloud集羣做爲總體對外服務,而其內部細節可對客戶端透明

總結:利用多個節點共同協做完成一項或多項具體業務功能的系統就是分佈式系統。

2.3 分佈式應用系統模擬開發

需求:能夠實現由主節點將運算任務發往從節點,並將各從節點上的任務啓動;
程序清單:

AppMaster

AppSlave/APPSlaveThread

Task

程序運行邏輯流程:

3. 離線數據分析流程介紹

注:本環節主要感覺數據分析系統的宏觀概念及處理流程,初步理解hadoop等框架在其中的應用環節,不用過於關注代碼細節

一個應用普遍的數據分析系統:「web日誌數據挖掘」

3.1 需求分析
3.1.1 案例名稱

「網站或APP點擊流日誌數據挖掘系統」。

3.1.2 案例需求描述

「Web點擊流日誌」包含着網站運營很重要的信息,經過日誌分析,咱們能夠知道網站的訪問量,哪一個網頁訪問人數最多,哪一個網頁最有價值,廣告轉化率、訪客的來源信息,訪客的終端信息等。

3.1.3 數據來源

本案例的數據主要由用戶的點擊行爲記錄

獲取方式:
在頁面預埋一段js程序,爲頁面上想要監聽的標籤綁定事件,只要用戶點擊或移動到標籤,便可觸發ajax請求到後臺servlet程序,用log4j記錄下事件信息,從而在web服務器(nginx、tomcat等)上造成不斷增加的日誌文件。

形如:

58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"

3.2 數據處理流程
3.2.1 流程圖解析

本案例跟典型的BI系統極其相似,總體流程以下:

可是,因爲本案例的前提是處理海量數據,於是,流程中各環節所使用的技術則跟傳統BI徹底不一樣,後續課程都會一一講解:
1) 數據採集:定製開發採集程序,或使用開源框架FLUME
2) 數據預處理:定製開發mapreduce程序運行於hadoop集羣
3) 數據倉庫技術:基於hadoop之上的Hive
4) 數據導出:基於hadoop的sqoop數據導入導出工具
5) 數據可視化:定製開發web程序或使用kettle等產品
6) 整個過程的流程調度:hadoop生態圈中的oozie工具或其餘相似開源產品

3.2.2 項目技術架構圖

3.2.3 項目相關截圖(感性認識,欣賞便可)

a) Mapreudce程序運行

b) 在Hive中查詢數據

c) 將統計結果導入mysql

./sqoop export --connect jdbc:mysql://localhost:3306/weblogdb --username root --password root --table t_display_xx --export-dir /user/hive/warehouse/uv/dt=2014-08-03

3.3 項目最終效果

通過完整的數據處理流程後,會週期性輸出各種統計指標的報表,在生產實踐中,最終須要將這些報表數據以可視化的形式展示出來,本案例採用web程序來實現數據可視化
效果以下所示:

4. 集羣搭建

4.1 HADOOP集羣搭建
4.1.1集羣簡介

HADOOP集羣具體來講包含兩個集羣:HDFS集羣和YARN集羣,二者邏輯上分離,但物理上常在一塊兒

HDFS集羣:
負責海量數據的存儲,集羣中的角色主要有 NameNode / DataNode

YARN集羣:
負責海量數據運算時的資源調度,集羣中的角色主要有 ResourceManager /NodeManager
(那mapreduce是什麼呢?它實際上是一個應用程序開發包)

本集羣搭建案例,以5節點爲例進行搭建,角色分配以下:
節點 | 角色
---| ---
hdp-node-01 | NameNode SecondaryNameNode
hdp-node-02 | ResourceManager
hdp-node-03 | DataNode NodeManager
hdp-node-04 | DataNode NodeManager
hdp-node-05 | DataNode NodeManager

部署圖以下:

4.1.2服務器準備
本案例使用虛擬機服務器來搭建HADOOP集羣,所用軟件及版本:

  • [x] Vmware 11.0
  • [x] Centos 6.5 64bit

4.1.3網絡環境準備

  • [x] 採用NAT方式聯網
  • [x] 網關地址:192.168.33.1
  • [x] 3個服務器節點IP地址:192.168.33.10一、192.168.33.10二、192.168.33.103
  • [x] 子網掩碼:255.255.255.0
    4.1.4服務器系統設置
  • [x] 添加HADOOP用戶
  • [x] 爲HADOOP用戶分配sudoer權限
  • [x] 同步時間
  • [x] 設置主機名
  • hdp-node-01
  • hdp-node-02
  • hdp-node-03
  • [x] 配置內網域名映射:
  • 192.168.33.101 hdp-node-01
  • 192.168.33.102 hdp-node-02
  • 192.168.33.103 hdp-node-03
  • [x] 配置ssh免密登錄
  • [x] 配置防火牆

4.1.5 Jdk環境安裝

  • [x] 上傳jdk安裝包
  • [x] 規劃安裝目錄 /home/hadoop/apps/jdk_1.7.65
  • [x] 解壓安裝包
  • [x] 配置環境變量 /etc/profile

4.1.6 HADOOP安裝部署

  • [x] 上傳HADOOP安裝包
  • [x] 規劃安裝目錄 /home/hadoop/apps/hadoop-2.6.1
  • [x] 解壓安裝包
  • [x] 修改配置文件 $HADOOP_HOME/etc/hadoop/
++最簡化配置以下:++
vi hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/home/hadoop/apps/jdk1.7.0_51
vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdp-node-01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/HADOOP/apps/hadoop-2.6.1/tmp</value>
</property>
</configuration>
vi hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/data</value>
</property>

<property>
<name>dfs.replication</name>
<value>3</value>
</property>

<property>
<name>dfs.secondary.http.address</name>
<value>hdp-node-01:50090</value>
</property>
</configuration>
vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
vi yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
vi salves
hdp-node-01
hdp-node-02
hdp-node-03
4.1.7 啓動集羣
初始化HDFS
bin/hadoop  namenode  -format
啓動HDFS
sbin/start-dfs.sh
啓動YARN
sbin/start-yarn.sh
4.1.8 測試
一、上傳文件到HDFS

從本地上傳一個文本文件到hdfs的/wordcount/input目錄下

[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input
[HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt  /wordcount/input
二、運行一個mapreduce程序

在HADOOP安裝目錄下,運行一個示例mr程序

cd $HADOOP_HOME/share/hadoop/mapreduce/
hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input  /wordcount/output

5 集羣使用初步

5.1 HDFS使用
一、查看集羣狀態

命令: hdfs dfsadmin –report

能夠看出,集羣共有3個datanode可用

也可打開web控制檯查看HDFS集羣信息,在瀏覽器打開http://hdp-node-01:50070/

二、上傳文件到HDFS

查看HDFS中的目錄信息
命令: hadoop fs –ls /

上傳文件

命令: hadoop fs -put ./ scala-2.10.6.tgz to /

從HDFS下載文件

命令: hadoop fs -get /yarn-site.xml

5.2 MAPREDUCE使用

mapreduce是hadoop中的分佈式運算編程框架,只要按照其編程規範,只須要編寫少許的業務邏輯代碼便可實現一個強大的海量數據併發處理程序

5.2.1 Demo開發——wordcount

一、需求
從大量(好比T級別)文本文件中,統計出每個單詞出現的總次數

二、mapreduce實現思路
Map階段:

a) 從HDFS的源數據文件中逐行讀取數據

b) 將每一行數據切分出單詞

c) 爲每個單詞構造一個鍵值對(單詞,1)

d) 將鍵值對發送給reduce

Reduce階段:

a) 接收map階段輸出的單詞鍵值對

b) 將相同單詞的鍵值對匯聚成一組

c) 對每一組,遍歷組中的全部「值」,累加求和,即獲得每個單詞的總次數

d) 將(單詞,總次數)輸出到HDFS的文件中

四、 具體編碼實現
(1)定義一個mapper類

//首先要定義四個泛型的類型
//keyin:  LongWritable    valuein: Text
//keyout: Text            valueout:IntWritable

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
    //map方法的生命週期:  框架每傳一行數據就被調用一次
    //key :  這一行的起始點在文件中的偏移量
    //value: 這一行的內容
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //拿到一行數據轉換爲string
        String line = value.toString();
        //將這一行切分出各個單詞
        String[] words = line.split(" ");
        //遍歷數組,輸出<單詞,1>
        for(String word:words){
            context.write(new Text(word), new IntWritable(1));
        }
    }
}

(2)定義一個reducer類

//生命週期:框架每傳遞進來一個kv 組,reduce方法被調用一次
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //定義一個計數器
        int count = 0;
        //遍歷這一組kv的全部v,累加到count中
        for(IntWritable value:values){
            count += value.get();
        }
        context.write(key, new IntWritable(count));
    }
}

(3)定義一個主類,用來描述job並提交job

public class WordCountRunner {
    //把業務邏輯相關的信息(哪一個是mapper,哪一個是reducer,要處理的數據在哪裏,輸出的結果放哪裏。。。。。。)描述成一個job對象
    //把這個描述好的job提交給集羣去運行
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job wcjob = Job.getInstance(conf);
        //指定我這個job所在的jar包
//      wcjob.setJar("/home/hadoop/wordcount.jar");
        wcjob.setJarByClass(WordCountRunner.class);
        
        wcjob.setMapperClass(WordCountMapper.class);
        wcjob.setReducerClass(WordCountReducer.class);
        //設置咱們的業務邏輯Mapper類的輸出key和value的數據類型
        wcjob.setMapOutputKeyClass(Text.class);
        wcjob.setMapOutputValueClass(IntWritable.class);
        //設置咱們的業務邏輯Reducer類的輸出key和value的數據類型
        wcjob.setOutputKeyClass(Text.class);
        wcjob.setOutputValueClass(IntWritable.class);
        
        //指定要處理的數據所在的位置
        FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt");
        //指定處理完成以後的結果所保存的位置
        FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/"));
        
        //向yarn集羣提交這個job
        boolean res = wcjob.waitForCompletion(true);
        System.exit(res?0:1);
    }
5.2.2 程序打包運行
  1. 將程序打包
  2. 準備輸入數據

++vi /home/hadoop/test.txt++

Hello tom
Hello jim
Hello ketty
Hello world
Ketty tom

在hdfs上建立輸入數據文件夾:
hadoop fs mkdir -p /wordcount/input
將words.txt上傳到hdfs上
hadoop fs –put /home/hadoop/words.txt /wordcount/input

  1. 將程序jar包上傳到集羣的任意一臺服務器上

  2. 使用命令啓動執行wordcount程序jar包
    $ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

  3. 查看執行結果
    $ hadoop fs –cat /wordcount/out/part-r-00000

相關文章
相關標籤/搜索