(1) Zookeeper概述:javascript
Zookeeper 是一個分佈式協調服務的開源框架。主要用來解決分佈式集羣中應用系統的一致性問題,例如怎樣避免同時操做同一數據形成髒讀的問題。ZooKeeper 本質上是一個分佈式的小文件存儲系統。提供基於相似於文件系統的目錄樹方式的數據存儲,而且能夠對樹中的節點進行有效管理。前端
(2) Zookeeper特性:java
(3) ZooKeeper集羣角色:node
(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集羣安裝筆記
(1) 數據分析定義:
數據分析離不開數據,計量和記錄一塊兒促成了數據的誕生。數據分析是指用適當的統計分析方法對收集來的數據進行分析,將它們加以彙總和理解並消化,以求最大化地開發數據的功能,發揮數據的做用。商業領域中,數據分析可以給幫助企業進行判斷和決策,以便採起相應的策略與行動。數據分析可劃分爲:描述性數據分析、探索性數據分析、驗證性數據分析。咱們平常學習和工做中所涉及的數據分析主要描述性數據分析。
(2) 數據分析做用:
在商業領域中,數據分析的目的是把隱藏在數據背後的信息集中和提煉出來,總結出所研究對象的內在規律,幫助管理者進行有效的判斷和決策。數據分析在企業平常經營分析中主要有三大做用:
(3) 數據分析基本步驟( 六個步驟 ):
(4) 數據分析行業前景:
① 蓬勃發展的趨勢:中國數據分析行業前景和特色有 市場巨大、尚沒出現平臺級公司、企業技術外包的氛圍在國內尚沒徹底造成、整個行業很大並且需求旺盛。
② 數據分析師的職業要求:
在科技的快速發展推進下,在 IT 領域,企業會面臨兩個方面的問題。一是如何實現網站的高可用、易伸縮、可擴展、高安全等目標。爲了解決這樣一系列問題,迫使網站的架構在不斷髮展。從單一架構邁向高可用架構,這過程當中不得不提的就是分佈式。二是用戶規模愈來愈大,由此產生的數據也在以指數倍增加,俗稱數據大爆炸。海量數據處理的場景也愈來愈多。技術上該如何面對?
(1) 分佈式系統:
(2) 海量數據處理:
公開數據顯示,互聯網搜索巨頭百度 2013 年擁有數據量接近 EB 級別。阿里、騰訊都聲明本身存儲的數據總量都達到了百 PB 以上。此外,電信、醫療、金融、公共安全、交通、氣象等各個方面保存的數據量也都達到數十或者上百 PB級別。全球數據量以每兩年翻倍的速度增加,在 2010 年已經正式進入 ZB 時代,到 2020 年全球數據總量將達到 44ZB。 |
(1) 大數據時代的概述( 4V ):
Volume(大量)、Velocity(高速)、Variety(多樣)、Value(價值),即數據體量巨大、數據類型繁多、價值密度低、處理速度快。
(2) 大數據分析:
當數據分析遇到大數據時代,因而就產生了完美的契合:大數據分析。大數據分析能夠分爲以下幾方面:
(1) 原理分析:
首先,用戶的行爲會觸發瀏覽器對被統計頁面的一個 http 請求,好比打開某網頁。當網頁被打開,頁面中的埋點 javascript 代碼會被執行。 埋點是指:在網頁中預先加入小段 javascript 代碼。 |
(2) 具體方法和服務器部署請看以下文件:
(1) Hadoop概述:
Hadoop 是 Apache 旗下的一個用 java 語言實現開源軟件框架,是一個開發和運行處理大規模數據的軟件平臺。容許使用簡單的編程模型在大量計算機集羣上對大型數據集進行分佈式處理。
(2) Hadoop的定義:
HDFS(分佈式文件系統):解決海量數據存儲(底層文件存儲系統)
YARN(做業調度和集羣資源管理的框架):解決資源任務調度(中間組件,基本不須要了解)
MAPREDUCE(分佈式運算編程框架):解決海量數據計算(java代碼的主要對接點)
HDFS(分佈式文件系統)和MAPREDUCE(分佈式運算程序開發框架)等
(3) Hadoop發展簡史:
Hadoop 是 Apache Lucene 創始人 Doug Cutting 建立的。最先起源於 Nutch,它是 Lucene 的子項目。
2003 年 Google 發表了一篇論文爲該問題提供了可行的解決方案。
2004 年 Google 發表論文向全世界介紹了谷歌版的 MapReduce 系統。
2006 年 Google 發表了論文是關於 BigTable 的,這促使了後來的 Hbase 的發展。
(4) 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集羣簡介:
node-01 NameNode DataNode ResourceManager
node-02 DataNode NodeManager SecondaryNameNode
node-03 DataNode NodeManager
(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集羣
(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 包所在的目錄。
(1) HDFS介紹:
HDFS 是 Hadoop Distribute File System 的簡稱,意爲:Hadoop 分佈式文件系統。是 Hadoop 核心組件之一,做爲最底層的分佈式存儲服務而存在。分佈式文件系統解決的問題就是大數據存儲。
(2) HDFS設計目標:
能夠進行故障的檢測和自動快速恢復、以流式讀取數據有很高的數據訪問的高吞吐量、
支持大文件和多文件、write-one-read-many 訪問模型(一次寫入屢次讀取)。
(1) 主從節點(NameNode和DataNode)
(2) 分塊存儲(物理結構上會將上傳的文件默認按照每塊128M進行切分並保存這些切分後的文件塊)
(3) 名字空間:抽象目錄樹(/hello/aaa.txt)
(4) NameNode元數據管理(將各個文件保存在不一樣的dataNode和塊數等信息存儲)
(5) DataNode數據存儲
(6) 副本機制(在安裝的時候能夠指定文件塊在hdfs上有多少個副本)
(7) 一次寫入,屢次讀出(讀得多,用於計算處理數據;通常保存的都是日誌類型;若是要修改,先刪除,以後再傳遞最新的文件)
(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遞歸刪除。
(1) HDFS的工做機制概述:
(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 會合併成一個完整的最終文件。
(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得到該對象。
② 示例代碼:
(1) MapReduce 的思想核心是「分而治之」;Map 負責「分」,在各個Map之間幾乎沒有依賴關係;Reduce負責
「合」,即對 map 階段的結果進行全局彙總。
(2) Hadoop MapReduce設計構思:
MapReduce 是一個分佈式運算程序的編程框架,核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分佈式運算程序,併發運行在Hadoop 集羣上。在MapReduce中,程序員僅須要關心其應用層的具體計算問題,僅需編寫少許的處理應用自己計算問題的程序代碼。
(3) MapReduce框架結構:
一個完整的 mapreduce 程序在分佈式運行時有三類實例進程:
a、MRAppMaster:負責整個程序的過程調度及狀態協調
b、MapTask:負責 map 階段的整個數據處理流程
c、ReduceTask:負責 reduce 階段的整個數據處理流程
(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) 示例編寫:
以示例:在一堆給定的文本文件中統計輸出每個單詞出現的總次數 編寫示例工程以下
MapReduce 框架運轉在<key,value> 鍵值對上,也就是說,框架把做業的輸入當作是一組<key,value>鍵值對,一樣也產生一組<key,value>鍵值對做爲做業的輸出,這兩組鍵值對多是不一樣的。具體輸入和輸入以下圖所示:
(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函數:
(1) MapReduce的數據分區:在執行主類中設置NumReduceTask的個數N;而後對應有N的輸出內容。
(2) MapReduce的邏輯分片:根據文件的大小進行文件塊劃分爲M個塊,將由M個mapTask進行處理。
(3) MapReduce中的序列化:
當須要在進程和網絡之間傳遞對象或持久化對象時,就須要將對象進行序列化。但Java的Serializable序列化框架是一個重量級的序列化框架,當對一個對象進行序列化時,會有不少額外的信息。因此,hadoop 本身開發了一套序列化機制( Writable),Writable是Hadoop的序列化格式,hadoop定義了這樣一個Writable接口。一個類要支持可序列化只需實現這個接口便可。
MapReduce中的基本序列化類型:IntWritable(int)、LongWritable(long)、Text(String)、NullWritable(null)等。
(1) 排序的實現思路:
MR程序在處理數據的過程當中會對數據排序(map 輸出的 kv 對傳輸到 reduce以前,會排序),排序的依據是 map 輸出的 key。因此,咱們若是要實現本身須要的排序規則,則能夠考慮將排序因素放到 key 中,讓 key 實現接口:WritableComparable,而後重寫 key 的 compareTo 方法
(2) MapReduce實現排序的具體接口和方法:
若是指定的數與參數相等返回 0。若是指定的數小於參數返回 -1。若是指定的數大於參數返回 1。
返回正數的話,當前對象(調用compareTo方法的對象)要排在比較對象後面;
返回負數的話,放在前面;若是返回0會有一個對象不會顯示(在開發中應該避免出現0)。
(3) 排序具體實現代碼以下:
(1) 爲何要進行分區:
Mapreduce中會將map輸出的 kv 對,按照相同 key 分組,而後分發給不一樣的 reducetask;
默認的分發規則爲:根據 key 的 hashcode%reducetask 數來分發;
因此:若是要按照咱們本身的需求進行分組,則須要改寫數據分發(分組)組件 Partitioner;
自定義一個 CustomPartitioner 繼承抽象類:Partitioner,而後在job 對象中,設置自定義的分組規則。
(2) 分區的具體實現:
//這裏設置運行 reduceTask 的個數,即程序執行後生成幾個part-r-00000文件 //getPartition 返回的分區個數 = NumReduceTasks 正常執行 //getPartition 返回的分區個數 > NumReduceTasks 報錯:Illegal partition,多出的數據沒地方存放 //getPartition 返回的分區個數 < NumReduceTasks 能夠執行 ,多出空白文件 job.setNumReduceTasks(10);
//這裏指定使用咱們自定義的分區組件,即程序執行後,最終數據分紅幾部分 job.setPartitionerClass(ProvincePartitioner.class); |
(3) 分區具體代碼以下:
(1) Combiner的做用:
每個 map 均可能會產生大量的本地輸出,Combiner 的做用就是對 map 端的輸出先作一次合併,以減小在 map 和 reduce 節點之間的數據傳輸量,以提升網絡 IO 性能,是 MapReduce 的一種優化手段之一。
(2) Combiner在MapReduce中的概述:
Combiner 是在每個 maptask 所在的節點運行;
Reducer 是接收全局全部 Mapper 的輸出結果;
(3) Combiner的使用步驟:
(1) Flume 是 Cloudera 提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的軟件。核心是把數據從數據源(source)收集過來,再將收集到的數據送到指定的目的地(sink)。
(2) Flume的運行機制:
Flume 系統中核心的角色是agent,agent自己是一個Java 進程,通常運行在日誌收集節點。有以下三個組件:
Source:採集源,用於跟數據源對接,以獲取數據;
Sink:下沉地,採集數據的傳送目的,用於往下一級 agent 傳遞數據或者往最終存儲系統傳遞數據;
Channel:agent內部的數據傳輸通道,用於從 source將數據傳遞到 sink;
(1) 需求1:服務器的某特定目錄下,會不斷產生新的文件,每當有新文件出現,就須要把文件採集到HDFS中去。
(2) 需求2:業務系統使用log4j生成的日誌,日誌內容不斷增長,須要把追加到日誌文件中的數據實時採集到hdfs。
(1) 業務系統數據:
業務數據爲公司內部的數據,獲取的的成本低,方式容易。能夠直接經過接口調用,從公司的業務系統中獲取數據,可是要注意不能影響業務系統數據庫的性能。也能夠進行數據庫的dump(從數據庫中導出所有數據),好比 MySQL 數據庫,使用 mysqldump 工具就能夠進行數據庫的導出( mysqldump -uroot -pPassword [database name] [dump file] )。
(2) 爬蟲數據:
爬蟲(Web crawler),是指一種按照必定的規則,自動地抓取萬維網信息的程序或者腳本。它們被普遍用於互聯網搜索引擎或其餘相似網站,能夠自動採集全部其可以訪問到的頁面內容,以獲取或更新這些網站的內容和檢索方式。電子商務行業最初的爬蟲需求來源於比價。
(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) 數據質量檢測:
數據質量是保證數據應用的基礎,它的評估標準主要包括四個方面:完整性、一致性、準確性、及時性。
(1) 數據倉庫的基本概念:
數據倉庫,英文名稱爲 Data Warehouse,可簡寫爲 DW 或 DWH。數據倉庫的目的是構建面向分析的集成化數據環境,爲企業提供決策支持(DecisionSupport)。它出於分析性報告和決策支持目的而建立。
數據倉庫自己並不「生產」任何數據,同時自身也不須要「消費」任何的數據,數據來源於外部,而且開放給外部應用,這也是爲何叫「倉庫」,而不叫「工廠」的緣由。
(2)
(1) Hive簡介:
Hive 是基於 Hadoop 的一個數據倉庫工具,能夠將結構化的數據文件映射爲一張數據庫表,並提供類 SQL 查詢功能。本質是將 SQL 轉換爲 MapReduce 程序。主要用途:用來作離線數據分析,比直接用 MapReduce 開發效率更高。
(2) 爲何使用Hive:
① 直接使用 Hadoop MapReduce 處理數據所面臨的問題:
人員學習成本過高;MapReduce 實現複雜查詢邏輯開發難度太大。
② 使用 Hive 的優勢:
操做接口採用類SQL語法,提供快速開發的能力;避免了去寫MapReduce,減小開發人員的學習成本;
功能擴展很方便。
(3) Hive架構:
① Hive與Hadoop的關係:Hive利用HDFS存儲數據,利用MapReduce查詢分析數據。
② Hive組件:
(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鏈接說明:
或(bin/beeline -u jdbc:hive2://node-1:10000 -n root )
(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;
(1) Hive參數參考網站:
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
(2) 參數的設定方式和優先級:
用戶自定義或默認的配置文件,配置文件的設定對本機啓動的全部 Hive 進程都有效。
啓動 Hive(客戶端或 Server 方式)時,能夠在命令行添加-hiveconf 來設定參數,例如:bin/hive -hiveconf hive.root.logger=INFO,console;設定對本次啓動的 Session(對於 Server 方式啓動,則是全部請求的 Sessions)有效。
能夠在 HQL 中使用 SET 關鍵字設定參數,這一設定的做用域也是 session 級的。
(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 '剛剛編寫的類的全限定名'; #可調用該函數進行測試 |
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; |
(1) 點擊流概念:點擊流(Click Stream)是指用戶在網站上持續訪問的軌跡。咱們能夠經過對網站日誌的分析能夠得到用戶的點擊流數據。若是把 Page 視爲「點」的話,那麼咱們能夠很容易的把 Session描繪成一條「線」,也就是用戶的點擊流數據軌跡曲線。
(2) 點擊流模型( PageView和Visit ):
① PageView表述用戶在一次會話中的訪問頁面狀況,而後將此次會話中的各個訪問按照時間順序排序並標註訪問步驟。
② Visit是用戶每個會話中的信息統計;包括:
指標是網站分析的基礎,用來記錄和衡量訪問者在網站自的各類行爲。
(1) 骨灰級指標:
IP:1 天以內,訪問網站的不重複 IP 數。一天內相同 IP 地址屢次訪問網站只被計算 1 次。曾經 IP 指標能夠用來表示用戶訪問身份,目前則更多的用來獲取訪問者的地理位置信息。
PageView瀏覽量: 即一般說的 PV 值,用戶每打開 1 個網站頁面,記錄 1 個PV。用戶屢次打開同一頁面 PV 累計屢次。通俗解釋就是頁面被加載的總次數。
Unique PageView: 1 天以內,訪問網站的不重複用戶數(以瀏覽器 cookie 爲依據),一天內同一訪客屢次訪問網站只被計算 1 次。
(2) 基礎級指標:
訪問次數:訪客從進入網站到離開網站的一系列活動記爲一次訪問,也稱會話(session),1 次訪問(會話)可能包含多個 PV。
網站停留時間:訪問者在網站上花費的時間。
頁面停留時間:訪問者在某個特定頁面或某組網頁上所花費的時間。
數據處理流程:
a) 數據採集:定製開發採集程序,或使用開源框架 Flume
b) 數據預處理:定製開發 mapreduce 程序運行於 hadoop 集羣
c) 數據倉庫技術:基於 hadoop 之上的 Hive
d) 數據導出:基於 hadoop 的 sqoop 數據導入導出工具
e) 數據可視化:定製開發 web 程序(echarts)
f) 整個過程的流程調度:hadoop 生態圈中的 azkaban 工具
(1) 需求:在網站web流量日誌分析這種場景中,對數據採集部分要求不嚴格,故可使用通用的flume日誌採集框架來採集數據。
(2) 1
Sqoop 是 是 p Hadoop 和關係數據庫服務器之間傳送數據的一種工具。它是用來從關係數據庫如:MySQL,Oracle 到 Hadoop 的 HDFS,並從 Hadoop 的文件系統導出數據到關係數據庫。由 Apache 軟件基金會提供。
Sqoop:「SQL 到 Hadoop 和 Hadoop 到 SQL」。
整個項目的數據按照處理過程,從數據採集到數據分析,再到結果數據的導出,一系列的任務能夠分割成若干個 azkaban 的 job 單元,而後由工做流調度器調度執行。
調度腳本的編寫難點在於 shell 腳本。可是通常都是有固定編寫模式。你們能夠參考資料中的腳本進行編寫。大致框架以下:
#!/bin/bash
#set java env
#set hadoop env
#設置一些主類、目錄等常量
#獲取時間信息
#shell 主程序、結合流程控制(if....else)去分別執行 shell 命令。
更多工做流及 hql 腳本定義見參考資料。
(1) Echarts概述:
ECharts 是一款由百度前端技術部開發的,基於 Javascript 的數據可視化圖表庫,提供直觀,生動,可交互,可個性化定製的數據可視化圖表。
能夠從ECharts官網中下載該工具,開發環境建議下載源代碼版本,包含了常見的錯誤提示和警告。
(2) ECharts的使用:
<script type="text/javascript">
// 基於準備好的dom,初始化echarts實例: var myChart = echarts.init(document.getElementById('main'));
// 指定圖表的配置項和數據 var option = {能夠從ECharts官網中獲取模板}
// 使用剛指定的配置項和數據顯示圖表: myChart.setOption(option);
(3) 1
(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共同運行 ):
② ReduceTask並行機制:
③ Task並行度經驗之談:
(5) MapReduce的優化參數(瞭解):
① 資源相關參數:
② 還有容錯相關參數和效率跟穩定性參數。
(6) MapReduce的其餘功能(熟悉):
① 計數器功能:
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 |
(1) Yarn通俗介紹(熟悉):
(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動態的調整系統資源。
(1) HDFS的元數據管理機制:
a) 元數據管理概述:
b) 元數據目錄:
在namenode所在的機器的存放數據相應目錄的current目錄下包含:VERSION、seen_txid,fsimage,edits_*
c) secondary namenode:
NameNode 職責是管理元數據信息,DataNode 的職責是負責數據具體存儲,SecondaryNameNode的職責是合併 NameNode 的 editlogs 到 fsimage 文件中。
d) Checkpoint:
(2) HDFS的安全模式:
a) 安全模式概述:
b) 安全模式命令:
(1) High Availability概述:
HA(High Available), 高可用,是保證業務連續性的有效解決方案,通常有兩個或兩個以上的節點,分爲 活動節點(Active)及備用節點(Standby)。