HADOOP入門

1. HADOOP****背景介紹

** 1.1 ****什么是HADOOP**

  1. HADOOP是apache旗下的一套開源軟件平臺

  2. HADOOP提供的功能:利用服務器集群,根據(jù)用戶的自定義業(yè)務邏輯,對海量數(shù)據(jù)進行分布式處理

  3. HADOOP的核心組件有

A. HDFS(分布式文件系統(tǒng))

B. YARN(運算資源調(diào)度系統(tǒng))

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

  1. 廣義上來說,HADOOP通常是指一個更廣泛的概念——HADOOP生態(tài)圈

1.2 ****HADOOP產(chǎn)生背景

  1. HADOOP最早起源于Nutch。Nutch的設計目標是構建一個大型的全網(wǎng)搜索引擎,包括網(wǎng)頁抓取、索引、查詢等功能,但隨著抓取網(wǎng)頁數(shù)量的增加,遇到了嚴重的可擴展性問題——如何解決數(shù)十億網(wǎng)頁的存儲和索引問題。

  2. 2003年、2004年谷歌發(fā)表的兩篇論文為該問題提供了可行的解決方案。

——分布式文件系統(tǒng)(GFS),可用于處理海量網(wǎng)頁的存儲

——分布式計算框架MAPREDUCE,可用于處理海量網(wǎng)頁的索引計算問題。

  1. Nutch的開發(fā)人員完成了相應的開源實現(xiàn)HDFS和MAPREDUCE,并從Nutch中剝離成為獨立項目HADOOP,到2008年1月,HADOOP成為Apache頂級項目,迎來了它的快速發(fā)展期。

1.3 ****HADOOP在大數(shù)據(jù)、云計算中的位置和關系

  1. 云計算是分布式計算、并行計算、網(wǎng)格計算、多核計算、網(wǎng)絡存儲、虛擬化、負載均衡等傳統(tǒng)計算機技術和互聯(lián)網(wǎng)技術融合發(fā)展的產(chǎn)物。借助IaaS(基礎設施即服務)、PaaS(平臺即服務)、SaaS(軟件即服務)等業(yè)務模式,把強大的計算能力提供給終端用戶。

  2. 現(xiàn)階段,云計算的兩大底層支撐技術為“虛擬化”和“大數(shù)據(jù)技術

  3. 而HADOOP則是云計算的PaaS層的解決方案之一,并不等同于PaaS,更不等同于云計算本身。

1.4 ****國內(nèi)外HADOOP應用案例介紹

1、HADOOP應用于數(shù)據(jù)服務基礎平臺建設

2/HADOOP用于用戶畫像

3、HADOOP用于網(wǎng)站點擊流日志****數(shù)據(jù)****挖掘

1.6 ****HADOOP生態(tài)圈以及各組成部分的簡介

各組件簡介

HADOOP(hdfs、MAPREDUCE、yarn) 元老級大數(shù)據(jù)處理技術框架,擅長離線數(shù)據(jù)分析

Zookeeper 分布式協(xié)調(diào)服務基礎組件

Hbase 分布式海量數(shù)據(jù)庫,離線分析和在線業(yè)務通吃

Hive sql 數(shù)據(jù)倉庫工具,使用方便,功能豐富,基于MR延遲大

Sqoop數(shù)據(jù)導入導出工具

Flume數(shù)據(jù)采集框架

重點組件:

HDFS:分布式文件系統(tǒng)

MAPREDUCE:分布式運算程序開發(fā)框架

HIVE:基于大數(shù)據(jù)技術(文件系統(tǒng)+運算框架)的SQL數(shù)據(jù)倉庫工具

HBASE:基于HADOOP的分布式海量數(shù)據(jù)庫

ZOOKEEPER:分布式協(xié)調(diào)服務基礎組件

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

Oozie:工作流調(diào)度框架

Sqoop:數(shù)據(jù)導入導出工具

