目錄
內容概要
Hadoop前生
Hadoop的功能與優勢
Hadoop的生態系統和版本
Hadoop安裝
內容概要
1、大數據技術的相關概念
2、Hadoop的架構和運行機制
3、Hadoop的安裝和配置
4、Hadoop開發
Hadoop前生
大數據的存儲和分析,出現系統瓶頸:存儲容量、讀寫速度、計算效率...
Google提出了大數據技術:MapReduce、BigTable、GFS(Google File System)
(1)成本降低,不一定非得用大型機和高端存儲,也可使用PC機
(2)由軟件 容錯 硬件故障,通過軟件保證可靠性
(3)簡化并行分布式計算,無需控制節點同步和數據交換,MapReduce:簡化分布式計算
Google只發表了相關論文,沒有公開源碼;Hadoop是模仿Google大數據技術的開源實現。
Hadoop的功能與優勢
開源的分布式存儲、分布式計算平臺
用來支撐Hadoop的兩個核心:
HDFS:分布式文件系統,存儲海量數據
MapReduce:并行處理框架,實現任務分解和調度;分布式數據處理模型和執行環境
Hadoop的功能:
(1)搭建大型數據倉庫,PB級數據的存儲、處理、分析、統計等業務:搜索引擎、商業智能、日志分析、風險評估等
Hadoop的優勢:
(1)高擴展:增加硬件提升容量和性能
(2)低成本:不依賴于高端硬件、通過軟件容錯保證系統可靠性
(3)成熟的生態圈:工具集
- 運行方便:Hadoop是運行在由一般商用機器構成的大型集群上。Hadoop在云計算服務層次中屬于PaaS(Platform-as-a- Service):平臺即服務。
- 健壯性:Hadoop致力于在一般的商用硬件上運行,能夠從容的處理類似硬件失效這類的故障。
- 可擴展性:Hadoop通過增加集群節點,可以線性地擴展以處理更大的數據集。
- 簡單:Hadoop允許用戶快速編寫高效的并行代碼。
Hadoop的生態系統和版本
Hadoop生態系統
HDFS(分布式文件系統)
MapReduce(分布式計算框架)
Hive(基于MapReduce的數據倉庫)
Pig(數據倉庫)
HBase(分布式數據庫)
Mahout(數據挖掘庫)
Zookeeper(分布式協作服務)
Sqoop(數據同步工具)
Flume(日志收集工具)
Oozie(作業流調度系統)
其中:
2)Nutch:互聯網數據及Nutch搜索引擎應用
3)HDFS:Hadoop的分布式文件系統
5)MapReduce:分布式計算框架
6)Flume、Scribe,Chukwa:數據收集,收集非結構化數據的工具
7) Hiho、Sqoop:將關系數據庫中的數據導入HDFS的工具
8) Hive:數據倉庫,pig分析數據的工具
10)Oozie:作業流調度引擎
11)Hue:Hadoop自己的監控管理工具
12)Avro:數據序列化工具
13)mahout:數據挖掘工具
14)Hbase:分布式的面向列的開源數據庫
Hadoop2.0時代的生態系統
Hadoop的核心
Hadoop1.0與Hadoop2.0的區別:
Hadoop1.0的核心由HDFS(Hadoop Distributed File System)和MapReduce(分布式計算框架)構成,而在Hadoop2.0中增加了Yarn(Yet Another Resource Negotiator),來負責集群資源的統一管理和調度。
HDFS(Hadoop Distributed File System,分布式文件系統)
為什么需要HDFS呢?HDFS是一個file system,對文件進行管理。文件系統由三部分組成:與文件管理有關軟件、被管理文件以及實施文件管理所需數據結構。
文件的讀取和寫入都需要時間,而且寫文件需要更多的時間,大概是讀文件的3倍;當數據集(文件)的大小超過一臺獨立物理計算機的存儲能力時,就有必要對它進行分區并存儲到若干臺單獨的計算機上——分布式文件存儲。
** HDFS的基本原理**
- 將文件切分成等大的數據塊,存儲在多臺機器上;
- 將數據切分、容錯、負載均衡等功能透明化;
- 可將HDFS看成容量巨大、具有高容錯性的磁盤
** HDFS的特點 **
- 良好的擴展性
- 高容錯性
- 適合PB級以上海量數據的存儲
HDFS的應用場景
- 海量數據的可靠性存儲
- 數據歸檔
MapReduce(分布式計算框架)
Mapreduce是一個計算框架,既然是做計算的框架,那么表現形式就是有個輸入(input),mapreduce操作這個輸入(input),通過本身定義好的計算模型,得到一個輸出(output),這個輸出就是我們所需要的結果。
我們要學習的就是這個計算模型的運行規則。在運行一個mapreduce計算任務時候,任務過程被分為兩個階段:map階段和reduce階段,每個階段都是用鍵值對(key/value)作為輸入(input)和輸出(output)。而程序員要做的就是定義好這兩個階段的函數:map函數和reduce函數。
Hive(基于MapReduce的數據倉庫)
Hive由facebook開源,最初用于解決海量結構化的日志數據統計問題;是一種ETL(Extraction-Transformation-Loading)工具。它也是構建在Hadoop之上的數據倉庫;數據計算使用MR,數據存儲使用HDFS。
Hive定義了一種類似SQL查詢語言的HiveQL查詢語言,除了不支持更新、索引和事務,幾乎SQL的其他特征都能支持。它通常用于離線數據處理(采用MapReduce);我們可以認為Hive的HiveQL語言是MapReduce語言的翻譯器,把MapReduce程序簡化為HiveQL語言。但有些復雜的MapReduce程序是無法用HiveQL來描述的。
Hive提供shell、JDBC/ODBC、Thrift、Web等接口。
Hive應用場景
- 日志分析:統計一個網站一個時間段內的pv、uv ;比如百度、淘寶等互聯網公司使用hive進行日志分析
- 多維度數據分析
- 海量結構化數據離線分析
- 低成本進行數據分析(不直接編寫MR)
Pig(數據倉庫)
Pig由yahoo!開源,設計動機是提供一種基于MapReduce的ad-hoc數據分析工具。它通常用于進行離線分析。
Pig是構建在Hadoop之上的數據倉庫,定義了一種類似于SQL的數據流語言–Pig Latin,Pig Latin可以完成排序、過濾、求和、關聯等操作,可以支持自定義函數。Pig自動把Pig Latin映射為MapReduce作業,上傳到集群運行,減少用戶編寫Java程序的苦惱。
Pig有三種運行方式:Grunt shell、腳本方式、嵌入式。
HBase(分布式數據庫)
HBase是一個構建在HDFS上的分布式列存儲系統,基于Google的Big Table模型開發,是典型的key/value系統,主要用于海量結構化數據存儲,它是NoSQL的典型代表產品。
從邏輯上講,HBase將數據按照表、行和列進行存儲。與hadoop一樣,Hbase目標主要依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加計算和存儲能力。
Hbase表的特點
- 大:一個表可以有數十億行,上百萬列;
- 無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中- 不同的行可以有截然不同的列;
- 面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;
- 稀疏:空(null)列并不占用存儲空間,表可以設計的非常稀疏;
- 數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳;
- 數據類型單一:Hbase中的數據都是字符串,沒有類型。
Hbase使用場景
- 大數據量存儲、高并發操作
- 需要對數據隨機讀寫操作
- 讀寫訪問都是非常簡單的操作
Mahout(數據挖掘庫)
Mahout是基于MapReduce的數據挖掘 / 機器學習庫,充分利用了MapReduce和HDFS的擴展性和容錯性,實現了聚類算法、分類算法和推薦算法
Zookeeper(分布式協作服務)
ZooKeeper 是一個分布式的,開源的協作服務,可應用于分布式應用程序。它發布了一組簡單的原子操作,分布式應用程序在此基礎之上可以實現更高層次的服務,如同步、配置維護、群組和命名管理 等。它為易于編程而設計,并且使用了一個類似于文件系統的目錄結構風格的數據模型。ZooKeeper service運行于Java環境中,也可綁定于Java和C.
ZooKeeper 是一個用于對分布式系統進行協作管理的服務程序,它本身也是分布式的,所以不要弄混了。對于我們自己的分布式系統來說,ZooKeeper就是一個用來管理的應用程序(或者說服務)。ZooKeeper提供了一個簡單易用的框架,由Service和Client兩大部分組成。
Service:由若干運行的Server組成(1個或多個),這些Server完全相同(除了可以部署在不同的機器上),每個Server都維護著相同的數據結構(類似于文件目錄結構),這個樹形結構中的節點叫znode,Server之間會自動同步數據。
Client:可以連接到Service,每個Client對象可以連接到一個指定(或自動分配)的Server,用戶通過client可以在Server中創建并維護數據。因為不同的Server維護的是同一份數據的復制,所以,不同的client使用者之間,通過ZooKeeper Service,就可以達到共享數據(信息)的目的。
ZooKeeper還提供了Watch的功能,當一個client改變了znode中的數據,所有的client都可以得到通知。ZooKeeper提供了Java和C語言的客戶端。
對于ZooKeeper的使用者來說,只需要運行Service,并且知道client的操作方法就可以了。在我們自己的分布式系統中,每個節點通過創建ZooKeeper client,就可以利用ZooKeeper service來同步,共享數據,或者實現更復雜的功能了。
Zookeeper解決分布式環境下數據管理問題:
- 統一命名
- 狀態同步
- 集群管理
- 配置同步
Sqoop(數據同步工具)
Sqoop是連接Hadoop與傳統數據庫之間的橋梁,它支持多種數據庫,包括MySQL、DB2等;插拔式,用戶可以根據需要支持新的數據庫。
Sqoop實質上是一個MapReduce程序,充分利用MR并行的特點,充分利用MR的容錯性。
Flume(日志收集工具)
Flume是一個分布式、可靠、和高可用的海量日志聚合的系統,支持在系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力。
**Fulme 的特點: **
1、可靠性
當節點出現故障時,日志能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別為:end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功后,再刪除;如果數據發送失敗,可以重新發送。),Store on failure(這也是scribe采用的策略,當數據接收方crash時,將數據寫到本地,待恢復后,繼續發送),Best effort(數據發送到接收方后,不會進行確認)。2、可擴展性
Flume采用了三層架構,分別為agent,collector和storage,每一層均可以水平擴展。其中,所有agent和collector由master統一管理,這使得系統容易監控和維護,且master允許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題。3、可管理性
所有agent和colletor由master統一管理,這使得系統便于維護。多master情況,Flume利用ZooKeeper和gossip,保證動態配置數據的一致性。用戶可以在master上查看各個數據源或者數據流執行情況,且可以對各個數據源配置和動態加載。Flume提供了web 和shell script command兩種形式對數據流進行管理。4、功能可擴展性
用戶可以根據需要添加自己的agent,collector或者storage。此外,Flume自帶了很多組件,包括各種agent(file, syslog等),collector和storage(file,HDFS等)。
Oozie(作業流調度系統)
目前計算框架和作業類型種類繁多:如MapReduce、Stream、HQL、Pig等。這些作業之間存在依賴關系,周期性作業,定時執行的作業,作業執行狀態監控與報警等。如何對這些框架和作業進行統一管理和調度?
解決方案有多種:
- Linux Crontab
- 自己設計調度系統(淘寶等公司)
- 直接使用開源系統(Oozie)
Oozie
- Oozie是一個管理Hdoop作業(job)的工作流程調度管理系統。
- Oozie的工作流是一系列動作的直接周期圖。
- Oozie協調作業就是通過時間(頻率)和有效數據觸發當前的Oozie工作流程
- Oozie是Yahoo針對Apache Hadoop開發的一個開源工作流引擎。
- 用于管理和協調運行在Hadoop平臺上(包括:HDFS、Pig和MapReduce)的Jobs。Oozie是專為雅虎的全球大規模復雜工作流程和數據管道而設計。
- Oozie圍繞著兩個核心進行:工作流(Workflow)和協調器(Coordinator),前者定義任務拓撲和執行邏輯,后者負責工作流的依賴和觸發。
Hadoop發行版(開源版)介紹
推薦使用2.x.x版本
下載地址:http://hadoop.apache.org/releases.html
Hadoop安裝
配置(偽分布式的配置)
修改1個環境變量文件
- hadoop-env.sh
記錄腳本要用的環境變量,以運行hadoop
export JAVA_HOME=/usr/Java/jdk1.7.0_51(設置java環境變量),即jdk的安裝目錄
修改3個配置文件
core-site.xml
hadoop core的配置項,例如hdfs和mapreduce常用的i/o設置等hdfs-site.xml
hadoop守護進程的配置項,包括namenode、輔助namenode和datanode等mapred-site.xml
MapReduce守護進程的配置項,包括jobtracker和tasktracker
遇到的坑
在ubuntu中配置SSH(解決connect to host localhost port 22: Connection refused問題)
為什么要安裝SSH?因為在Hadoop啟動以后,namenode是通過SSH(Secure Shell)來啟動和停止各個節點上的各種守護進程的。
Ubuntu默認并沒有安裝ssh服務,如果通過ssh鏈接Ubuntu,需要自己手動安裝openssh-server。判斷是否安裝ssh服務,可以通過如下命令進行:
ssh localhost
在這之前要開啟 ssh-agent:
$ eval ssh-agent
添加私鑰:
$ ssh-add ~/.ssh/id_rsa
告訴ssh允許 ssh-agent 轉發:
# 修改全局:
$ echo "ForwardAgent yes" >> /etc/ssh/ssh_config
啟動ssh service:
/etc/init.d/ssh start
啟動
[root@HostName sbin]# ./start-dfs.sh
[root@HostName sbin]# ./start-yarn.sh
停止
[root@HostName sbin]# ./stop-dfs.sh
[root@HostName sbin]# ./stop-yarn.sh
驗證hadoop是否安裝成功
http://localhost:50030/ (MapReduce的web頁面)
http://localhost:50070/ (HDFS的web頁面)
跑個wordcount程序驗證一下:
# 建一個input目錄,作為輸入
$mkdir input
$cd input
# 新建兩個文本文件
$echo "hello world">test1.txt
$echo "hello hadoop">test2.txt
$cd ..
# 將input文件上傳到HDFS,并重命名為in
$bin/hadoop dfs -put input in
# 調用yarn jar啟動YARN applications(Use yarn jar to launch YARN applications instead.)
$bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /in/input out
# 查看分析結果
$bin/hdfs dfs -cat /user/root/out/*
輸出: