Hadoop相關筆記

1、            Zookeeper( 分佈式協調服務框架 )

1.    Zookeeper概述和集羣搭建:

(1)       Zookeeper概述:javascript

Zookeeper 是一個分佈式協調服務的開源框架。主要用來解決分佈式集羣中應用系統的一致性問題,例如怎樣避免同時操做同一數據形成髒讀的問題。ZooKeeper 本質上是一個分佈式的小文件存儲系統。提供基於相似於文件系統的目錄樹方式的數據存儲,而且能夠對樹中的節點進行有效管理。前端

(2)       Zookeeper特性:java

  • 全局數據一致:每一個 server 保存一份相同的數據副本,client 不管鏈接到哪一個 server,展現的數據都是一致的,這是最重要的特徵;
  • 可靠性:若是消息被其中一臺服務器接受,那麼將被全部的服務器接受。
  • 順序性:包括全局有序和偏序兩種:全局有序是指若是在一臺服務器上消息 a 在消息 b 前發佈,則在全部 Server 上消息 a 都將在消息 b 前被髮布;偏序是指若是一個消息 b 在消息 a 後被同一個發送者發佈,a 必將排在 b 前面。
  • 數據更新原子性:一次數據更新要麼成功(半數以上節點成功),要麼失敗,不存在中間狀態;
  • 實時性:Zookeeper保證客戶端將在一個時間間隔範圍內得到服務器的更新信息,或者服務器失效的信息。

(3)       ZooKeeper集羣角色:node

 

  • Leader:Zookeeper 集羣工做的核心,事務請求(寫操做)的惟一調度和處理者,保證集羣事務處理的順序性;集羣內部各個服務器的調度者。對於 create,setData,delete 等有寫操做的請求,則須要統一轉發給leader 處理,leader 須要決定編號、執行操做,這個過程稱爲一個事務。
  • Follower:處理客戶端非事務(讀操做)請求,轉發事務請求給 Leader;參與集羣 Leader 選舉投票。
  • Observer(觀察者,可選):觀察者角色,觀察 Zookeeper 集羣的最新狀態變化並將這些狀態同步過來,其對於非事務請求能夠進行獨立處理,對於事務請求,則會轉發給 Leader服務器進行處理。不會參與投票。

(4)        ZooKeeper ZooKeeper集羣搭建:mysql

Zookeeper 運行須要java環境,因此須要提早安裝jdk。對於安裝leader+follower模式的集羣,大體過程以下:程序員

①配置主機名稱到 IP 地址映射配置          ②修改 ZooKeeper 配置文件                 ③遠程複製分發安裝文件web

④設置 myid                                                           ⑤啓動 ZooKeeper 集羣算法

注意點:a.若是要想使用 Observer 模式,可在對應節點的配置文件添加以下配置:peerType=observersql

                   b.必須在配置文件指定哪些節點被指定爲 Observer,如:server.1:localhost:2181:3181:observershell

詳細安裝請參考Zookeeper集羣安裝筆記

2.    ZooKeeper shell

2、            大數據概述

1. 數據分析

(1)       數據分析定義:

         數據分析離不開數據,計量和記錄一塊兒促成了數據的誕生。數據分析是指用適當的統計分析方法對收集來的數據進行分析,將它們加以彙總和理解並消化,以求最大化地開發數據的功能,發揮數據的做用。商業領域中,數據分析可以給幫助企業進行判斷和決策,以便採起相應的策略與行動。數據分析可劃分爲:描述性數據分析、探索性數據分析、驗證性數據分析。咱們平常學習和工做中所涉及的數據分析主要描述性數據分析。

(2)       數據分析做用:

在商業領域中,數據分析的目的是把隱藏在數據背後的信息集中和提煉出來,總結出所研究對象的內在規律,幫助管理者進行有效的判斷和決策。數據分析在企業平常經營分析中主要有三大做用:

  • 現狀分析:簡單來講就是告訴你當前的情況。
  • 緣由分析:簡單來講就是告訴你某一現狀爲何發生。
  • 預測分析:簡單來講就是告訴你未來會發生什麼。

(3)       數據分析基本步驟( 六個步驟 ):

 

(4)       數據分析行業前景:

①     蓬勃發展的趨勢:中國數據分析行業前景和特色有  市場巨大、尚沒出現平臺級公司、企業技術外包的氛圍在國內尚沒徹底造成、整個行業很大並且需求旺盛。

②     數據分析師的職業要求:

  • 懂業務:熟悉行業知識、公司業務及流程;
  • 懂管理:肯定分析思路就須要用到營銷、管理等理論知識來指導;針對數據分析結論提出有指導意義的分析建議;
  • 懂分析:掌握數據分析的基本原理與一些有效的數據分析方法;
  • 懂工具:掌握數據分析相關的經常使用工具,還要能根據研究的問題選擇合適的工具;
  • 懂設計:是指運用圖表有效表達數據分析師的分析觀點;

2. 科技發展帶來的挑戰

在科技的快速發展推進下,在 IT 領域,企業會面臨兩個方面的問題。一是如何實現網站的高可用、易伸縮、可擴展、高安全等目標。爲了解決這樣一系列問題,迫使網站的架構在不斷髮展。從單一架構邁向高可用架構,這過程當中不得不提的就是分佈式。二是用戶規模愈來愈大,由此產生的數據也在以指數倍增加,俗稱數據大爆炸。海量數據處理的場景也愈來愈多。技術上該如何面對?

(1)     分佈式系統:

  • 概述:分佈式系統是一個硬件或軟件組件分佈在不一樣的網絡計算機上,彼此之間經過消息傳遞進行通訊和協調的系統。
  • 特徵:分佈性、透明性、同一性、通訊性;
  • 經常使用分佈式方案:分佈式應用和服務、分佈式靜態資源、分佈式數據和存儲、分佈式計算;
  • 分佈式和集羣:分佈式是指在多臺不一樣的服務器中部署不一樣的服務模塊,經過遠程調用協同工做,對外提供服務。集羣是指在多臺不一樣的服務器中部署相同應用或服務模塊,構成一個集羣,經過負載均衡設備對外提供服務。

(2)     海量數據處理:

  • 數據分析的前提是有數據,數據存儲的目的是支撐數據分析;
  • 當解決了海量數據的存儲問題,接下來面臨的就是海量數據的計算問題;
 

公開數據顯示,互聯網搜索巨頭百度 2013 年擁有數據量接近 EB 級別。阿里、騰訊都聲明本身存儲的數據總量都達到了百 PB 以上。此外,電信、醫療、金融、公共安全、交通、氣象等各個方面保存的數據量也都達到數十或者上百 PB級別。全球數據量以每兩年翻倍的速度增加,在 2010 年已經正式進入 ZB 時代,到 2020 年全球數據總量將達到 44ZB。

3.    大數據時代

(1)       大數據時代的概述( 4V ):

Volume(大量)、Velocity(高速)、Variety(多樣)、Value(價值),即數據體量巨大、數據類型繁多、價值密度低、處理速度快。

(2)       大數據分析:

                   當數據分析遇到大數據時代,因而就產生了完美的契合:大數據分析。大數據分析能夠分爲以下幾方面:

  • 一是大數據分析可讓人們對數據產生更加優質的詮釋;
  • 二是大數據的分析與存儲和數據的管理是一些數據分析層面的最佳實踐;
  • 還有需注意的是傳統的數據分析就是在數據中尋找有價值的規律,這和如今的大數據在方向上是一致的。

4.    日誌數據自定義採集( 數據收集的方法之一 )

(1)       原理分析:

 

首先,用戶的行爲會觸發瀏覽器對被統計頁面的一個 http 請求,好比打開某網頁。當網頁被打開,頁面中的埋點 javascript 代碼會被執行。

埋點是指:在網頁中預先加入小段 javascript 代碼。

(2)       具體方法和服務器部署請看以下文件:

            

3、            Apache Hadoop

