大數據學習路線

 很多人都知道大數據很火,就業很好,薪資很高,想往大數據方向發展。但該學哪些技術,學習路線是什麼樣的呢?如果你對此很迷茫,那麼下面就分享下如何進行系統的學習。

    現在大數據有三個發展方向:

  •  平臺搭建/優化/運維/監控
  • 大數據開發/設計/架構
  • 數據分析/挖掘

next

0.前言

先說一下大數據的4V特徵:

  • 數據量大,TB->PB
  • 數據類型繁多,結構化、非結構化文本、日誌、視頻、圖片、地理位置等;
  • 商業價值高,但是這種價值需要在海量數據之上,通過數據分析與機器學習更快速的挖掘出來;
  • 處理時效性高,海量數據的處理需求不再侷限在離線計算當中。

現如今,正式爲了應對大數據的這幾個特點,開源的大數據框架越來越多,越來越強,再列舉一些常見的:

文件存儲: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多種吧,別說精通了,全部都會使用的,估計也沒幾個。那下面將圍繞着第二個方向(開發/設計/架構),因爲這個方向容易找工作,下面給大傢俱體講解一下。

1.初識Hadoop

1.1 參考資料首選官方文檔
1.2 先讓Hadoop跑起來
  Hadoop可以算是大數據存儲和計算的開山鼻祖,現在大多開源的大數據框架都依賴Hadoop或者與它能很好的兼容。
  關於Hadoop,你至少需要搞清楚以下是什麼:
  Hadoop 1.0、Hadoop 2.0
  MapReduce、HDFS
  NameNode、DataNode
  JobTracker、TaskTracker
  Yarn、ResourceManager、NodeManager
  自己搭建Hadoop,請使用第一步和第二步,能讓它跑起來就行。
  建議先使用安裝包命令行安裝,不要使用管理工具安裝。
  另外:Hadoop1.0知道它就行了,現在都用Hadoop 2.0.
1.3 試試使用Hadoop
  HDFS目錄操作命令;
  上傳、下載文件命令;
  提交運行MapReduce示例程序;
  打開Hadoop WEB界面,查看Job運行狀態,查看Job運行日誌。
  知道Hadoop的系統日誌在哪裏。
1.4 你該瞭解它們的原理了
  MapReduce:如何分而治之;
  HDFS:數據到底在哪裏,什麼是副本;
  Yarn到底是什麼,它能幹什麼;
  NameNode到底在幹些什麼;
  ResourceManager到底在幹些什麼;
1.5 自己寫一個MapReduce程序
  請仿照WordCount例子,自己寫一個(照抄也行)WordCount程序,
  打包並提交到Hadoop運行。
  你不會Java?Shell、Python都可以,有個東西叫Hadoop Streaming。
  如果你認真完成了以上幾步,恭喜你,你的一隻腳已經進來了。

2.SQL On Hadoop之Hive

2.1 什麼數據倉庫工具
  什麼是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.2 安裝配置Hive
  請參考Hive的安裝配置。可以正常進入Hive命令行。
2.3 試試使用Hive
  在Hive中創建wordcount表,並運行2.2中的SQL語句。
  在Hadoop WEB界面中找到剛纔運行的SQL任務。
  看SQL查詢結果是否和1.4中MapReduce中的結果一致。
2.4 Hive是怎麼工作的
  明明寫的是SQL,爲什麼Hadoop WEB界面中看到的是MapReduce任務?
2.5 學會Hive的基本命令
  創建、刪除表;
  加載數據到表;
  下載Hive表的數據;
  請參考api,學習更多關於Hive的語法和命令。
  1.0和Hadoop2.0的區別;
  MapReduce的原理(還是那個經典的題目,一個10G大小的文件,給定1G大小的內存,如何使用Java程序統計出現次數最多的10個單詞及次數);
  HDFS讀寫數據的流程;向HDFS中PUT數據;從HDFS中下載數據;
  自己會寫簡單的MapReduce程序,運行出現問題,知道在哪裏查看日誌;
  會寫簡單的SELECT、WHERE、GROUP BY等SQL語句;
  Hive SQL轉換成MapReduce的大致流程;
  Hive中常見的語句:創建表、刪除表、往表中加載數據、分區、將表中數據下載到本地;
  從上面的學習,你已經瞭解到,HDFS是Hadoop提供的分佈式存儲框架,它可以用來存儲海量數據,MapReduce是Hadoop提供的分佈式計算框架,它可以用來統計和分析HDFS上的海量數據,而Hive則是SQL On Hadoop,Hive提供了SQL接口,開發人員只需要編寫簡單易上手的SQL語句,Hive負責把SQL翻譯成MapReduce,提交運行。
  那麼問題來了,海量數據如何到HDFS上呢?

3.數據採集到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開發的,非常好用。
  現在DataX已經是3.0版本,支持很多數據源。
  你也可以在其之上做二次開發。
  PS:有興趣的可以研究和使用一下,對比一下它與Sqoop。

4.Hadoop結果集提取

前面介紹瞭如何把數據源的數據採集到Hadoop上,數據到Hadoop上之後,便可以使用Hive和MapReduce進行分析了。那麼接下來的問題是,分析完的結果如何從Hadoop上同步到其他系統和應用中去呢?
  其實,此處的方法和第三章基本一致的。
4.1 HDFS GET命令
  把HDFS上的文件GET到本地。需要熟練掌握。
4.2 HDFS API
4.3 Sqoop
  同3.3.
  使用Sqoop完成將HDFS上的文件同步到MySQL;
  使用Sqoop完成將Hive表中的數據同步到MySQL;
