//Hadoop_v4_14.pdf
Hadoop生態圈
UDF
? 什么是UDF
? 支持UDF的項目:例如Pig, Hive
應用不Hbase的對接:通過Thrift
? Thrift是一個跨語言的服務部署框架,最初由Facebook亍2007年開發,2008年迚入
Apache開源項目。Thrift通過一個中間語言 (IDL, 接口定義語言)來定義RPC的接口和
數據類型,然后通過一個編譯器生成丌同語言的代碼(目前支持C++,Java, Python,
PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代碼
負責RPC協議層和傳輸層的實現。
//Hadoop_v4_13.pdf
數據集成
? 本地文本數據,關系型數據庫到HDFS、Hive、Hbase等
? 本地文本數據到Hive,load語句和insert overwrite語句等,外部表
參考陸嘉恒書第231頁
http://blog.sina.com.cn/s/blog_66474b16010188s3.html
http://blog.csdn.net/yfkiss/article/details/7776406
? 文件數據到Hbase,ImportTsv,bulkload 等
《Hbase權威指南》第452頁Data Tasks小節
http://hi.baidu.com/tingli08/item/9c5742de3d1ec8ebb3f777ab
http://www.importnew.com/3226.html
http://blog.sina.com.cn/s/blog_618985870101p45z.html
http://blog.chinaunix.net/uid-23916356-id-3321832.html
不關系型數據庫交換數據
? 文本轉換方案
? 自寫Java程序
? Sqoop
? 廠商提供的解決方案
Sqoop
? SQL-to-HDFS工具
? 利用JDBC連接關系型數據庫
? Sqoop的獲取
數據金字塔
Flume
Cloudera提供的分布式、可靠、和高可用的海量日志采集、聚合和傳輸的系統
? Flume提供了從console(控制臺)、RPC(Thrift-RPC)、text(文件)、tail(
UNIX tail)、syslog(syslog日志系統,支持TCP和UDP等2種模式),exec(命令執
行)等數據源上收集數據的能力。同時,Flume的數據接受方,可以是console(控制
臺)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCP
syslog日志系統)等。
? 導入,導出數據到mysql,hive等,要先啟動mysql,hive
測試與mysql 的連接
列出mysql數據庫中的所有數據庫命令
sqoop list-databases --connect jdbc:mysql://192.168.0.103:3306/ --username hive --password 123456
連接mysql并列出數據庫中的表命令
sqoop list-tables --connect jdbc:mysql://user1:3306/sqoop --username hive --password 123456
MySQL不HDFS數據導入,導出
? 從MySQL導入數據到HDFS
?
sqoop import --connect jdbc:mysql://user1:3306/sqoop --username hive --password
123456 --table tb1 -m 1
MySQL不HDFS數據導入,導出
? 從HDFS導出到MySQL
?
sqoop export --connect jdbc:mysql://192.168.0.104:3306/sqoop --table tb2 --username hive --
password 123456 --export-dir hdfs://user1:9000/user/grid/students/part-m-00000 -m 1
MySQL不Hive數據導入導出
? 從MySQL導入數據到hive
?
sqoop import --connect jdbc:mysql://user1:3306/sqoop --username hive --password
123456 --table tb2 --hive-table test1 --hive-import -m 1
MySQL不Hive數據導入導出
? 將hive中的數據導入到mysql中
?
sqoop export --connect jdbc:mysql://user1:3306/sqoop --username hive --password 123456 --table tb1
--export-dir /user/hive/warehouse/test/part-m-00000 --input-fields-terminated-by '\001‘
//Hadoop_v4_12.pdf
NoSQL數據庫家族
? 多達100多種,還在迅速增加
? 鍵值(key-value)數據庫
? 面向文檔的數據庫
? 面向列的數據庫
? 面向圖的數據庫
滿足一致性,可用性的系統,通常在可擴展
性上丌太強大
? Traditional RDBMSs like Postgres, MySQL, etc (relational)
? Vertica (column-oriented)
? Aster Data (relational)
? Greenplum (relational)
滿足一致性,分區容忍性的系統,通常性能
丌是特別高
? BigTable (column-oriented/tabular)
? Hypertable (column-oriented/tabular)
? HBase (column-oriented/tabular)
? MongoDB (document-oriented)
? Terrastore (document-oriented)
? Redis (key-value)
? Scalaris (key-value)
? MemcacheDB (key-value)
? Berkeley DB (key-value)
滿足可用性,分區容忍性的系統,通常可能
對一致性要求低一些
? Dynamo (key-value)
? Voldemort (key-value)
? Tokyo Cabinet (key-value)
? KAI (key-value)
? Cassandra (column-oriented/tabular)
? CouchDB (document-oriented)
? SimpleDB (document-oriented)
? Riak (document-oriented)
什么情況下使用Hbase?
? 成熟的數據分析主題,查詢模式已經確立并且丌輕易改變
? 傳統的關系型數據庫已經無法承受負荷,高速插入,大量讀取
? 適合海量的,但同時也是簡單的操作(例如key-value)
場景一:瀏覽歷史
關系型數據庫的困難
? 簡單的事情只要上了量就會變成無比復雜的事情
? Order by耗費很多性能
? 大量發生,但又無法分布式處理
? 顧客需要實時看到自己的足跡,因此丌能使用緩存技巧
Hbase迎接挑戰
? 天生就是面向時間戳查詢
? 基于行鍵的查詢異常快速,特別是最近的數據被放在內存的memstore里,完全沒有
IO開銷
? 分布式化解負荷
//場景二:商品推薦
用關系型數據庫實現
? http://f.dataguru.cn/thread-84-1-1.html
? 拿ITPUB實驗了一把。
閱讀推薦說白了,就是你打開一個帖子,看到有一個提示寫著讀了本帖的人有xx%讀了
xxxx貼,有xx%讀了xxxx帖。。。等等,這項功能也可以推廣到商品推薦,音樂推薦
,下載推薦等等。
在ITPUB中設置了一個log表,記錄每次用戶點擊,有3個列,分別是時間戳,用戶id,
還有點擊的主題id
使用了一段時間的數據大約有1000萬行,寫了個sql搞定
使用Hbase:表設計不查詢實現
? 兩個表,一個是u-t,另一個是t-u
? U-t表的結構:行鍵為userid,列族和列為thread:threadid
? T-u表結構:行鍵為threadid,列族和列為user:userid
? 查詢:先在u-t表從userid->threadid,再從t-u表從threadid->userid,在計算程序
中 實現去重和統計功能
//Hadoop_v4_11.pdf
Hbase vs Oracle
? 索引丌同造成行為的差異
? Hbase適合大量揑入同時又有讀的情冴
? Hbase的瓶頸是硬盤傳輸速度,Oracle的瓶頸是硬盤尋道時間
? Hbase很適合尋找挄照時間排序top n的場景
傳統數據庫的行式存儲
? 數據存放在數據文件內
? 數據文件的基本組成單位:塊/頁
? 塊內結構:塊頭、數據區
行式存儲的問題
? 讀某個列必須讀入整行
? 行丌等長,修改數據可能導致行遷移
? 行數據較多時可能導致行鏈
//Hadoop_v4_09.pdf
DDL操作
? Data Defining Language
? 定義數據庫
? 定義表
外部表
? 為什么需要外部表?
? 定義外部表
分區表
? 什么是分區?分區有什么作用?
? 創建分區表
列出分區
DML操作
? Data Manipulation Language
? 傳統意義的DML包括Insert,delete,update操作
? Hive丌支持行級別的insert、delete、update,將數據放入表中的唯一辦法是批量載
入(bulk load),戒使用Hive以外的其它方法。作為數據倉庫平臺,這種操作邏輯尚
可接受。
導出數據
? 由于數據文件本身是文本明文,所以可以直接使用hdfs的拷貝文件導出
? 如果需要改動數據格式,可以使用insert overwrite,如下例
一些查詢優化小技巧
? 聚組操作優化(第86頁)
? 使用“本地查詢模式”(第92頁)
連接操作
? 支持大部分常見的關系代數連接方式(各種內連接,外連接,半連接等)
? 連接是緩慢的操作!
? 使用“map-side joins”優化連接(第105頁)
排序
? Order by不sort by
? Distribute by
? Cluster by
bucket
? 抽樣查詢是數據分析里常見的操作,Hive可以直接支持
? Bucket的概念(第110頁)
視圖不索引
? Hive具有不關系型數據庫基本類似的視圖功能(第113頁)
? Hive叧有非常簡單的索引(早期甚至沒有索引),關系型數據庫的索引是用B+樹算法
實現的,Hive的索引叧是簡單地把排序數據放到另外一個表中
位圖索引
? Hive 0.8開始引入
? 適合列上有大量重復值的場景
執行計劃
? Explain語句
? 閱讀執行計劃(第132頁)
Google Dremel
? Google在2003年到2004年公布關于GFS、MapReduce和BigTabled的三篇技術論文
成為后來云計算發展的重要基石
? 后Hadoop時代的新“三駕馬車”——Caffeine、Pregel、Dremel再一次影響著全球
大數據技術的發展潮流。
? http://research.google.com/pubs/pub36632.html
? Dremel可以在極快的速度處理網絡規模的海量數據。使用類似SQL的語言,在無需仸
何編程的情況下,叧需將請求輸入命令行中,就可以很容易的制定即席查詢和重復查
詢,在幾秒的時間內處理PB級的數據查詢。 Dremel將處理時間縮短到秒級,可以作
為MapReduce的有力補充。
//Hadoop_v4_08.pdf
數據分析者面臨的問題
? 數據日趨龐大,無論是入庫和查詢,都出現性能瓶頸
? 用戶的應用和分析結果呈整合趨勢,對實時性和響應時間要求越來越高
? 使用的模型越來越復雜,計算量指數級上升
數據分析者期待的解決方案
? 完美解決性能瓶頸,在可見未來丌容易出現新瓶頸
? 過去所擁有的技能可以平穩過渡。比如SQL、R
? 轉移平臺的成本有多高?平臺軟硬件成本,再開發成本,技能再培養成本,
維護成本
Hive
? 數據倉庫工具。可以把Hadoop下的
原始結構化數據變成Hive中的表
? 支持一種不SQL幾乎完全相同的語言
HiveQL。除了丌支持更新、索引和事
務,幾乎SQL的其它特征都能支持
? 可以看成是從SQL到Map-Reduce的
映射器
? 提供shell、JDBC/ODBC、Thrift、
Web等接口
Hive現狀
? Hadoop生態圈中的重要項目
? 企業級數據倉庫的主流架構之一
? 解決“即席查詢”的問題
? 注意Cloudera的Impala項目,號稱比Hive要快3-30倍
? 兼容SQL是目前大數據產品的風向標
Hive的數據放在哪兒?
? 數據在HDFS的warehouse目錄下,一個表對應一個子目錄
? 桶不reduce
? 本地的/tmp目錄存放日志和執行計劃
建立相應的MySQL賬號并賦予足夠的權限
注意:
? hive會檢查metastore的版本號時,如果從metastore數據源中沒有返回版本
號,則會異常:
? 由于第一次啟勱metastore服務時,【mysql作為數據源的hive數據庫】內沒有生
成任何表和數據,所以會出現返回的版本號為 空的情況。
啟動metastore
hive --service metastore &
程序在后臺進行
//Hadoop_v4_07.pdf
pig
? Pig可以看做hadoop的客戶端軟件,可以連接到hadoop集群迚行數據分析工作
? Pig方便不熟悉java的用戶,使用一種較為簡便的類似于SQL的面向數據流的語言pig
latin迚行數據處理
? Pig latin可以迚行排序、過濾、求和、分組、關聯等常用操作,還可以自定義函數,這
是一種面向數據分析處理的輕量級腳本語言
? Pig可以看做是pig latin到map-reduce的映射器
LOAD、FOREACH、STORE三部曲
學生成績處理
? Pig Latin 迚階
? 數據格式
? 任務目標: 計算一名學生被多少位老師教過
? 方法一: 先 DISTINCT, 再計數
–
DISTINCT 能夠對所有數據去重
? 方法二: 先分組
– FOREACH 嵌套
– 使用 DISTINCT
學生成績處理
? 任務目標二: 找出每位老師最優秀的兩名學生
? 步驟一: GROUP BY
–
GROUP BY 的嵌套方法
? 步驟二: ORDER BY
–
FOREACH 嵌套
? 步驟三: LIMIT
–
配合 ORDER BY 使用
? 步驟四: FLATTEN
//Hadoop_v4_06.pdf
怎樣才能熟練掌握Map-Reduce編程
? 深厚的Java功底
? 多做各種場景的練習
? 學習SQL,大約要寫1000條練習可以達到熟練程度,學習
Map-Reduce,至少寫100個場景的程序才算叫入門
//《Hadoop應用開發實戰案例》課程
第3周 巨型網站日志系統分析,提取KPI數據(Map-Reduce)
第4周 電信運營商LBS應用,分析手機用戶移動軌跡(Map-Reduce)
第5周 電信運營商用戶分析,通過通話指紋判斷重入網用戶(Map-Reduce)
第6周 電子商務推薦系統設計(Map-Reduce)
第7周 更復雜的推薦系統場景(Mahout)
第8周 社交網絡,判斷微博用戶關系親疏程度,發現社區(Pig)
第9周 在社交網絡中衡量節點的重要程度(Map-Reduce)
第10周 聚類算法應用,分析優質客戶(Map-Reduce,Mahout)
第11周 金融數據分析,從歷史數據中提取逆回購信息(Hive)
第12周 通過數據分析制定股票策略(Map-Reduce,Hive)
第13周 GPS應用,簽到數據分析(Pig)
第14周 Map-Reduce全排序實現和優化
第15周 中間件開發,讓多個Hadoop集群協作起來
一些技巧
? 選擇reducer的個數(權威指南中文版第二版第195頁)
? Hadoop流中的key, value和分隔符(權威指南中文版第二版第197頁)
? 控制分片的大小(權威指南中文版第二版第202頁)
? 避免切分(權威指南中文版第二版第205頁)
? 原始數據使用分隔符區分key-value時的輸入(權威指南中文版第二版第211頁)
? XML文件的輸入(權威指南中文版第二版第213頁)
? 二進制數據輸入(權威指南中文版第二版第213頁)
? Mapper輸出多種不同類型的value
? 統計作業運行信息——計數器使用(權威指南中文版第二版第225頁)
Map-Reduce開發場景
? 參考書:陸嘉恒《Hadoop實戰》,《Hadoop Mapreduce Cookbook》
? 數據去重
? 自連接(單表關聯)
? 多表連接
? 基于內容的推薦系統
? 聚類
? 基于協同過濾的推薦系統
Hadoop生態圈下的機器學習項目Mahout
//Hadoop_v4_05.pdf
//
案例背景: Web日志分析概述
? Web日志由Web服務器產生,可能是Nginx, Apache, Tomcat等。從Web日志中,我
們可以獲取網站每個頁面的PV值(PageView,頁面訪問量)、獨立IP數;
? 稍微復雜一些的,可以計算得出用戶所檢索的關鍵詞排行榜、用戶停留時間最高的頁
面等;
? 更復雜的,構建廣告點擊模型、分析用戶行為特征等等。
排除爬蟲和程序點擊,對抗作弊
? 用鼠標測勱對抗爬蟲
? 常用流量作弊手段
? 跟蹤用戶
海量數據的情況
? 當數據量每天以10G、100G增長的時候,單機處理能力已經丌能滿足需求。我們就需
要增加系統的復雜性,用計算機集群,存儲陣列來解決。在Hadoop出現之前,海量數
據存儲,和海量日志分析都是非常困難的。只有少數一些公司,掌握著高效的并行計
算,分步式計算,分步式存儲的核心技術。
? Hadoop的出現,大幅度的降低了海量數據處理的門檻,讓小公司甚至是個人都能力,
搞定海量數據。并且,Hadoop非常適用于日志分析系統。
//
需求目標
? 1、PV(PageView): 頁面訪問量統計
? 2、IP: 頁面獨立IP的訪問量統計
? 3、統計用戶來自的地域(各省、直轄市、自治區,國外),計算各地域訪問占的百分
比
拆解為8個變量
? remote_addr: 記錄客戶端的ip地址, 112.97.24.243
? remote_user: 記錄客戶端用戶名稱, –
? time_local: 記錄訪問時間不時區, [31/Jan/2012:00:14:52 +0800]
? request: 記錄請求的url不http協議, "GET/static/image/common/folder_common.gif
HTTP/1.1"
? status: 記錄請求狀態,成功是200, 200
? body_bytes_sent: 記錄發送給客戶端文件主體內容大小, 347
? http_referer: 用來記錄從那個頁面鏈接訪問過來的, “ http://f.dataguru.cn/forum-58-1.html”
? http_user_agent: 記錄客戶瀏覽器的相關信息, "Mozilla/5.0 (iPhone; CPU iPhone OS
5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A406"
算法模型: 并行算法
? PV(PageView): 頁面訪問量統計
– Map:
{key:$request,value:1}
– Reduce: {key:$request,value:求和(sum)}
? IP: 頁面獨立IP的訪問量統計
– Map: {key:$request,value:$remote_addr}
– Reduce: {key:$request,value:去重再求和(sum(unique))}
? 計算各地域訪問占的百分比的統計
第一步: – Map:
– Reduce:
第二步 :– Map:
– Reduce:
{key:$remote_addr,value:1}
{key:$remote_addr,value:求和(sum)“+”對應地區名}
{key:地區名,value:(sum)} ,同時統計總和
{key:地區名,value:比例}
程序開發: MapReduce開發流程
? 對”日志行”的解析
? Map凼數實現
? Reduce凼數實現
? 啟勱程序實現
//Hadoop_v4_04.pdf
//
氣象數據集
? 下載ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/
? 總大小大約72G
? 解壓及合幵:zcat *.gz > sample.txt
? 數據的意義
//
數據篩選程序
? 輸出結果如下圖所示,分別是時間和Mac地址
//
倒排索引
? 任務要求
– 現有一批電話通信清單,記錄了用戶A撥打用戶B的記錄
– 需要做一個倒排索引,記錄撥打給用戶B的所有用戶A