1. Hadoop來源和特性介紹

(1)     Hadoop概述:

Hadoop 是 Apache 旗下的一個用 java 語言實現開源軟件框架,是一個開發和運行處理大規模數據的軟件平臺。容許使用簡單的編程模型在大量計算機集羣上對大型數據集進行分佈式處理。

(2)     Hadoop的定義:

  • 狹義上說,Hadoop 指 Apache 這款開源框架,它的核心組件有:

HDFS(分佈式文件系統):解決海量數據存儲(底層文件存儲系統)

YARN(做業調度和集羣資源管理的框架):解決資源任務調度(中間組件,基本不須要了解)

MAPREDUCE(分佈式運算編程框架):解決海量數據計算(java代碼的主要對接點)

  • 廣義上來講,Hadoop 一般是指一個更普遍的概念——Hadoop 生態圈:

HDFS(分佈式文件系統)和MAPREDUCE(分佈式運算程序開發框架)等

(3)     Hadoop發展簡史:

Hadoop 是 Apache Lucene 創始人 Doug Cutting 建立的。最先起源於 Nutch,它是 Lucene 的子項目。

2003 年 Google 發表了一篇論文爲該問題提供了可行的解決方案。

2004 年 Google 發表論文向全世界介紹了谷歌版的 MapReduce 系統。

2006 年 Google 發表了論文是關於 BigTable 的,這促使了後來的 Hbase 的發展。

(4)     Hadoop特性優勢:

  • 擴容能力(Scalable):Hadoop 是在可用的計算機集羣間分配數據並完成計算任務的,這些集羣可用方便的擴展到數以千計的節點中。
  • 成本低(Economical):Hadoop 經過普通廉價的機器組成服務器集羣來分發以及處理數據,以致於成本很低。
  • 高效率(Efficient):經過併發數據,Hadoop 能夠在節點之間動態並行的移動數據,使得速度很是快。
  • 可靠性(Rellable):能自動維護數據的多份複製,而且在任務失敗後能自動地從新部署(redeploy)計算任務。因此 Hadoop 的按位存儲和處理數據的能力值得人們信賴。

2. Hadoop集羣介紹

(1)     發行版本:

Hadoop 發行版本分爲開源 社區版 和 商業版,社區版是指由 Apache 軟件基金會維護的版本,是官方維護的版本體系。商業版 Hadoop 是指由第三方商業公司在社區版 Hadoop 基礎上進行了一些修改、整合以及各個服務組件兼容性測試而發行的版本,比較著名的有 cloudera 的 CDH、mapR 等。

(2)     Hadoop2.0組件介紹:

 

Hadoop 2.0 則包含一個支持 NameNode 橫向擴展的 HDFS,一個資源管理系統YARN 和一個運行在 YARN 上的離線計算框架 MapReduce。相比於 Hadoop1.0,Hadoop 2.0 功能更增強大,且具備更好的擴展性、性能,並支持多種計算框架。

Hadoop 3.0 相比以前的 Hadoop 2.0 有一系列的功能加強。但目前仍是個alpha 版本,有不少 bug,且不能保證 API 的穩定和質量。

(3)     Hadoop集羣簡介:

  • HADOOP 集羣具體來講包含兩個集羣:HDFS 集羣和 YARN 集羣,二者邏輯上分離,但物理上常在一塊兒。
  • HDFS 集羣負責海量數據的存儲,集羣中的角色主要有:NameNode、DataNode、SecondaryNameNode
  • YARN 集羣負責海量數據運算時的資源調度,集羣中的角色主要有:ResourceManager、NodeManager
  • mapreduce是一個分佈式運算編程框架,是應用程序開發包,由用戶按照編程規範進行程序開發,後打包運行在 HDFS 集羣上,而且受到 YARN 集羣的資源調度管理。
  • 以三節點部署Hadoop集羣,角色分佈以下:

node-01     NameNode     DataNode                 ResourceManager

node-02   DataNode       NodeManager         SecondaryNameNode

node-03     DataNode       NodeManager

3. Hadoop集羣搭建

(1)     解壓( 解壓即安裝,將hadoop-2.7.4-with-centos-6.7.tar.gz上傳到Linux中,並解壓即完成安裝 )

(2)     配置hadoop-env.sh中的java_home( 配置JDK環境 )

(3)     在core-site.xml 中配置nameNode和存放數據的目錄位置

(4)     在hdfs-site.xml中配置複製副本數和secondaryNode的位置

(5)     在mapred-site.xml中配置mr運行時的框架( 通常指定在yarn上 )

(6)     yarn-site.xml配置resourceManager( YARN中的主節點 )

(7)     slaves 配置dataNode所在的主機名稱 (HDFS的從節點 )

(8)     配置hadoop環境變量( 將Hadoop添加到Linux的環境變量中 )

(9)     複製到其它集羣節點( 將Hadoop集羣上的其餘機器進行相同配置 )

(10) 格式化namenode( 在配置好Hadoop以後須要在NameNode所在機器(node-1)上進行一次性的格式化,以後再重啓Hadoop不須要執行 )

(11) 啓動hadoop集羣

            

4. Hadoop安裝包目錄結構

(1)     bin:Hadoop 最基本的管理腳本和使用腳本的目錄,這些腳本是 sbin 目錄下管理腳本的基礎實現,用戶能夠直接使用這些腳本管理和使用 Hadoop。

(2)     etc:Hadoop 配置文件所在的目錄,包括 core-site,xml、hdfs-site.xml、

(3)     mapred-site.xml 等從 Hadoop1.0 繼承而來的配置文件和 yarn-site.xml 等

(4)     Hadoop2.0 新增的配置文件。

(5)     include:對外提供的編程庫頭文件(具體動態庫和靜態庫在 lib 目錄中),這些頭文件均是用 C++定義的,一般用於 C++程序訪問 HDFS 或者編寫 MapReduce程序。

(6)     lib:該目錄包含了 Hadoop 對外提供的編程動態庫和靜態庫,與 include 目錄中的頭文件結合使用。

(7)     libexec:各個服務對用的 shell 配置文件所在的目錄,可用於配置日誌輸出、啓動參數(好比 JVM 參數)等基本信息。

(8)     sbin:Hadoop 管理腳本所在的目錄,主要包含 HDFS 和 YARN 中各種服務的啓動/關閉腳本。

(9)     share:Hadoop 各個模塊編譯後的 jar 包所在的目錄。

4、            HDFS (Hadoop分佈式文件系統)

1. HDFS基本概念

(1)     HDFS介紹:

HDFS 是 Hadoop Distribute File System 的簡稱,意爲:Hadoop 分佈式文件系統。是 Hadoop 核心組件之一,做爲最底層的分佈式存儲服務而存在。分佈式文件系統解決的問題就是大數據存儲。

(2)     HDFS設計目標:

能夠進行故障的檢測和自動快速恢復、以流式讀取數據有很高的數據訪問的高吞吐量、

支持大文件和多文件、write-one-read-many 訪問模型(一次寫入屢次讀取)。

2. HDFS的重要特性

(1)     主從節點(NameNode和DataNode)

(2)     分塊存儲(物理結構上會將上傳的文件默認按照每塊128M進行切分並保存這些切分後的文件塊)

(3)     名字空間:抽象目錄樹(/hello/aaa.txt)

(4)     NameNode元數據管理(將各個文件保存在不一樣的dataNode和塊數等信息存儲)

(5)     DataNode數據存儲

(6)     副本機制(在安裝的時候能夠指定文件塊在hdfs上有多少個副本)

(7)     一次寫入,屢次讀出(讀得多,用於計算處理數據;通常保存的都是日誌類型;若是要修改,先刪除,以後再傳遞最新的文件)

3. Hadoop Shell

(1)     hadoop fs -ls /user/hadoop/file1                                            顯示文件、目錄信息                      

(2)     hadoop fs -mkdir –p /user/hadoop/dir1                               在 hdfs 上建立目錄,-p 表示會建立路徑中的各級父目錄

