天天看點

HADOOP入門 1. HADOOP背景介紹 2 分布式系統概述 3. 離線資料分析流程介紹 4. 叢集搭建 5 叢集使用初步

1. HADOOP是apache旗下的一套開源軟體平台

2. HADOOP提供的功能:利用伺服器叢集,根據使用者的自定義業務邏輯,對海量資料進行分布式處理

3. HADOOP的核心元件有

A. HDFS(分布式檔案系統)

B. YARN(運算資源排程系統)

C. MAPREDUCE(分布式運算程式設計架構)

4. 廣義上來說,HADOOP通常是指一個更廣泛的概念——HADOOP生态圈

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

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

——分布式檔案系統(GFS),可用于處理海量網頁的存儲

——分布式計算架構MAPREDUCE,可用于處理海量網頁的索引計算問題。

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

1. 雲計算是分布式計算、并行計算、網格計算、多核計算、網絡存儲、虛拟化、負載均衡等傳統計算機技術和網際網路技術融合發展的産物。借助IaaS(基礎設施即服務)、PaaS(平台即服務)、SaaS(軟體即服務)等業務模式,把強大的計算能力提供給終端使用者。

2. 現階段,雲計算的兩大底層支撐技術為“虛拟化”和“大資料技術”

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

1、HADOOP應用于資料服務基礎平台建設

2/HADOOP用于使用者畫像

3、HADOOP用于網站點選流日志資料挖掘

各元件簡介

HADOOP(hdfs、MAPREDUCE、yarn)  元老級大資料處理技術架構,擅長離線資料分析

Zookeeper   分布式協調服務基礎元件

Hbase  分布式海量資料庫,離線分析和線上業務通吃

Hive sql 資料倉庫工具,使用友善,功能豐富,基于MR延遲大

Sqoop資料導入導出工具

Flume資料采集架構

重點元件:

HDFS:分布式檔案系統

MAPREDUCE:分布式運算程式開發架構

HIVE:基于大資料技術(檔案系統+運算架構)的SQL資料倉庫工具

HBASE:基于HADOOP的分布式海量資料庫

ZOOKEEPER:分布式協調服務基礎元件

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

Oozie:工作流排程架構

Sqoop:資料導入導出工具

Flume:日志資料采集架構

注:由于大資料技術領域的各類技術架構基本上都是分布式系統,是以,了解hadoop、storm、spark等技術架構,都需要具備基本的分布式系統概念

2 該軟體系統會劃分成多個子系統或子產品,各自運作在不同的機器上,子系統或子產品之間通過網絡通信進行協作,實作最終的整體功能

2 比如分布式作業系統、分布式程式設計語言及其編譯(解釋)系統、分布式檔案系統和分布式資料庫系統等。

A. 一個solrcloud叢集通常有多台solr伺服器

B. 每一個solr伺服器節點負責存儲整個索引庫的若幹個shard(資料分片)

C. 每一個shard又有多台伺服器存放若幹個副本互為主備用

D. 索引的建立和查詢會在整個叢集的各個節點上并發執行

E. solrcloud叢集作為整體對外服務,而其内部細節可對用戶端透明

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

需求:可以實作由主節點将運算任務發往從節點,并将各從節點上的任務啟動;

程式清單:

AppMaster

AppSlave/APPSlaveThread

Task

程式運作邏輯流程:

注:本環節主要感受資料分析系統的宏觀概念及處理流程,初步了解hadoop等架構在其中的應用環節,不用過于關注代碼細節

一個應用廣泛的資料分析系統:“web日志資料挖掘”

<a href="https://s5.51cto.com/wyfs02/M00/8F/3A/wKioL1jYYcyBUXicAAJvi8-go5Y921.png" target="_blank"></a>

“網站或APP點選流日志資料挖掘系統”。

“Web點選流日志”包含着網站營運很重要的資訊,通過日志分析,我們可以知道網站的通路量,哪個網頁通路人數最多,哪個網頁最有價值,廣告轉化率、訪客的來源資訊,訪客的終端資訊等。

本案例的資料主要由使用者的點選行為記錄

擷取方式:在頁面預埋一段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"

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

但是,由于本案例的前提是處理海量資料,因而,流程中各環節所使用的技術則跟傳統BI完全不同,後續課程都會一一講解:

1) 資料采集:定制開發采集程式,或使用開源架構FLUME

2) 資料預處理:定制開發mapreduce程式運作于hadoop叢集

3) 資料倉庫技術:基于hadoop之上的Hive

4) 資料導出:基于hadoop的sqoop資料導入導出工具

5) 資料可視化:定制開發web程式或使用kettle等産品

6) 整個過程的流程排程:hadoop生态圈中的oozie工具或其他類似開源産品

<a href="https://s5.51cto.com/wyfs02/M02/8F/3C/wKiom1jYYgfh7I6kAACWWf8i_mM048.png" target="_blank"></a>

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

經過完整的資料處理流程後,會周期性輸出各類統計名額的報表,在生産實踐中,最終需要将這些報表資料以可視化的形式展現出來,本案例采用web程式來實作資料可視化

效果如下所示:

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

HDFS叢集:

負責海量資料的存儲,叢集中的角色主要有 NameNode / DataNode

YARN叢集:

負責海量資料運算時的資源排程,叢集中的角色主要有 ResourceManager /NodeManager

(那mapreduce是什麼呢?它其實是一個應用程式開發包)

本叢集搭建案例,以5節點為例進行搭建,角色配置設定如下:

hdp-node-01    NameNode  SecondaryNameNode

hdp-node-02    ResourceManager

hdp-node-03DataNode    NodeManager

hdp-node-04DataNode    NodeManager

hdp-node-05DataNode    NodeManager

本案例使用虛拟機伺服器來搭建HADOOP叢集,所用軟體及版本:

ü Vmware 11.0

ü Centos  6.5  64bit

ü 采用NAT方式聯網

ü 網關位址:192.168.33.1

ü 3個伺服器節點IP位址:192.168.33.101、192.168.33.102、192.168.33.103

ü 子網路遮罩:255.255.255.0

ü 添加HADOOP使用者

ü 為HADOOP使用者配置設定sudoer權限

ü 同步時間

ü 設定主機名

n hdp-node-01

n hdp-node-02

n hdp-node-03

ü 配置内網域名映射:

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免密登陸

ü 配置防火牆

ü 上傳jdk安裝包

ü 規劃安裝目錄  /home/hadoop/apps/jdk_1.7.65

ü 解壓安裝包

ü 配置環境變量 /etc/profile

ü 上傳HADOOP安裝包

ü 規劃安裝目錄  /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

&lt;configuration&gt;

&lt;property&gt;

&lt;name&gt;fs.defaultFS&lt;/name&gt;

&lt;value&gt;hdfs://hdp-node-01:9000&lt;/value&gt;

&lt;/property&gt;

&lt;name&gt;hadoop.tmp.dir&lt;/name&gt;

&lt;value&gt;/home/HADOOP/apps/hadoop-2.6.1/tmp&lt;/value&gt;

&lt;/configuration&gt;

vi  hdfs-site.xml

&lt;name&gt;dfs.namenode.name.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/name&lt;/value&gt;

&lt;name&gt;dfs.datanode.data.dir&lt;/name&gt;

&lt;value&gt;/home/hadoop/data/data&lt;/value&gt;

&lt;name&gt;dfs.replication&lt;/name&gt;

&lt;value&gt;3&lt;/value&gt;

&lt;name&gt;dfs.secondary.http.address&lt;/name&gt;

&lt;value&gt;hdp-node-01:50090&lt;/value&gt;

vi  mapred-site.xml

&lt;name&gt;mapreduce.framework.name&lt;/name&gt;

&lt;value&gt;yarn&lt;/value&gt;

vi  yarn-site.xml

&lt;name&gt;yarn.resourcemanager.hostname&lt;/name&gt;

&lt;value&gt;hadoop01&lt;/value&gt;

&lt;name&gt;yarn.nodemanager.aux-services&lt;/name&gt;

&lt;value&gt;mapreduce_shuffle&lt;/value&gt;

vi  salves

hdp-node-01

hdp-node-02

hdp-node-03

初始化HDFS

bin/hadoop  namenode  -format

啟動HDFS

sbin/start-dfs.sh

啟動YARN

sbin/start-yarn.sh

從本地上傳一個文本檔案到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

在HADOOP安裝目錄下,運作一個示例mr程式

cd $HADOOP_HOME/share/hadoop/mapreduce/

hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input  /wordcount/output

1、檢視叢集狀态

指令:   hdfs  dfsadmin  –report

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

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

mapreduce是hadoop中的分布式運算程式設計架構,隻要按照其程式設計規範,隻需要編寫少量的業務邏輯代碼即可實作一個強大的海量資料并發處理程式

1、需求

從大量(比如T級别)文本檔案中,統計出每一個單詞出現的總次數

2、mapreduce實作思路

Map階段:

a) 從HDFS的源資料檔案中逐行讀取資料

b) 将每一行資料切分出單詞

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

d) 将鍵值對發送給reduce

Reduce階段:

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

b) 将相同單詞的鍵值對彙聚成一組

c) 對每一組,周遊組中的所有“值”,累加求和,即得到每一個單詞的總次數

d) 将(單詞,總次數)輸出到HDFS的檔案中

4、 具體編碼實作

(1)定義一個mapper類

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

//keyin:  LongWritable    valuein: Text

//keyout: Text            valueout:IntWritable

public class WordCountMapper extends Mapper&lt;LongWritable, Text, Text, IntWritable&gt;{

//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(" ");

//周遊數組,輸出&lt;單詞,1&gt;

for(String word:words){

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

}

(2)定義一個reducer類

//生命周期:架構每傳遞進來一個kv 組,reduce方法被調用一次

protected void reduce(Text key, Iterable&lt;IntWritable&gt; 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);

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

3. 将程式jar包上傳到叢集的任意一台伺服器上

4. 使用指令啟動執行wordcount程式jar包

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

5. 檢視執行結果

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

<a href="https://s4.51cto.com/wyfs02/M02/8F/3C/wKiom1jYY1bwt1moAAAY6TAb_p4272.png" target="_blank"></a>

      本文轉自yushiwh 51CTO部落格,原文連結:http://blog.51cto.com/yushiwh/1910587,如需轉載請自行聯系原作者