Flume:日志數(shù)據(jù)采集框架

2 ****分布式系統(tǒng)概述

注:由于大數(shù)據(jù)技術領域的各類技術框架基本上都是分布式系統(tǒng),因此,理解hadoop、storm、spark等技術框架,都需要具備基本的分布式系統(tǒng)概念

2.1 ****分布式軟件系統(tǒng)(Distributed Software Systems)

2 該軟件系統(tǒng)會劃分成多個子系統(tǒng)或模塊,各自運行在不同的機器上,子系統(tǒng)或模塊之間通過網(wǎng)絡通信進行協(xié)作,實現(xiàn)最終的整體功能

2 比如分布式操作系統(tǒng)、分布式程序設計語言及其編譯(解釋)系統(tǒng)、分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng)等。

2.2 ****分布式軟件系統(tǒng)舉例:solrcloud

A. 一個solrcloud集群通常有多臺solr服務器

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

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

D. 索引的建立和查詢會在整個集群的各個節(jié)點上并發(fā)執(zhí)行

E. solrcloud集群作為整體對外服務,而其內(nèi)部細節(jié)可對客戶端透明

總結:利用多個節(jié)點共同協(xié)作完成一項或多項具體業(yè)務功能的系統(tǒng)就是分布式系統(tǒng)。

2.3 分布式應用系統(tǒng)模擬開發(fā)

需求:可以實現(xiàn)由主節(jié)點將運算任務發(fā)往從節(jié)點,并將各從節(jié)點上的任務啟動;

程序清單:

AppMaster

AppSlave/APPSlaveThread

Task

程序運行邏輯流程:

3. ****離線****數(shù)據(jù)分析****流程介紹

注:本環(huán)節(jié)主要感受數(shù)據(jù)分析系統(tǒng)的宏觀概念及處理流程,初步理解hadoop等框架在其中的應用環(huán)節(jié),不用過于關注代碼細節(jié)

一個應用廣泛的數(shù)據(jù)分析系統(tǒng):“web日志數(shù)據(jù)挖掘”

3.1 需求分析

3.1.1 案例名稱

“網(wǎng)站或APP點擊流日志數(shù)據(jù)挖掘系統(tǒng)”。

3.1.2 案例需求描述

“Web點擊流日志”包含著網(wǎng)站運營很重要的信息,通過日志分析,我們可以知道網(wǎng)站的訪問量,哪個網(wǎng)頁訪問人數(shù)最多,哪個網(wǎng)頁最有價值,廣告轉化率、訪客的來源信息,訪客的終端信息等。

3.1.3 數(shù)據(jù)來源

本案例的數(shù)據(jù)主要由用戶的點擊行為記錄

獲取方式:在頁面預埋一段js程序,為頁面上想要監(jiān)聽的標簽綁定事件,只要用戶點擊或移動到標簽,即可觸發(fā)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 數(shù)據(jù)處理流程

3.2.1 流程圖解析

本案例跟典型的BI系統(tǒng)極其類似,整體流程如下:

但是,由于本案例的前提是處理海量數(shù)據(jù),因而,流程中各環(huán)節(jié)所使用的技術則跟傳統(tǒng)BI完全不同,后續(xù)課程都會一一講解:

  1. 數(shù)據(jù)采集:定制開發(fā)采集程序,或使用開源框架FLUME

  2. 數(shù)據(jù)預處理:定制開發(fā)mapreduce程序運行于hadoop集群

  3. 數(shù)據(jù)倉庫技術:基于hadoop之上的Hive

  4. 數(shù)據(jù)導出:基于hadoop的sqoop數(shù)據(jù)導入導出工具

  5. 數(shù)據(jù)可視化:定制開發(fā)web程序或使用kettle等產(chǎn)品

  6. 整個過程的流程調(diào)度:hadoop生態(tài)圈中的oozie工具或其他類似開源產(chǎn)品