(3)     hadoop fs -put –f [-p] localfile1 localfile2 /user/hadoop/hadoopdir

(上傳)將單個 src 或多個 srcs 從本地文件系統複製到目標文件系統。

-p:保留訪問和修改時間,全部權和權限。       -f:覆蓋目的地(若是已經存在)

(4)     hadoop fs -get hdfs://host:port/user/hadoop/file localfile                (下載)將文件複製到本地文件系統

(5)     hadoop fs -appendToFile localfile /hadoop/hadoopfile                        追加一個文件到已經存在的文件末尾

(6)     hadoop fs -cat /hadoop/hadoopfile                                                          顯示文件內容到 stdout

(7)     hadoop fs -chmod 666 /hadoop/hadoopfile                                           改變文件的權限。使用-R將使改變在目錄結構下遞歸進行

(8)     hadoop fs -copyFromLocal /root/1.txt /                                                  從本地文件系統中拷貝文件到 hdfs 路徑去

(9)     hadoop fs -copyToLocal /aaa/jdk.tar.gz                                                  從 hdfs 拷貝到本地

(10) hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2                                    從 hdfs 的一個路徑拷貝 hdfs 的另外一個路徑

(11) hadoop fs -mv /aaa/jdk.tar.gz /                                                                 在 hdfs 目錄中移動文件

(12) hadoop fs -rm -r /aaa/bbb/                                                                         刪除文件,只刪除非空目錄和文件;-r遞歸刪除。

4. NameNode和DataNode概述

                                

5.    HDFS的工做機制

(1)       HDFS的工做機制概述:

  • HDFS 的內部工做機制對客戶端保持透明,客戶端請求訪問 HDFS 都是經過向NameNode 申請來進行。
  • NameNode 負責管理整個文件系統元數據;DataNode 負責管理具體文件數據塊存儲;Secondary NameNode 協助 NameNode 進行元數據的備份。

(2)       HDFS寫數據流程:

①     client 發起文件上傳請求,經過 RPC 與 NameNode 創建通信,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否能夠上傳;

②     client 請求第一個 block 該傳輸到哪些 DataNode 服務器上;

③     NameNode 根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的 DataNode 的地址如:A,B,C;注:Hadoop 在設計時考慮到數據的安全與高效,數據文件默認在 HDFS 上存放三份,存儲策略爲本地一份,同機架內其它某一節點上一份,不一樣機架的某一節點上一份。

④     client 請求 3 臺 DataNode 中的一臺 A 上傳數據(本質上是一個 RPC 調用,創建 pipeline),A 收到請求會繼續調用 B,而後 B 調用 C,將整個pipeline 創建完成,後逐級返回 client;

⑤     client 開始往 A 上傳第一個 block(先從磁盤讀取數據放到一個本地內存緩存),以 packet 爲單位(默認 64K),A 收到一個 packet 就會傳給 B,B 傳給 C;A 每傳一個 packet 會放入一個應答隊列等待應答。

⑥     數據被分割成一個個 packet 數據包在 pipeline 上依次傳輸,在pipeline 反方向上,逐個發送 ack(命令正確應答),最終由 pipeline中第一個 DataNode 節點 A 將 pipeline ack 發送給 client;

⑦     當一個 block 傳輸完成以後,client 再次請求 NameNode 上傳第二個block 到服務器。

 

(3)       HDFS讀數據流程:

①     Client 向 NameNode 發起 RPC 請求,來肯定請求文件 block 所在的位置;

②     NameNode會視狀況返回文件的部分或者所有block列表,對於每一個block,NameNode 都會返回含有該 block 副本的 DataNode 地址;

③     這些返回的 DN 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,而後進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態爲 STALE,這樣的排靠後;

④     Client 選取排序靠前的 DataNode 來讀取 block,若是客戶端自己就是DataNode,那麼將從本地直接獲取數據;

⑤     底層上本質是創建 Socket Stream(FSDataInputStream),重複的調用父類 DataInputStream 的 read 方法,直到這個塊上的數據讀取完畢;

⑥     當讀完列表的 block 後,若文件讀取尚未結束,客戶端會繼續向NameNode 獲取下一批的 block 列表;

⑦     讀取完一個 block 都會進行 checksum 驗證,若是讀取 DataNode 時出現錯誤,客戶端會通知 NameNode,而後再從下一個擁有該 block 副本的DataNode 繼續讀。

⑧     read 方法是並行的讀取 block 信息,不是一塊一塊的讀取;NameNode 只是返回Client請求包含塊的DataNode地址,並非返回請求塊的數據;

⑨     最終讀取來全部的 block 會合併成一個完整的最終文件。

 

6.    HDFS應用開發

(1)       HDFS的JAVA API操做和所需的JAVA JAR包:

HDFS 在生產應用中主要是客戶端的開發,其核心步驟是從 HDFS 提供的api中構造一個 HDFS 的訪問客戶端對象,而後經過該客戶端對象操做(增刪改查)HDFS 上的文件。

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-common</artifactId>

<version>2.7.4</version>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-hdfs</artifactId>

<version>2.7.4</version>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-client</artifactId>

<version>2.7.4</version>

</dependency>

(2)       配置windows平臺Hadoop環境:

 

(3)       構造客戶端對象( 使用Java代碼操做HDFS ):

①     Java代碼中操做的具體對象:

                            Configuration:該類的對象封轉了客戶端或者服務器的配置;

                            FileSystem:文件系統對象,能夠用該對象的一些方法來對文件進行操做,經過FileSystem的靜態方法get得到該對象。

②     示例代碼:

 

5、            MapReduce(分佈式運算編程框架)

1. MapReduce的概述和設計構思:

(1)  MapReduce 的思想核心是「分而治之」;Map 負責「分」,在各個Map之間幾乎沒有依賴關係;Reduce負責

「合」,即對 map 階段的結果進行全局彙總。

         (2) Hadoop MapReduce設計構思:

MapReduce 是一個分佈式運算程序的編程框架,核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分佈式運算程序,併發運行在Hadoop 集羣上。在MapReduce中,程序員僅須要關心其應用層的具體計算問題,僅需編寫少許的處理應用自己計算問題的程序代碼。

         (3) MapReduce框架結構:

                   一個完整的 mapreduce 程序在分佈式運行時有三類實例進程:

a、MRAppMaster:負責整個程序的過程調度及狀態協調

b、MapTask:負責 map 階段的整個數據處理流程

c、ReduceTask:負責 reduce 階段的整個數據處理流程

2. MapReduce的編程規範和示例編寫

(1)       編程規範:

①     用戶編寫的程序分紅三個部分:Mapper,Reducer,Driver(提交運行mr 程序的客戶端)

②     Mapper 的輸入數據是 KV 對的形式(KV 的類型可自定義)

③     Mapper 的輸出數據是 KV 對的形式(KV 的類型可自定義)

④     Mapper 中的業務邏輯寫在 map()方法中

⑤     map()方法(maptask 進程)對每個<K,V>調用一次

⑥     Reducer 的輸入數據類型對應 Mapper 的輸出數據類型,也是 KV

⑦     Reducer 的業務邏輯寫在 reduce()方法中

⑧     Reducetask 進程對每一組相同 k 的<k,v>組調用一次 reduce()方法

⑨     用戶自定義的 Mapper 和 Reducer 都要繼承各自的父類

⑩     整個程序須要一個 Drvier 來進行提交,提交的是一個描述了各類必要信息的 job 對象

(2)       示例編寫:

以示例:在一堆給定的文本文件中統計輸出每個單詞出現的總次數 編寫示例工程以下

                       

3. MapReduce的輸入和輸出

MapReduce 框架運轉在<key,value> 鍵值對上,也就是說,框架把做業的輸入當作是一組<key,value>鍵值對,一樣也產生一組<key,value>鍵值對做爲做業的輸出,這兩組鍵值對多是不一樣的。具體輸入和輸入以下圖所示:

 

