轉載自:http://lxw1234.com/archives/2016/11/779.htm
第一章:初識Hadoop
第二章:更高效的WordCount
第三章:把別處的數據搞到Hadoop上
第四章:把Hadoop上的數據搞到別處去
第五章:快一點吧,我的SQL
第六章:一夫多妻制
第七章:越來越多的分析任務
第八章:我的數據要實時
第九章:我的數據要對外
第十章:牛逼高大上的機器學習
經常有初學者在博客和QQ問我,自己想往大數據方向發展,該學哪些技術,學習路線是什么樣的,覺得大數據很火,就業很好,薪資很高。。。。。。。如果自己很迷茫,為了這些原因想往大數據方向發展,也可以,那么我就想問一下,你的專業是什么,對於計算機/軟件,你的興趣是什么?是計算機專業,對操作系統、硬件、網絡、服務器感興趣?是軟件專業,對軟件開發、編程、寫代碼感興趣?還是數學、統計學專業,對數據和數字特別感興趣。。
其實這就是想告訴你的大數據的三個發展方向,平台搭建/優化/運維/監控、大數據開發/設計/架構、數據分析/挖掘。請不要問我哪個容易,哪個前景好,哪個錢多。
先扯一下大數據的4V特征:
1. 數據量大,TB->PB
2. 數據類型繁多,結構化、非結構化文本、日志、視頻、圖片、地理位置等;
3. 商業價值高,但是這種價值需要在海量數據之上,通過數據分析與機器學習更快速的挖掘出來;
4. 處理時效性高,海量數據的處理需求不再局限在離線計算當中。
現如今,正式為了應對大數據的這幾個特點,開源的大數據框架越來越多,越來越強,先列舉一些常見的:
文件存儲:Hadoop HDFS、Tachyon、KFS
離線計算:Hadoop MapReduce、Spark
流式、實時計算:Storm、Spark Streaming、S4、Heron
K-V、NOSQL數據庫:HBase、Redis、MongoDB
資源管理:YARN、Mesos
日志收集:Flume、Scribe、Logstash、Kibana
消息系統:Kafka、StormMQ、ZeroMQ、RabbitMQ
查詢分析:Hive、Impala、Pig、Presto、Phoenix、SparkSQL、Drill、Flink、Kylin、Druid
分布式協調服務:Zookeeper
集群管理與監控:Ambari、Ganglia、Nagios、Cloudera Manager
數據挖掘、機器學習:Mahout、Spark MLLib
數據同步:Sqoop
任務調度:Oozie
……
眼花了吧,上面的有30多種吧,別說精通了,全部都會使用的,估計也沒幾個。
就我個人而言,主要經驗是在第二個方向(開發/設計/架構),且聽聽我的建議吧。
第一章:初識Hadoop
1.1 學會百度與Google
不論遇到什么問題,先試試搜索並自己解決。
Google首選,翻不過去的,就用百度吧。
1.2 參考資料首選官方文檔
特別是對於入門來說,官方文檔永遠是首選文檔。
相信搞這塊的大多是文化人,英文湊合就行,實在看不下去的,請參考第一步。
1.3 先讓Hadoop跑起來
Hadoop可以算是大數據存儲和計算的開山鼻祖,現在大多開源的大數據框架都依賴Hadoop或者與它能很好的兼容。
關於Hadoop,你至少需要搞清楚以下是什么:
1. Hadoop 1.0、Hadoop 2.0 (2.0多了YARN資源調度和HA高可用)
2. MapReduce、HDFS
3. NameNode、DataNode
4. JobTracker、TaskTracker
5. Yarn、ResourceManager、NodeManager
自己搭建Hadoop,請使用第一步和第二步,能讓它跑起來就行。
建議先使用安裝包命令行安裝,不要使用管理工具安裝。
另外:Hadoop1.0知道它就行了,現在都用Hadoop 2.0.
1.4 試試使用Hadoop
HDFS目錄操作命令;
上傳、下載文件命令;
提交運行MapReduce示例程序;
打開Hadoop WEB界面,查看Job運行狀態,查看Job運行日志。
知道Hadoop的系統日志在哪里。
1.5 你該了解它們的原理了
MapReduce:如何分而治之;
HDFS:數據到底在哪里,什么是副本;
Yarn到底是什么,它能干什么;
NameNode到底在干些什么;
ResourceManager到底在干些什么;
1.6 自己寫一個MapReduce程序
請仿照WordCount例子,自己寫一個(照抄也行)WordCount程序,
打包並提交到Hadoop運行。
你不會Java?Shell、Python都可以,有個東西叫Hadoop Streaming。
第二章:更高效的WordCount
2.1 學點SQL吧
你知道數據庫嗎?你會寫SQL嗎?
如果不會,請學點SQL吧。
2.2 SQL版WordCount
在1.6中,你寫(或者抄)的WordCount一共有幾行代碼?
給你看看我的:
SELECT word,COUNT(1) FROM wordcount GROUP BY word;
這便是SQL的魅力,編程需要幾十行,甚至上百行代碼,我這一句就搞定;使用SQL處理分析Hadoop上的數據,方便、高效、易上手、更是趨勢。不論是離線計算還是實時計算,越來越多的大數據處理框架都在積極提供SQL接口。
2.3 SQL On Hadoop之Hive
什么是Hive?官方給的解釋是:
The Apache Hive data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax.
為什么說Hive是數據倉庫工具,而不是數據庫工具呢?有的朋友可能不知道數據倉庫,數據倉庫是邏輯上的概念,底層使用的是數據庫,數據倉庫中的數據有這兩個特點:最全的歷史數據(海量)、相對穩定的;所謂相對穩定,指的是數據倉庫不同於業務系統數據庫,數據經常會被更新,數據一旦進入數據倉庫,很少會被更新和刪除,只會被大量查詢。而Hive,也是具備這兩個特點,因此,Hive適合做海量數據的數據倉庫工具,而不是數據庫工具。
2.4 安裝配置Hive
請參考1.1 和 1.2 完成Hive的安裝配置。可以正常進入Hive命令行。
2.5 試試使用Hive
請參考1.1 和 1.2 ,在Hive中創建wordcount表,並運行2.2中的SQL語句。
在Hadoop WEB界面中找到剛才運行的SQL任務。
看SQL查詢結果是否和1.4中MapReduce中的結果一致。
2.6 Hive是怎么工作的
明明寫的是SQL,為什么Hadoop WEB界面中看到的是MapReduce任務?
2.7 學會Hive的基本命令
創建、刪除表;
加載數據到表;
下載Hive表的數據;
請參考1.2,學習更多關於Hive的語法和命令。
如果你已經按照《寫給大數據開發初學者的話》中第一章和第二章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點:
1. 0和Hadoop2.0的區別;
2. MapReduce的原理(還是那個經典的題目,一個10G大小的文件,給定1G大小的內存,如何使用Java程序統計出現次數最多的10個單詞及次數);
3. HDFS讀寫數據的流程;向HDFS中PUT數據;從HDFS中下載數據;
4. 自己會寫簡單的MapReduce程序,運行出現問題,知道在哪里查看日志;
5. 會寫簡單的SELECT、WHERE、GROUP BY等SQL語句;
6. Hive SQL轉換成MapReduce的大致流程;
7. Hive中常見的語句:創建表、刪除表、往表中加載數據、分區、將表中數據下載到本地;
從上面的學習,你已經了解到,HDFS是Hadoop提供的分布式存儲框架,它可以用來存儲海量數據,MapReduce是Hadoop提供的分布式計算框架,它可以用來統計和分析HDFS上的海量數據,而Hive則是SQL On Hadoop,Hive提供了SQL接口,開發人員只需要編寫簡單易上手的SQL語句,Hive負責把SQL翻譯成MapReduce,提交運行。
此時,你的”大數據平台”是這樣的:
那么問題來了,海量數據如何到HDFS上呢?
第三章:把別處的數據搞到Hadoop上
此處也可以叫做數據采集,把各個數據源的數據采集到Hadoop上。
3.1 HDFS PUT命令
這個在前面你應該已經使用過了。
put命令在實際環境中也比較常用,通常配合shell、python等腳本語言來使用。
建議熟練掌握。
3.2 HDFS API
HDFS提供了寫數據的API,自己用編程語言將數據寫入HDFS,put命令本身也是使用API。
實際環境中一般自己較少編寫程序使用API來寫數據到HDFS,通常都是使用其他框架封裝好的方法。比如:Hive中的INSERT語句,Spark中的saveAsTextfile等。
建議了解原理,會寫Demo。
3.3 Sqoop
Sqoop是一個主要用於Hadoop/Hive與傳統關系型數據庫Oracle/MySQL/SQLServer等之間進行數據交換的開源框架。
就像Hive把SQL翻譯成MapReduce一樣,Sqoop把你指定的參數翻譯成MapReduce,提交到Hadoop運行,完成Hadoop與其他數據庫之間的數據交換。
自己下載和配置Sqoop(建議先使用Sqoop1,Sqoop2比較復雜)。
了解Sqoop常用的配置參數和方法。
使用Sqoop完成從MySQL同步數據到HDFS;
使用Sqoop完成從MySQL同步數據到Hive表;
PS:如果后續選型確定使用Sqoop作為數據交換工具,那么建議熟練掌握,否則,了解和會用Demo即可。
3.4 Flume
Flume是一個分布式的海量日志采集和傳輸框架,因為“采集和傳輸框架”,所以它並不適合關系型數據庫的數據采集和傳輸。
Flume可以實時的從網絡協議、消息系統、文件系統采集日志,並傳輸到HDFS上。
因此,如果你的業務有這些數據源的數據,並且需要實時的采集,那么就應該考慮使用Flume。
下載和配置Flume。
使用Flume監控一個不斷追加數據的文件,並將數據傳輸到HDFS;
PS:Flume的配置和使用較為復雜,如果你沒有足夠的興趣和耐心,可以先跳過Flume。
3.5 阿里開源的DataX
之所以介紹這個,是因為我們公司目前使用的Hadoop與關系型數據庫數據交換的工具,就是之前基於DataX開發的,非常好用。
可以參考我的博文《異構數據源海量數據交換工具-Taobao DataX 下載和使用》。
現在DataX已經是3.0版本,支持很多數據源。
你也可以在其之上做二次開發。
PS:有興趣的可以研究和使用一下,對比一下它與Sqoop。
如果你認真完成了上面的學習和實踐,此時,你的”大數據平台”應該是這樣的:
第四章:把Hadoop上的數據搞到別處去
前面介紹了如何把數據源的數據采集到Hadoop上,數據到Hadoop上之后,便可以使用Hive和MapReduce進行分析了。那么接下來的問題是,分析完的結果如何從Hadoop上同步到其他系統和應用中去呢?
其實,此處的方法和第三章基本一致的。
4.1 HDFS GET命令
把HDFS上的文件GET到本地。需要熟練掌握。
4.2 HDFS API
同3.2.
4.3 Sqoop
同3.3.
使用Sqoop完成將HDFS上的文件同步到MySQL;
使用Sqoop完成將Hive表中的數據同步到MySQL;
4.4 DataX
同3.5.
如果你認真完成了上面的學習和實踐,此時,你的”大數據平台”應該是這樣的:
如果你已經按照《寫給大數據開發初學者的話2》中第三章和第四章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點:
1. 知道如何把已有的數據采集到HDFS上,包括離線采集和實時采集;
2. 你已經知道sqoop(或者還有DataX)是HDFS和其他數據源之間的數據交換工具;
3. 你已經知道flume可以用作實時的日志采集;
從前面的學習,對於大數據平台,你已經掌握的不少的知識和技能,搭建Hadoop集群,
把數據采集到Hadoop上,使用Hive和MapReduce來分析數據,把分析結果同步到其他數據源。
接下來的問題來了,Hive使用的越來越多,你會發現很多不爽的地方,特別是速度慢,
大多情況下,明明我的數據量很小,它都要申請資源,啟動MapReduce來執行。
第五章:快一點吧,我的SQL
其實大家都已經發現Hive后台使用MapReduce作為執行引擎,實在是有點慢。
因此SQL On Hadoop的框架越來越多,按我的了解,最常用的按照流行度依次為SparkSQL、Impala和Presto.
這三種框架基於半內存或者全內存,提供了SQL接口來快速查詢分析Hadoop上的數據。關於三者的比較,請參考1.1.
我們目前使用的是SparkSQL,至於為什么用SparkSQL,原因大概有以下吧:
1. 使用Spark還做了其他事情,不想引入過多的框架;
2. Impala對內存的需求太大,沒有過多資源部署;
5.1 關於Spark和SparkSQL
什么是Spark,什么是SparkSQL。
Spark有的核心概念及名詞解釋。
SparkSQL和Spark是什么關系,SparkSQL和Hive是什么關系。
SparkSQL為什么比Hive跑的快。
5.2 如何部署和運行SparkSQL
Spark有哪些部署模式?
如何在Yarn上運行SparkSQL?
使用SparkSQL查詢Hive中的表。
PS: Spark不是一門短時間內就能掌握的技術,因此建議在了解了Spark之后,可以先從SparkSQL入手,循序漸進。
關於Spark和SparkSQL,可參考 http://lxw1234.com/archives/category/spark
如果你認真完成了上面的學習和實踐,此時,你的”大數據平台”應該是這樣的:
第六章:一夫多妻制(Kafka)
請不要被這個名字所誘惑。其實我想說的是數據的一次采集、多次消費。
在實際業務場景下,特別是對於一些監控日志,想即時的從日志中了解一些指標(關於實時計算,后面章節會有介紹),這時候,從HDFS上分析就太慢了,盡管是通過Flume采集的,但Flume也不能間隔很短就往HDFS上滾動文件,這樣會導致小文件特別多。
為了滿足數據的一次采集、多次消費的需求,這里要說的便是Kafka。
6.1 關於Kafka
什么是Kafka?
Kafka的核心概念及名詞解釋。
6.2 如何部署和使用Kafka
使用單機部署Kafka,並成功運行自帶的生產者和消費者例子。
使用Java程序自己編寫並運行生產者和消費者程序。
Flume和Kafka的集成,使用Flume監控日志,並將日志數據實時發送至Kafka。
關於Kafka,可以參考 http://lxw1234.com/archives/category/kafka
如果你認真完成了上面的學習和實踐,此時,你的”大數據平台”應該是這樣的:
這時,使用Flume采集的數據,不是直接到HDFS上,而是先到Kafka,Kafka中的數據可以由多個消費者同時消費,其中一個消費者,就是將數據同步到HDFS。
如果你已經按照《寫給大數據開發初學者的話3》中第五章和第六章的流程認真完整的走了一遍,那么你應該已經具備以下技能和知識點:
1. 為什么Spark比MapReduce快。
2. 使用SparkSQL代替Hive,更快的運行SQL。
3. 使用Kafka完成數據的一次收集,多次消費架構。
4. 自己可以寫程序完成Kafka的生產者和消費者。
從前面的學習,你已經掌握了大數據平台中的數據采集、數據存儲和計算、數據交換等大部分技能,而這其中的每一步,都需要一個任務(程序)來完成,各個任務之間又存在一定的依賴性,比如,必須等數據采集任務成功完成后,數據計算任務才能開始運行。如果一個任務執行失敗,需要給開發運維人員發送告警,同時需要提供完整的日志來方便查錯。
第七章:越來越多的分析任務
不僅僅是分析任務,數據采集、數據交換同樣是一個個的任務。這些任務中,有的是定時觸發,有點則需要依賴其他任務來觸發。當平台中有幾百上千個任務需要維護和運行時候,僅僅靠crontab遠遠不夠了,這時便需要一個調度監控系統來完成這件事。調度監控系統是整個數據平台的中樞系統,類似於AppMaster,負責分配和監控任務。
7.1 Apache Oozie
1. Oozie是什么?有哪些功能?
2. Oozie可以調度哪些類型的任務(程序)?
3. Oozie可以支持哪些任務觸發方式?
4. 安裝配置Oozie。
7.2 其他開源的任務調度系統
Azkaban:
https://azkaban.github.io/
light-task-scheduler:
https://github.com/ltsopensource/light-task-scheduler
Zeus:
https://github.com/alibaba/zeus
等等……
另外,我這邊是之前單獨開發的任務調度與監控系統,具體請參考《大數據平台任務調度與監控系統》.
如果你認真完成了上面的學習和實踐,此時,你的”大數據平台”應該是這樣的:
第八章:我的數據要實時
在第六章介紹Kafka的時候提到了一些需要實時指標的業務場景,實時基本可以分為絕對實時和准實時,絕對實時的延遲要求一般在毫秒級,准實時的延遲要求一般在秒、分鍾級。對於需要絕對實時的業務場景,用的比較多的是Storm,對於其他准實時的業務場景,可以是Storm,也可以是Spark Streaming。當然,如果可以的話,也可以自己寫程序來做。
8.1 Storm
1. 什么是Storm?有哪些可能的應用場景?
2. Storm由哪些核心組件構成,各自擔任什么角色?
3. Storm的簡單安裝和部署。
4. 自己編寫Demo程序,使用Storm完成實時數據流計算。
8.2 Spark Streaming
1. 什么是Spark Streaming,它和Spark是什么關系?
2. Spark Streaming和Storm比較,各有什么優缺點?
3. 使用Kafka + Spark Streaming,完成實時計算的Demo程序。
如果你認真完成了上面的學習和實踐,此時,你的”大數據平台”應該是這樣的:
至此,你的大數據平台底層架構已經成型了,其中包括了數據采集、數據存儲與計算(離線和實時)、數據同步、任務調度與監控這幾大模塊。接下來是時候考慮如何更好的對外提供數據了。
第九章:我的數據要對外
通常對外(業務)提供數據訪問,大體上包含以下方面:
1. 離線:比如,每天將前一天的數據提供到指定的數據源(DB、FILE、FTP)等;
離線數據的提供可以采用Sqoop、DataX等離線數據交換工具。
1. 實時:比如,在線網站的推薦系統,需要實時從數據平台中獲取給用戶的推薦數據,這種要求延時非常低(50毫秒以內)。
根據延時要求和實時數據的查詢需要,可能的方案有:HBase、Redis、MongoDB、ElasticSearch等。
1. OLAP分析:OLAP除了要求底層的數據模型比較規范,另外,對查詢的響應速度要求也越來越高,可能的方案有:Impala、Presto、SparkSQL、Kylin。如果你的數據模型比較規模,那么Kylin是最好的選擇。
2. 即席查詢:即席查詢的數據比較隨意,一般很難建立通用的數據模型,因此可能的方案有:Impala、Presto、SparkSQL。
這么多比較成熟的框架和方案,需要結合自己的業務需求及數據平台技術架構,選擇合適的。原則只有一個:越簡單越穩定的,就是最好的。
如果你已經掌握了如何很好的對外(業務)提供數據,那么你的“大數據平台”應該是這樣的:
第十章:牛逼高大上的機器學習
機器學習十大算法:
https://blog.csdn.net/zw0pi8g5c1x/article/details/80768132
一、監督學習(基於輸入數據及目標值訓練預測模型)
(一)分類
(二)回歸
二、無監督學習(根據輸入數據對數據進行分組)
聚類
1.決策樹(Decision Trees)
2.朴素貝葉斯分類(Naive Bayesian classification)
3.最小二乘法(Ordinary Least Squares Regression)
4.邏輯回歸(Logistic Regression)
5.支持向量機(Support Vector Machine,SVM)
6.集成方法(Ensemble methods)
7.聚類算法(Clustering Algorithms)
8.主成分分析(Principal Component Analysis,PCA)
9.奇異值分解(Singular Value Decomposition,SVD)
10.獨立成分分析(Independent Component Analysis,ICA)
詳細參照
https://blog.csdn.net/sinat_23338865/article/details/81805538
關於這塊,我這個門外漢也只能是簡單介紹一下了。數學專業畢業的我非常慚愧,很后悔當時沒有好好學數學。
在我們的業務中,遇到的能用機器學習解決的問題大概這么三類:
1. 分類問題:包括二分類和多分類,二分類就是解決了預測的問題,就像預測一封郵件是否垃圾郵件;多分類解決的是文本的分類;
2. 聚類問題:從用戶搜索過的關鍵詞,對用戶進行大概的歸類。
3. 推薦問題:根據用戶的歷史瀏覽和點擊行為進行相關推薦。
大多數行業,使用機器學習解決的,也就是這幾類問題。
入門學習線路:
1. 數學基礎;
2. 機器學習實戰(Machine Learning in Action),懂Python最好;
3. SparkMlLib提供了一些封裝好的算法,以及特征處理、特征選擇的方法。
機器學習確實牛逼高大上,也是我學習的目標。
那么,可以把機器學習部分也加進你的“大數據平台”了。