3.2.2 項目技術架構圖

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

a) Mapreudce程序運行

b) 在Hive中查詢數(shù)據(jù)

c) 將統(tǒng)計結果導入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 項目最終效果

經(jīng)過完整的數(shù)據(jù)處理流程后,會周期性輸出各類統(tǒng)計指標的報表,在生產(chǎn)實踐中,最終需要將這些報表數(shù)據(jù)以可視化的形式展現(xiàn)出來,本案例采用web程序來實現(xiàn)數(shù)據(jù)可視化

效果如下所示:

4. 集群搭建

4.1 HADOOP集群搭建

4.1.1集群簡介

HADOOP集群具體來說包含兩個集群:HDFS集群和YARN集群,兩者邏輯上分離,但物理上常在一起

HDFS集群:

負責海量數(shù)據(jù)的存儲,集群中的角色主要有 NameNode / DataNode

YARN集群:

負責海量數(shù)據(jù)運算時的資源調(diào)度,集群中的角色主要有 ResourceManager /NodeManager

(那mapreduce是什么呢?它其實是一個應用程序開發(fā)包)

本集群搭建案例,以5節(jié)點為例進行搭建,角色分配如下:

|

hdp-node-01 NameNode SecondaryNameNode

hdp-node-02 ResourceManager

hdp-node-03DataNode NodeManager

hdp-node-04DataNode NodeManager

hdp-node-05DataNode NodeManager

|

部署圖如下:

4.1.2服務器準備

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

ü Vmware 11.0

ü Centos 6.5 64bit

4.1.3網(wǎng)絡環(huán)境準備

ü 采用NAT方式聯(lián)網(wǎng)

ü 網(wǎng)關地址:192.168.33.1

ü 3個服務器節(jié)點IP地址:192.168.33.101、192.168.33.102、192.168.33.103

ü 子網(wǎng)掩碼:255.255.255.0

4.1.4服務器系統(tǒng)設置

ü 添加HADOOP用戶

ü 為HADOOP用戶分配sudoer權限

ü 同步時間

ü 設置主機名

n hdp-node-01

n hdp-node-02

n hdp-node-03

ü 配置內(nèi)網(wǎng)域名映射:

n 192.168.33.101 hdp-node-01

n 192.168.33.102 hdp-node-02

n 192.168.33.103 hdp-node-03

ü 配置ssh免密登陸

ü 配置防火墻

4.1.5 ****J****dk環(huán)境安裝

ü 上傳jdk安裝包

ü 規(guī)劃安裝目錄 /home/hadoop/apps/jdk_1.7.65

ü 解壓安裝包

ü 配置環(huán)境變量 /etc/profile

4.1.6 ****HADOOP****安裝部署

ü 上傳HADOOP安裝包

ü 規(guī)劃安裝目錄 /home/hadoop/apps/hadoop-2.6.1

ü 解壓安裝包

ü 修改配置文件 $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 測試

1、上傳文件到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

|

2、運行一個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使用

1、查看集群狀態(tài)

命令: hdfs dfsadmin –report

可以看出,集群共有3個datanode可用

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

2、上傳文件到HDFS

2 查看HDFS中的目錄信息

命令: hadoop fs –ls /

2 上傳文件

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

2 從HDFS下載文件

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

5.2 MAPREDUCE使用

mapreduce是hadoop中的分布式運算編程框架,只要按照其編程規(guī)范,只需要編寫少量的業(yè)務邏輯代碼即可實現(xiàn)一個強大的海量數(shù)據(jù)并發(fā)處理程序

5.2.1 Demo開發(fā)——wordcount

1、需求

從大量(比如T級別)文本文件中,統(tǒng)計出每一個單詞出現(xiàn)的總次數(shù)

2、mapreduce實現(xiàn)思路

Map階段:

a) 從HDFS的源數(shù)據(jù)文件中逐行讀取數(shù)據(jù)