4.4 DataX
  同3.5.
  你應該已經具備以下技能和知識點:
  知道如何把已有的數據採集到HDFS上,包括離線採集和實時採集;
  你已經知道sqoop(或者還有DataX)是HDFS和其他數據源之間的數據交換工具;
  你已經知道flume可以用作實時的日誌採集。
  從前面的學習,對於大數據平臺,你已經掌握的不少的知識和技能,搭建Hadoop集羣,把數據採集到Hadoop上,使用Hive和MapReduce來分析數據,把分析結果同步到其他數據源。
  接下來的問題來了,Hive使用的越來越多,你會發現很多不爽的地方,特別是速度慢,大多情況下,明明我的數據量很小,它都要申請資源,啓動MapReduce來執行。

5.更快的SQL

其實大家都已經發現Hive後臺使用MapReduce作爲執行引擎,實在是有點慢。
因此SQL On Hadoop的框架越來越多,按我的瞭解,最常用的按照流行度依次爲SparkSQL、Impala和Presto.
這三種框架基於半內存或者全內存,提供了SQL接口來快速查詢分析Hadoop上的數據。關於三者的比較,請參考1.1.
我們目前使用的是SparkSQL,至於爲什麼用SparkSQL,原因大概有以下吧:
       使用Spark還做了其他事情,不想引入過多的框架;
  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入手,循序漸進。

6.一次採集多次消費

       其實我想說的是數據的一次採集、多次消費。在實際業務場景下,特別是對於一些監控日誌,想即時的從日誌中瞭解一些指標(關於實時計算,後面章節會有介紹),這時候,從HDFS上分析就太慢了,儘管是通過Flume採集的,但Flume也不能間隔很短就往HDFS上滾動文件,這樣會導致小文件特別多。爲了滿足數據的一次採集、多次消費的需求,這裏要說的便是Kafka。
    6.1 關於Kafka
       什麼是Kafka?
  Kafka的核心概念及名詞解釋。
    6.2 如何部署和使用Kafka
  使用單機部署Kafka,併成功運行自帶的生產者和消費者例子。
  使用Java程序自己編寫並運行生產者和消費者程序。
  Flume和Kafka的集成,使用Flume監控日誌,並將日誌數據實時發送至Kafka。
  這時,使用Flume採集的數據,不是直接到HDFS上,而是先到Kafka,Kafka中的數據可以由多個消費者同時消費,其中一個消費者,就是將數據同步到HDFS。
  你應該已經具備以下技能和知識點:
  爲什麼Spark比MapReduce快。
  使用SparkSQL代替Hive,更快的運行SQL。
  使用Kafka完成數據的一次收集,多次消費架構。
  自己可以寫程序完成Kafka的生產者和消費者。
  從前面的學習,你已經掌握了大數據平臺中的數據採集、數據存儲和計算、數據交換等大部分技能,而這其中的每一步,都需要一個任務(程序)來完成,各個任務之間又存在一定的依賴性,比如,必須等數據採集任務成功完成後,數據計算任務才能開始運行。如果一個任務執行失敗,需要給開發運維人員發送告警,同時需要提供完整的日誌來方便查錯。

7.任務調度系統

    不僅僅是分析任務,數據採集、數據交換同樣是一個個的任務。這些任務中,有的是定時觸發,有點則需要依賴其他任務來觸發。當平臺中有幾百上千個任務需要維護和運行時候,僅僅靠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
  等等……

8.實時計算

    在第六章介紹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程序。
  至此,你的大數據平臺底層架構已經成型了,其中包括了數據採集、數據存儲與計算(離線和實時)、數據同步、任務調度與監控這幾大模塊。接下來是時候考慮如何更好的對外提供數據了。

9.數據要對外

    通常對外(業務)提供數據訪問,大體上包含以下方面:

  •  離線:比如,每天將前一天的數據提供到指定的數據源(DB、FILE、FTP)等;離線數據的提供可以採用Sqoop、DataX等離線數據交換工具。
  • 實時:比如,在線網站的推薦系統,需要實時從數據平臺中獲取給用戶的推薦數據,這種要求延時非常低(50毫秒以內)。根據延時要求和實時數據的查詢需要,可能的方案有:HBase、Redis、MongoDB、ElasticSearch等。
  • OLAP分析:OLAP除了要求底層的數據模型比較規範,另外,對查詢的響應速度要求也越來越高,可能的方案有:Impala、Presto、SparkSQL、Kylin。如果你的數據模型比較規模,那麼Kylin是最好的選擇。
  • 即席查詢:即席查詢的數據比較隨意,一般很難建立通用的數據模型,因此可能的方案有:Impala、Presto、SparkSQL。

 這麼多比較成熟的框架和方案,需要結合自己的業務需求及數據平臺技術架構,選擇合適的。原則只有一個:越簡單越穩定的,就是最好的。

10.高逼格的機器學習

    這一塊簡單介紹一下吧,在我們的業務中,遇到的能用機器學習解決的問題大概這麼三類:

  • 分類問題:包括二分類和多分類,二分類就是解決了預測的問題,就像預測一封郵件是否垃圾郵件;多分類解決的是文本的分類;
  • 聚類問題:從用戶搜索過的關鍵詞,對用戶進行大概的歸類;
  • 推薦問題:根據用戶的歷史瀏覽和點擊行爲進行相關推薦;

 大多數行業,使用機器學習解決的,也就是這幾類問題。
 入門學習線路:
 數學基礎;
 機器學習實戰(Machine Learning in Action),懂Python最好;
 SparkMlLib提供了一些封裝好的算法,以及特徵處理、特徵選擇的方法。當然,你如果想更快掌握大數據,可以瞭解大講臺主推的大數據培訓相關課程,不會讓你失望的。

發佈了29 篇原創文章 · 獲贊 21 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章