4. MapReduce的處理流程解析

(1)       Mapper階段任務執行過程詳解:

第一階段:把輸入目錄下文件按照必定的標準逐個進行邏輯切片,造成切片規劃。(每個切片=一個MapTask)

                   第二階段:對切片中的數據按照必定的規則解析成<key,value>對。默認是把每一行文本內容解析成鍵值對。

                   第三階段:調用 Mapper 類中的 map 方法。上階段中每解析出來的一個<k,v>,調用一次 map 方法。

                   第四階段:按照必定的規則對第三階段輸出的鍵值對進行分區。分區的數量就是Reducer任務運行的數量。

                   第五階段:對每一個分區中的鍵值對進行排序。

                   第六階段:對數據進行局部聚合處理,也就是 combiner 處理。鍵相等的鍵值對會調用一次 reduce 方法。

(2)       Reduce階段任務執行過程詳解:

第一階段: Reducer任務會主動從 Mapper 任務複製其輸出的鍵值對。一個Reduce可能對於多個Mapper。

第二階段:把複製到Reducer本地數據,所有進行合併。即把分散的數據合併成一個大的數據;再進行排序。

第三階段:對排序後的鍵值對調用 reduce 方法。鍵相等的鍵值對調用一次reduce方法,每次調用會產生零

個或者多個鍵值對。最後把這些輸出的鍵值對寫入到 HDFS 文件中。

(3)       在整個MapReduce程序的開發過程當中,咱們最大的工做量是覆蓋map函數和覆蓋reduce函數:

 

5. MapReduce中的小知識點

(1)       MapReduce的數據分區:在執行主類中設置NumReduceTask的個數N;而後對應有N的輸出內容。

(2)       MapReduce的邏輯分片:根據文件的大小進行文件塊劃分爲M個塊,將由M個mapTask進行處理。

(3)       MapReduce中的序列化:

當須要在進程和網絡之間傳遞對象或持久化對象時,就須要將對象進行序列化。但Java的Serializable序列化框架是一個重量級的序列化框架,當對一個對象進行序列化時,會有不少額外的信息。因此,hadoop 本身開發了一套序列化機制( Writable),WritableHadoop的序列化格式,hadoop定義了這樣一個Writable接口。一個類要支持可序列化只需實現這個接口便可。

MapReduce中的基本序列化類型:IntWritable(int)、LongWritable(long)、Text(String)、NullWritable(null)等。

6. MapReduce的排序

(1)       排序的實現思路:

MR程序在處理數據的過程當中會對數據排序(map 輸出的 kv 對傳輸到 reduce以前,會排序),排序的依據是 map 輸出的 key。因此,咱們若是要實現本身須要的排序規則,則能夠考慮將排序因素放到 key 中,讓 key 實現接口:WritableComparable,而後重寫 key 的 compareTo 方法

(2)       MapReduce實現排序的具體接口和方法:

  • 要對MapReduce進行排序,需實現WritableComparable<Bean>接口( 即進行序列化又進行排序 )。
  • 還需重載該接口中的compareTo() 方法,該方法的比較規格以下:

若是指定的數與參數相等返回 0。若是指定的數小於參數返回 -1。若是指定的數大於參數返回 1。

返回正數的話,當前對象(調用compareTo方法的對象)要排在比較對象後面;

返回負數的話,放在前面;若是返回0會有一個對象不會顯示(在開發中應該避免出現0)。

(3)       排序具體實現代碼以下:

                      

7. MapReduce的分區( Partitioner&NumReduceTasks )

(1)       爲何要進行分區:

Mapreduce中會將map輸出的 kv 對,按照相同 key 分組,而後分發給不一樣的 reducetask;

默認的分發規則爲:根據 key 的 hashcode%reducetask 數來分發;

因此:若是要按照咱們本身的需求進行分組,則須要改寫數據分發(分組)組件 Partitioner;

自定義一個 CustomPartitioner 繼承抽象類:Partitioner,而後在job 對象中,設置自定義的分組規則。

(2)       分區的具體實現:

  • 需自定義分區類(ProvincePartitioner )繼承Partitioner<Map中的key,value>類,並重寫getPartition()方法,在該方法中自定義分區規格;
  • 需在程序入口的main()方法中設置reduceTask個數,和設置使用咱們自定義的分區組件,以下:

//這裏設置運行 reduceTask 的個數,即程序執行後生成幾個part-r-00000文件

//getPartition 返回的分區個數 = NumReduceTasks 正常執行

//getPartition 返回的分區個數 > NumReduceTasks 報錯:Illegal partition,多出的數據沒地方存放

//getPartition 返回的分區個數 < NumReduceTasks 能夠執行 ,多出空白文件

job.setNumReduceTasks(10);

 

//這裏指定使用咱們自定義的分區組件,即程序執行後,最終數據分紅幾部分

job.setPartitionerClass(ProvincePartitioner.class);

 

(3)       分區具體代碼以下:

                              

8. MapReduce的合併(combiner)

(1)       Combiner的做用:

每個 map 均可能會產生大量的本地輸出,Combiner 的做用就是對 map 端的輸出先作一次合併,以減小在 map 和 reduce 節點之間的數據傳輸量,以提升網絡 IO 性能,是 MapReduce 的一種優化手段之一。

(2)       Combiner在MapReduce中的概述:

  • combiner 是 MR 程序中 Mapper 和 Reducer 以外的一種組件,combiner 組件的父類就是 Reducer;
  • combiner 和 reducer 的區別在於運行的位置:

Combiner 是在每個 maptask 所在的節點運行;

Reducer 是接收全局全部 Mapper 的輸出結果;

  • combiner 的意義就是對每個 maptask 的輸出進行局部彙總,以減少網絡傳輸量;
  • combiner 可以應用的前提是不能影響最終的業務邏輯,並且,combiner 的輸出 kv 應該跟 reducer 的輸入 kv 類型要對應起來。

(3)       Combiner的使用步驟:

  • 自定義一個 combiner 繼承 Reducer,重寫 reduce 方法
  • 在 job 中設置:job.setCombinerClass(CustomCombiner.class)

6、            Apache Flume

1.    Apache Flume的概述:

(1)     Flume 是 Cloudera 提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的軟件。核心是把數據從數據源(source)收集過來,再將收集到的數據送到指定的目的地(sink)。

(2)     Flume的運行機制:

Flume 系統中核心的角色是agent,agent自己是一個Java 進程,通常運行在日誌收集節點。有以下三個組件:

Source:採集源,用於跟數據源對接,以獲取數據;

Sink:下沉地,採集數據的傳送目的,用於往下一級 agent 傳遞數據或者往最終存儲系統傳遞數據;

Channel:agent內部的數據傳輸通道,用於從 source將數據傳遞到 sink;

 

2.    Apache Flume的安裝部署:

 

3.    採集目錄到HDFS  & 採集文件到 HDFS

(1)     需求1:服務器的某特定目錄下,會不斷產生新的文件,每當有新文件出現,就須要把文件採集到HDFS中去。

(2)     需求2:業務系統使用log4j生成的日誌,日誌內容不斷增長,須要把追加到日誌文件中的數據實時採集到hdfs。

 

7、            數據 & 數據倉庫

1.  數據的來源

(1)     業務系統數據:

業務數據爲公司內部的數據,獲取的的成本低,方式容易。能夠直接經過接口調用,從公司的業務系統中獲取數據,可是要注意不能影響業務系統數據庫的性能。也能夠進行數據庫的dump(從數據庫中導出所有數據),好比 MySQL 數據庫,使用 mysqldump 工具就能夠進行數據庫的導出( mysqldump -uroot -pPassword [database name] [dump file] )。

(2)     爬蟲數據:

爬蟲(Web crawler),是指一種按照必定的規則,自動地抓取萬維網信息的程序或者腳本。它們被普遍用於互聯網搜索引擎或其餘相似網站,能夠自動採集全部其可以訪問到的頁面內容,以獲取或更新這些網站的內容和檢索方式。電子商務行業最初的爬蟲需求來源於比價。

2.  數據的管理:

(1)     數據的文件管理:

  • 隨着數據種類的愈來愈多,數據量的愈來愈大,咱們爲了方便保存和迅速提取數據,對數據進行了分類管理:從每個文件夾的創建,咱們都要按照數據文件的屬性,分爲大大小小、多個層級的文件夾,創建合理的文件保存架構。此外全部的文件、文件夾,都要規範化地命名,並放入最合適的文件夾中。
  • 在企業中,通常是直接使用文件管理服務器來管理文件,文件服務器有以下好處:定時集中對文件進行備份;能夠統一制定文件安全訪問權限策略;能夠統一進行文件服務器防病毒管理。
  • 常見的文件服務器有以下幾種:

n  ftp 文件服務:FTP 是一個文件傳輸的協議,採用 Client/Server 架構。用戶能夠經過各類不一樣的 FTP 客戶端程序,藉助 FTP 協議,來鏈接 FTP 服務器,以上傳或者下載文件。

n  Samba 文件服務:NFS 是 Network File System 的縮寫,即網絡文件系統。它容許網絡中的計算機之間經過 TCP/IP 網絡共享資源。NFS 在文件傳送或信息傳送過程當中依賴於 RPC 協議。RPC,遠程過程調用(Remote Procedure Call) 是能使客戶端執行其餘系統中程序的一種機制。

n  NFS 文件服務:SMB(Server Messages Block,信息服務塊)是一種在局域網上共享文件和打印機的一種通訊協議,Samba 是一組軟件包,在 Linux 和 UNIX 系統上實現 SMB 協議的一個免費軟件。

(2)     文件管理規範:

爲了更快速,更準確,更規範的進行數據文件管理,企業通常都會去制定相應的管理規範。規範着重於文件命名規則,以及一些校驗性文件的描述。例如FTP 服務進行跨部門文件共享的相關規範等。

(3)     數據質量檢測:

數據質量是保證數據應用的基礎,它的評估標準主要包括四個方面:完整性、一致性、準確性、及時性。

  • 完整性指的是數據信息是否存在缺失的情況,通常能夠經過數據統計中的記錄值和惟一值進行評估。
  • 一致性是指數據是否遵循了統一的規範,數據集合是否保持了統一的格式。主要體如今數據記錄的規範和數據是否符合邏輯。
  • 準確性是指數據記錄的信息是否存在異常或錯誤。最爲常見的數據準確性錯誤如亂碼。
  • 及時性是指數據從產生到能夠查看的時間間隔,也叫數據的延時時長。

3.  數據倉庫

(1)     數據倉庫的基本概念:

數據倉庫,英文名稱爲 Data Warehouse,可簡寫爲 DW 或 DWH。數據倉庫的目的是構建面向分析的集成化數據環境,爲企業提供決策支持(DecisionSupport)。它出於分析性報告和決策支持目的而建立。

數據倉庫自己並不「生產」任何數據,同時自身也不須要「消費」任何的數據,數據來源於外部,而且開放給外部應用,這也是爲何叫「倉庫」,而不叫「工廠」的緣由。

(2)      

8、            Apache Hive(數據倉庫)

1. Hive概述

(1)       Hive簡介:

         Hive 是基於 Hadoop 的一個數據倉庫工具,能夠將結構化的數據文件映射爲一張數據庫表,並提供類 SQL 查詢功能。本質是將 SQL 轉換爲 MapReduce 程序。主要用途:用來作離線數據分析,比直接用 MapReduce 開發效率更高。

(2)       爲何使用Hive:

①     直接使用 Hadoop MapReduce 處理數據所面臨的問題:

人員學習成本過高;MapReduce 實現複雜查詢邏輯開發難度太大。

②     使用 Hive 的優勢:

                            操做接口採用類SQL語法,提供快速開發的能力;避免了去寫MapReduce,減小開發人員的學習成本;

功能擴展很方便。

(3)       Hive架構:

①     Hive與Hadoop的關係:Hive利用HDFS存儲數據,利用MapReduce查詢分析數據。

②     Hive組件:

  • 解釋器、編譯器、優化器、執行器:完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,並在隨後有 MapReduce 調用執行。
  • 元數據存儲:一般是存儲在關係數據庫如 mysql/derby 中。
  • 用戶接口:包括 CLI、JDBC/ODBC、WebGUI等接口。

(4)       Hive與傳統數據庫的對比:

hive 用於海量數據的離線數據分析。hive 具備 sql 數據庫的外表,但應用場景徹底不一樣,hive 只適合用來作批量數據統計分析。

 

(5)       Hive數據模型:

                   Hive 中全部的數據都存儲在HDFS中,沒有專門的數據存儲格式在建立表時指定分隔符,Hive 就能夠映射成功,解析數據。

                   Hive  中包含如下數據模型:

db :在 hdfs 中表現爲 hive.metastore.warehouse.dir 目錄下一個文件夾

table :在 hdfs 中表現所屬 db 目錄下一個文件夾

external table :數據存放位置能夠在 HDFS 任意指定路徑

partition :在 hdfs 中表現爲 table 目錄下的子目錄

bucket :在 hdfs 中表現爲同一個表目錄下根據 hash 散列以後的多個文件

(6)       Hive安裝部署:

Hive 安裝前須要安裝好JDK和Hadoop,並配置好環境變量。若是使用MySQL版本還須要安裝好MySQL。

                                           

(7)       Hive鏈接說明:

  • hive啓動爲一個服務器,來對外提供服務:              bin/hiveserver2
  • 在node-3使用beeline去鏈接node-1中的Hive:      bin/beeline                ! connect jdbc:hive2://node-1:10000

或(bin/beeline -u jdbc:hive2://node-1:10000 -n root )

2. Hive基本操做

(1)       DDL體驗之數據分隔符:

①     分隔符語法:

ROW FORMAT  DELIMITED

[FIELDS TERMINATED BY char]

[COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char]

[LINES TERMINATED BY char] | SERDE serde_name

[WITH SERDEPROPERTIES

(property_name=property_value, property_name=property_value,...)]

②     普通數據指定分隔符:

create table day_table (id int, content string) partitioned by (dt string)

row format delimited                         //使用內置的分隔符;

fields terminated by ','                        //字段之間經過逗號進行分割;

         此數據表能夠識別路徑/user/hive/warehouse/itcast.db/t_t2下文件中的 , 分隔符

③     複雜數據結構映射(表中集合數據):

create table complex_array(name string,work_locations array<string>) row format delimited

fields terminated by '\t'                    //字段之間使用tab分隔符

collection items terminated by ','             //在集合之間的元素使用逗號分隔符

例:zhangsan beijing,shanghai,tianjin,hangzhou

④     複雜數據結構映射(2):

                            create table t_map(id int,name string,hobby map<string,string>)

                            row format delimited                                 //使用內置的分隔符

                            fields terminated by ','                                 //字段之間使用,分隔符

                            collection items terminated by '-'             //在集合之間的元素使用-分隔符

map keys terminated by ':' ;                       //在Map(Key-Value對)中使用:分隔符

例:1,zhangsan,唱歌:很是喜歡-跳舞:喜歡-游泳:通常般

⑤     默認分隔符:

create table t_t5(id int, name string);                       //直接建立表就是使用默認分隔符

在Linux的vim命令中中要使用默認的分隔符,ctrl+V 再按ctrl+A

在其餘文本中使用默認分隔符使用」\001」, 例:1\001tom

(2)       DDL體驗之分區表:

①     單分區表:

create table t_user (id int, name string)                           //建立表名爲t_user的數據庫表

partitioned by (country string)                                             //對錶進行分區(虛擬字段實際文件中不存在該字段)

row format delimited fields terminated by ',';                  //使用分隔符

//將Linux的本地文件加載到數據表的分區中(指定具體哪一個分區),會在對應的表文件夾下建立對應的分區文件夾,若是命令中有local表明加載的是Linux本地文件,若是沒有表明加載的是HDFS中的文件

LOAD DATA local INPATH '/root/hivedata/5.txt' INTO TABLE t_user partition(country='USA');

select * from t_user where country=’CHN’;   //能夠根據該字段查詢(該字段在表中顯示,在文件中不存在)

②     雙分區表:

create table day_hour_table (id int, name string)          //建立表名爲day_hour_table的數據庫表

partitioned by (dt string, hour string)                                //對錶進行多分區

row format delimited fields terminated by ',';                  //使用分隔符

//加載文件到表的具體分區中(多分區中每個分區字段表明一級文件夾)

LOAD DATA local INPATH '/root/hivedata/5.txt' INTO TABLE day_hour_table partition(dt='20180101',hour='08');

//在多分區表中能夠根據任意分區字段進行查詢

select * from day_hour_table where dt='20180101';  和  select * from day_hour_table where hour = "08";

(3)       DDL體驗之分桶表&外部表:

①     分桶表:

  • 設置分桶參數:

set hive.enforce.bucketing = true;           //設置能夠進行分桶

set mapreduce.job.reduces=4;                 //設置分桶的最大個數(至關於Reduce中的job.setNumReduceTasks(10);)

  • 建立表:

//Hive 採用對列值哈希,而後除以桶的個數求餘的方式決定該條記錄存放在哪一個桶當中

create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)

clustered by(Sno) into 4 buckets                                  //進行分桶設置(將數據分到4個桶中)

row format delimited fields terminated by ',';

  • 分桶表導入數據

insert overwrite table stu_buck select * from student cluster by(Sno);

②     外部表:

create external table student_ext(Sno int,Sname string,Sex string,Sage int,Sdept string)

row format delimited fields terminated by ',' location '/stu';

建立外部表需添加external關鍵字,和location表示表的地址

                            在刪除表的時候,內部表的元數據和數據會被一塊兒刪除,而外部表只刪除元數據,不刪除數據。

(4)       DDL的顯示命令:

①     顯示錶分區信息,不是分區表執行報錯                       show partitions table_name;

②     顯示當前版本 hive 支持的全部方法                              show functions;

③     查看錶信息                                                                               desc extended table_name;

④     查看錶信息(格式化美觀)                                               desc formatted table_name;

⑤     查看數據庫相關信息                                                   describe database database_name;

(5)       DML體驗之基本操做:

①     Load加載命令:

在Hive中執行的命令,將HDFS或Linux中的文件加載到對應的表目錄下

LOAD DATA local INPATH '/root/hivedata/aaa.txt' [OVERWRITE] INTO TABLE source_table;

local:若是加了local,load命令會在Linux本地加載路徑,並將該文件複製到對應的表目錄下,若是沒有

           加local,load命令會在HDFS中加載路徑,並將該文件移動到對應的表目錄下;

filepath:能夠是相對路徑,也能夠是絕對路徑,若是是HDFS能夠寫完整URI,建議寫成絕對路徑便可;

OVERWRITE:若是使用了 OVERWRITE 關鍵字,則目標表(或者分區)中的內容會被所有刪除,若是沒有

                            使用該關鍵字,那有文件名衝突的2個文件會所有保存,但新文件會重命名;不建議使用

②     多重插入:

Hive 中 insert 主要是結合 select 查詢語句使用,將查詢結果插入到表中;須要保證查詢結果列的數目和須要插入數據表格的列數目一致.若是查詢出來的數據類型和插入表格對應的列數據類型不一致,將會進行轉換,可是不能保證轉換必定成功,轉換失敗的數據將會爲 NULL。

多重插入即爲同時對多張表進行插入:

from source_table                    

insert overwrite table test_insert1 select id                     //將source_table的id字段插入test_insert1表中

insert overwrite table test_insert2 select name;            //將source_table的name字段插入test_insert2中

③     動態分區插入:

  • 開啓動態分區,並更改動態分區的模式:

set hive.exec.dynamic.partition=true;             #是否開啓動態分區功能,默認false關閉。

set hive.exec.dynamic.partition.mode=nonstrict;   #動態分區的模式,默認strict,表示必須指定至少一個分區爲靜態分區,nonstrict模式表示容許全部的分區字段均可以使用動態分區。

  • 建立原始表和目標表:

需求:將dynamic_partition_table中的數據按照時間(day),插入到目標表d_p_t的相應分區中。

原始表:create table dynamic_partition_table(day string,ip string)row format delimited fields terminated by ",";

         原始表數據類型:2015-05-10,ip1

目標表:create table d_p_t(ip string) partitioned by (month string,day string); //指定month和day爲分區

  • 執行動態插入:

insert overwrite table d_p_t partition (month,day)

select ip,substr(day,1,7) as month,day  from dynamic_partition_table;     //查詢到需插入的數據

(6)       DDL體驗之高級操做(select)

#設置分桶個數

set mapred.reduce.tasks=3;

#進行查詢的語法

select * from student distribute by(Sno) sort by(Sage desc);

order by 會對輸入作全局排序,所以只有一個 reducer,會致使當輸入規模較大時,須要較長的計算時間。

sort by 不是全局排序,其在數據進入 reducer 前完成排序。所以,若是用 sort by 進行排序,而且設置 mapred.reduce.tasks>1,則 sort by 只保證每一個 reducer 的輸出有序,不保證全局有序。

distribute by(字段)根據指定字段將數據分到不一樣的 reducer,分發算法是 hash 散列。

Cluster by(字段) 除了具備 Distribute by 的功能外,還會對該字段進行排序。

cluster(分且排序,必須同樣)==distribute(分) + sort(排序)(能夠不同)

(7)       導出數據到文件系統( 將查詢結果保存到指定的文件目錄 )

導出數據到本地:insert overwrite local directory '/root/aaa666' select * from dynamic_partition_table;

導出數據到HDFS:insert overwrite directory '/aa666' select * from dynamic_partition_table;

(8)       Havi join

①     開啓本地模式,在開發狀況下使用(上線時千萬不能使用),能極大的提升速度:

set hive.exec.mode.local.auto=true;

②     內鏈接查詢(inner join ):

select * from a inner join b on a.id=b.id;

③     左外鏈接:

select * from a left join b on a.id=b.id;

④     右外鏈接:

select * from a right join b on a.id=b.id;

⑤     全外鏈接:

select * from a full outer join b on a.id=b.id;

⑥     hive中的特別join:

select * from a left semi join b on a.id = b.id;