b) 將每一行數(shù)據(jù)切分出單詞

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

d) 將鍵值對發(fā)送給reduce

Reduce階段:

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

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

c) 對每一組,遍歷組中的所有“值”,累加求和,即得到每一個單詞的總次數(shù)

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

4、 具體編碼實現(xiàn)

(1)定義一個mapper類

|

//首先要定義四個泛型的類型

//keyin: LongWritable valuein: Text

//keyout: Text valueout:IntWritable

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

//map方法的生命周期: 框架每傳一行數(shù)據(jù)就被調(diào)用一次

//key : 這一行的起始點在文件中的偏移量

//value: 這一行的內(nèi)容

@Override

protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

//拿到一行數(shù)據(jù)轉換為string

String line = value.toString();

//將這一行切分出各個單詞

String[] words = line.split(" ");

//遍歷數(shù)組,輸出<單詞,1>

for(String word:words){

context.write(new Text(word), new IntWritable(1));

}

}

}

|

(2)定義一個reducer類

|

//生命周期:框架每傳遞進來一個kv 組,reduce方法被調(diào)用一次

@Override

protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {

//定義一個計數(shù)器

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 {

//把業(yè)務邏輯相關的信息(哪個是mapper,哪個是reducer,要處理的數(shù)據(jù)在哪里,輸出的結果放哪里。。。。。。)描述成一個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);

//設置我們的業(yè)務邏輯Mapper類的輸出key和value的數(shù)據(jù)類型

wcjob.setMapOutputKeyClass(Text.class);

wcjob.setMapOutputValueClass(IntWritable.class);

//設置我們的業(yè)務邏輯Reducer類的輸出key和value的數(shù)據(jù)類型

wcjob.setOutputKeyClass(Text.class);

wcjob.setOutputValueClass(IntWritable.class);

//指定要處理的數(shù)據(jù)所在的位置

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. 準備輸入數(shù)據(jù)

vi /home/hadoop/test.txt

|

Hello tom

Hello jim

Hello ketty

Hello world

Ketty tom

|

在hdfs上創(chuàng)建輸入數(shù)據(jù)文件夾:

hadoop fs mkdir -p /wordcount/input

將words.txt上傳到hdfs上

hadoop fs –put /home/hadoop/words.txt /wordcount/input

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

  2. 使用命令啟動執(zhí)行wordcount程序jar包

$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

  1. 查看執(zhí)行結果

$ hadoop fs –cat /wordcount/out/part-r-00000

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • day06.Hadoop快速入門&云服務三種模式IaaS,PaaS和SaaS【大數(shù)據(jù)教程】 1. HADOOP背景...
    Java幫幫閱讀 1,289評論 0 7
  • HDFS的體系結構 設計目標 自動快速檢測應對硬件錯誤 流式訪問數(shù)據(jù) 轉移計算本身比轉移數(shù)據(jù)更加劃算 簡單的數(shù)據(jù)一...
    Spike_3154閱讀 972評論 0 2
  • 1 大數(shù)據(jù)概率 大數(shù)據(jù)是指在一定時間內(nèi)無法用常規(guī)軟件工具進行捕捉、管理和處理的數(shù)據(jù)集合,是需要新處理模式才能具有更...
    djm猿閱讀 371評論 0 1
  • 一、系統(tǒng)參數(shù)配置優(yōu)化 1、系統(tǒng)內(nèi)核參數(shù)優(yōu)化配置 修改文件/etc/sysctl.conf,添加如下配置,然后執(zhí)行s...
    張偉科閱讀 3,923評論 0 14
  • 嘿,還沒有遇到的你,有些事想告訴你,雖然你可能不會看到,但還是想寫下來慰藉一下一顆年久失修的心。 有些以前很喜歡很...
    BigBigZora閱讀 180評論 0 0

友情鏈接更多精彩內(nèi)容