⑦     cross join(##慎用),返回兩個表的笛卡爾積結果,不須要指定關聯鍵:

select a.*,b.* from a cross join b;

3. Hive參數配置:

(1)       Hive參數參考網站:

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

(2)       參數的設定方式和優先級:

  • 配置文件hive-site.xml (全局有效)

用戶自定義或默認的配置文件,配置文件的設定對本機啓動的全部 Hive 進程都有效。

  • 命令行參數 (--hiveconf  對 hive 啓動實例有效)

啓動 Hive(客戶端或 Server 方式)時,能夠在命令行添加-hiveconf 來設定參數,例如:bin/hive -hiveconf hive.root.logger=INFO,console;設定對本次啓動的 Session(對於 Server 方式啓動,則是全部請求的 Sessions)有效。

  • 參數聲明 (set xxx=xxx 對 hive 的鏈接 session 有效)

能夠在 HQL 中使用 SET 關鍵字設定參數,這一設定的做用域也是 session 級的。

  • 上述三種設定方式的優先級依次遞增。即參數聲明覆蓋命令行參數,命令行參數覆蓋配置文件設定。

 

4. Hive函數

(1)       Hive函數資料:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

 

(2)       使用自帶函數:

#建立空文件和空表( 在執行sql語句時,有些數據庫要有表才能執行,建立空表爲防止報錯 )

create table dual(id string);

 

#執行函數,以下爲執行字符串切割函數

select substr('angelababy',2,3) from dual;

(3)       自定義函數:

①     建立工程,需導入以下jar包:

 

②     編寫函數:

函數須要繼承UDF;在該類裏面可編寫多個evaluate方法(這個方法不是UDF中的,須要你本身寫)

③     使用mavae package打包:

④     執行:

#在Hive中添加該函數的Jar包

add JAR /root/hivedata/**.jar;

#建立臨時函數與開發好的 java class 關聯

create  temporary  function  隨便起一個函數名稱as '剛剛編寫的類的全限定名';

#可調用該函數進行測試

5. Hive中的特殊分隔符

cd /root/hivedata

vim shuang.txt

1||jeff

2||Jason

 

create table t_bi_reg(id string,name string)

row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'

with serdeproperties(

'input.regex'='(.*)\\|\\|(.*)',

'output.format.string'='%1$s %2$s'

)

stored as textfile;

 

load data local inpath '/root/hivedata/shuang.txt' into table t_bi_reg;

 

select * from t_bi_reg;

9、            網站流量日誌數據分析

1.  點擊流數據模型

(1)       點擊流概念:點擊流(Click Stream)是指用戶在網站上持續訪問的軌跡。咱們能夠經過對網站日誌的分析能夠得到用戶的點擊流數據。若是把 Page 視爲「點」的話,那麼咱們能夠很容易的把 Session描繪成一條「線」,也就是用戶的點擊流數據軌跡曲線。

(2)       點擊流模型( PageView和Visit ):

①     PageView表述用戶在一次會話中的訪問頁面狀況,而後將此次會話中的各個訪問按照時間順序排序並標註訪問步驟。

 

②     Visit是用戶每個會話中的信息統計;包括:

 

2.  流量分析常見分類

指標是網站分析的基礎,用來記錄和衡量訪問者在網站自的各類行爲。

(1)     骨灰級指標:

IP:1 天以內,訪問網站的不重複 IP 數。一天內相同 IP 地址屢次訪問網站只被計算 1 次。曾經 IP 指標能夠用來表示用戶訪問身份,目前則更多的用來獲取訪問者的地理位置信息。

PageView瀏覽量: 即一般說的 PV 值,用戶每打開 1 個網站頁面,記錄 1 個PV。用戶屢次打開同一頁面 PV 累計屢次。通俗解釋就是頁面被加載的總次數。

Unique PageView: 1 天以內,訪問網站的不重複用戶數(以瀏覽器 cookie 爲依據),一天內同一訪客屢次訪問網站只被計算 1 次。

(2)     基礎級指標:

訪問次數:訪客從進入網站到離開網站的一系列活動記爲一次訪問,也稱會話(session),1 次訪問(會話)可能包含多個 PV。

網站停留時間:訪問者在網站上花費的時間。

頁面停留時間:訪問者在某個特定頁面或某組網頁上所花費的時間。

3.  數據分析系統技術

數據處理流程:

a)         數據採集:定製開發採集程序,或使用開源框架 Flume

b)         數據預處理:定製開發 mapreduce 程序運行於 hadoop 集羣

c)         數據倉庫技術:基於 hadoop 之上的 Hive

d)         數據導出:基於 hadoop 的 sqoop 數據導入導出工具

e)         數據可視化:定製開發 web 程序(echarts)

f)          整個過程的流程調度:hadoop 生態圈中的 azkaban 工具

 

4.  模塊開發之數據採集

(1)     需求:在網站web流量日誌分析這種場景中,對數據採集部分要求不嚴格,故可使用通用的flume日誌採集框架來採集數據。

(2)     1

10、              Apache Sqoop

1.  Apache Sqoop的概述:

Sqoop 是 是 p Hadoop  和關係數據庫服務器之間傳送數據的一種工具。它是用來從關係數據庫如:MySQL,Oracle 到 Hadoop 的 HDFS,並從 Hadoop 的文件系統導出數據到關係數據庫。由 Apache 軟件基金會提供。

Sqoop:「SQL 到 Hadoop 和 Hadoop 到 SQL」。

 

2.  Sqoop的安裝:

 

3.  Sqoop的導入和導出:

 

11、           模塊開發

1.  模塊開發之工做流調度:

整個項目的數據按照處理過程,從數據採集到數據分析,再到結果數據的導出,一系列的任務能夠分割成若干個 azkaban 的 job 單元,而後由工做流調度器調度執行。

調度腳本的編寫難點在於 shell 腳本。可是通常都是有固定編寫模式。你們能夠參考資料中的腳本進行編寫。大致框架以下:

#!/bin/bash

#set java env

#set hadoop env

#設置一些主類、目錄等常量

#獲取時間信息

#shell 主程序、結合流程控制(if....else)去分別執行 shell 命令。

更多工做流及 hql 腳本定義見參考資料。

2.  Echarts( 模塊開發之數據可視化圖表工具 ):

(1)     Echarts概述:

ECharts 是一款由百度前端技術部開發的,基於 Javascript 的數據可視化圖表庫,提供直觀,生動,可交互,可個性化定製的數據可視化圖表。

能夠從ECharts官網中下載該工具,開發環境建議下載源代碼版本,包含了常見的錯誤提示和警告。

(2)     ECharts的使用:

  • 引入ECharts:          <script src="echarts.min.js"></script>
  • 爲 ECharts 準備一個具有大小(寬高)的 DOM : <div id="main" style="width: 600px;height:400px;"></div>
  • 在div下編寫一個script,獲取該DOM,並初始化ECharts:

<script type="text/javascript">

// 基於準備好的dom,初始化echarts實例:    var myChart = echarts.init(document.getElementById('main'));

// 指定圖表的配置項和數據           var option = {能夠從ECharts官網中獲取模板}

// 使用剛指定的配置項和數據顯示圖表:  myChart.setOption(option);

  • 在使用ECharts中,前端通常須要數組,因此在後端通常將數組封裝到對象中,對象的成員變量爲數組,而後使用@ResponseBody將該對象轉爲json格式,傳送到前端。

(3)     1

12、           Hadoop總結

1.  Hadoop之MapReduce

(1)       MapReduce工做機制詳解(重點掌握):

①      將一個文件進行切分(128M);若是切分爲多個則會有多個MapTask處理不一樣的分片文件;

②      具體的MapTask對文件進行逐行讀取並調用map方法進行處理;

③      將處理的結果寫到一個環形緩衝區,若是緩衝區達到80M則溢出並進行排序或者調用combiner進行合併處理(若是job設置過Combiner,那麼就是如今使用。Combiner 會優化MapReduce的中間結果,因此它在整個模型中會屢次使用。);

④      將上述內存中的文件數據按照分區數進行寫入到不一樣的分區文件中(調用了partitioner獲取該kv應該寫入到哪一個分區文件中);

⑤      reduceTask階段將mapTask處理的分區文件進行獲取並排序合併到具體的某個reduceTask的reduce方法進行處理;

⑥      再輸出具體的reduce處理後結果到HDFS。

(2)       MapReduce工做機制圖解(重點掌握):

 

(3)       MapReduce的Shuffle機制(重點掌握):

map階段處理的數據如何傳遞給reduce階段,是MapReduce框架中最關鍵的一個流程,這個流程就叫shuffle。通常把從Map產生輸出開始到Reduce取得數據做爲輸入以前的過程稱shuffle。shuffle機制的6個階段以下所示:

①      Collect 階段:將 MapTask 的結果輸出到默認大小爲 100M 的環形緩衝區,保存的是 key/value,Partition 分區信息等。

②      Spill 階段:當內存中的數據量達到必定的閥值的時候,就會將數據寫入本地磁盤,並進行排序。

③      Merge 階段:把全部溢出的臨時文件進行一次合併操做,以確保一個MapTask 最終只產生一箇中間數據文件。

④      Copy 階段: ReduceTask到已經完成MapTask的節點上覆制一份屬於本身的數據,並將這些數據保存到內存中。

⑤      Merge 階段:在 ReduceTask 遠程複製數據的同時,會在後臺開啓兩個線程對內存到本地的數據文件進行合併操做。

⑥      Sort 階段:在對數據進行合併的同時,會進行排序操做。

(4)       MapReduce的並行機制(熟悉):

①      MapTask並行機制( 多個MapTask共同運行 ):

  • MapTask 的並行度指的是 map 階段有多少個並行的 task 共同處理任務。
  • 一個 MapReduce的map階段並行度由客戶端在提交job時決定,即客戶端提交 job 以前會對待處理數據進行邏輯切片;一個邏輯切片對應一個MapTask。
  • 在Hadoop2.x中,一個邏輯切片默認爲128M,能夠對大小進行參數設置,但不論怎麼調參數,都不能讓多個小文件「劃入」一個邏輯切片中。

②      ReduceTask並行機制:

  • reducetask 並行度一樣影響整個 job 的執行併發度和執行效率;
  • Reducetask 數量的決定是能夠直接手動設置:job.setNumReduceTasks(4);
  • 若是數據分佈不均勻,就有可能在 reduce 階段產生數據傾斜。

③      Task並行度經驗之談:

  • 最好每一個 task 的執行時間至少一分鐘。( 每一個task的調度時間有幾秒鐘,若是task很快跑完,那調度時間會浪費 )
  • 一個 JVM 上最多能夠順序執行的 task 數目是 1,也就是說一個 task 啓一個 JVM;
  • 若是 input 的文件很是的大,好比 1TB,能夠考慮將 hdfs 上的每一個blocksize設大,好比設成256MB或者512MB;

(5)       MapReduce的優化參數(瞭解):

①      資源相關參數:

  • mapreduce.map.memory.mb: 一個 Map Task 可以使用的內存上限(單位:MB),默認爲 1024。若是超過會被殺死。
  • mapreduce.reduce.memory.mb: 一個 Reduce Task 可以使用的資源上限(單位:MB),默認爲 1024。
  • mapreduce.map.cpu.vcores: 每一個 Maptask 可用的最多 cpu core 數目, 默認值: 1
  • mapreduce.reduce.cpu.vcores: 每一個 Reducetask 可用最多 cpu core 數目默認值: 1

②      還有容錯相關參數和效率跟穩定性參數。

(6)       MapReduce的其餘功能(熟悉):

①      計數器功能:

  • 計數器是用來記錄 job 的執行進度和狀態的。MapReduce 計數器(Counter)爲咱們提供一個窗口,用於觀察 MapReduce Job 運行期的各類細節數據。
  • 內置計數器包括:文件系統計數器(File System Counters);做業計數器(Job Counters)等。
  • 自定義計數器(定義在MapTask的map函數中):

Counter counter =context.getCounter(「SelfCounters」,」myCounters」);

String[] words = value.toString().split(",");

for (String word : words) {

if("hello".equals(word)){counter.increment(1)};

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

}

                 ② 多job串聯:

                   一個複雜點的處理邏輯每每須要多個mapreduce程序串聯處理,多job的串聯能夠藉助mapreduce框架的JobControl實現。

ControlledJob controlledJob1 = new ControlledJob(job1.getConfiguration());     controlledJob1.setJob(job1);

ControlledJob controlledJob2 = new ControlledJob(job2.getConfiguration());     controlledJob2.setJob(job2);

5. controlledJob2.addDependingJob(controlledJob1); // job2 依賴於 job1

 

2.  Haoop之YARN

(1)     Yarn通俗介紹(熟悉):

  • 是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統和調度平臺,能夠把 yarn 理解爲至關於一個分佈式的操做系統平臺,而 mapreduce 等運算程序則至關於運行於操做系統之上的應用程序,Yarn 爲這些程序提供運算所需的資源(內存、cpu)。
  • yarn 並不清楚用戶提交的程序的運行機制,yarn 只提供運算資源的調度。
  • yarn 中的主管角色叫 ResourceManager,yarn 中具體提供運算資源的角色叫 NodeManager。
  • yarn與運行的用戶程序徹底解耦,意味着yarn上能夠運行各類類型的分佈式運算程序,好比mapreduce。

(2)     Yarn的三大組件(熟悉):

YARN是一個資源管理、任務調度的框架,主要包含三大模塊:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。

a)         ResourceManager:負責整個集羣的資源管理和分配,是一個全局的資源管理系統。

b)         NodeManager:是每一個節點上的資源和任務管理器,它是管理這臺機器的代理,負責該節點程序的運行,以及該節點資源的管理和監控。並向RM彙報本節點的資源使用狀況。

c)         ApplicationMaster:每一個應用程序均包含一個AM,負責每個具體應用程序的調度和協調。

(3)     Yarn的運行流程(熟悉):

 

(4)     Yarn的調度器Scheduler(瞭解):

在Yarn中,負責給應用分配資源的就是Scheduler;有三種調度器能夠選擇:FIFO Scheduler,Capacity Scheduler,FairScheduler。

a)         FIFO Scheduler:先進先出,在進行資源分配的時候,先給隊列中最頭上的應用進行分配資源,待最頭上的應用需求知足後再給下一個分配。

b)         Capacity Scheduler:此調度器容許多個組織共享整個集羣,每一個組織能夠得到集羣的一部分計算能力。

c)         Fair Scheduler:此調度器中,咱們不須要預先佔用必定的系統資源,Fair 調度器會爲全部運行的job動態的調整系統資源。

 

 

 

 

 

 

 

3.  Hadoop之HDFS

(1)     HDFS的元數據管理機制:

a)         元數據管理概述:

  • 元數據包含:文件、目錄和datanode信息、文件塊信息。
  • 元數據在namenode運行的時候由其維護並完整地在內存中存儲;爲了不丟失在hadoop的數據存放目錄下存有:edits(修改日誌)和fsimage鏡像文件(比edits要舊一些;文件、目錄和操做)。

b)         元數據目錄:

在namenode所在的機器的存放數據相應目錄的current目錄下包含:VERSION、seen_txid,fsimage,edits_*

c)         secondary namenode:

NameNode 職責是管理元數據信息,DataNode 的職責是負責數據具體存儲,SecondaryNameNode的職責是合併 NameNode 的 editlogs 到 fsimage 文件中。

d)         Checkpoint:

  • 每達到觸發條件,會由 secondary namenode 將 namenode 上積累的全部 edits 和一個最新的 fsimage 下載到本地,並加載到內存進行 merge(這個過程稱爲 checkpoint)。
  • 若是NameNode中的fsimage真的出問題了,仍是能夠用SecondaryNamenode中的fsimage替換一下NameNode上的fsimage,雖然已經不是最新的fsimage,可是咱們能夠將損失減少到最少。

(2)     HDFS的安全模式:

a)         安全模式概述:

  • 安全模式是 HDFS 所處的一種特殊狀態,在這種狀態下,文件系統只接受讀數據請求,而不接受刪除、修改等變動請求,是一種保護機制,用於保證集羣中的數據塊的安全性。
  • 若是 HDFS 處於安全模式下,不容許HDFS客戶端進行任何修改文件的操做,包括上傳文件等。

b)         安全模式命令:

  • 手動進入安全模式:                 hdfs dfsadmin -safemode enter
  • 手動退出安全模式:                 hdfs dfsadmin -safemode leave
  • 獲取集羣是否處於安全模式:hdfs dfsadmin -safemode get(也可在 web 頁面查看安全模式狀態)

4.  Hadoop之High Availability

(1)     High Availability概述:

HA(High Available), 高可用,是保證業務連續性的有效解決方案,通常有兩個或兩個以上的節點,分爲 活動節點(Active)及備用節點(Standby)。

相關文章
相關標籤/搜索