1. 程式人生 > 其它 >大資料開發具備知識

大資料開發具備知識

一,題記

要說當下IT行業什麼最火?ABC無出其右。所謂ABC者,AI + Big Data + Cloud也,即人工智慧、大資料和雲端計算(雲平臺)。每個領域目前都有行業領袖在引領前行,今天我們來討論下大資料Big Data這個方向。

二,大資料裡面的角色

角色一:大資料工程

大資料工程需要解決資料的定義、收集、計算與儲存的工作,因此大資料工程師們在設計和部署這樣的系統時首要考慮的是資料高可用的問題,即大資料工程系統需要實時地為下游業務系統或分析系統提供資料服務;

角色二:大資料分析

大資料分析角色定位於如何利用資料——即從大資料工程系統中接收到資料之後如何為企業或組織提供有產出的資料分析,並且確實能夠幫助到公司進行業務改善或提升服務水平,所以對於大資料分析師來說,他們首要解決的問題是發現並利用資料的價值,具體可能包括:趨勢分析、模型建立以及預測分析等。

這兩類角色相互依存但又獨立運作,何意?沒有大資料工程,大資料分析便無從談起;但倘若沒有大資料分析,我也實在想不出大資料工程存在的理由。這就類似於結婚和談戀愛——戀愛的目的是為了結婚,且不以結婚為目的的談戀愛都是耍流氓。

簡單總結一下,大資料工程角色需要考慮資料的收集、計算(或是處理)和儲存;大資料分析角色則是執行資料的高階計算。如果你對大資料開發感興趣,想系統學習大資料的話,可以戳我加入大資料技術學習交流群,私信管理員即可免費領取開發工具以及入門學習資料

三,大資料工程師

針對角色一:大資料工程說,對應的工作崗位就叫大資料工程師,對於大資料工程師而言,您至少要掌握以下技能:

linux基礎

因為大資料體系,基本都是開源軟體,這些開源軟體都是在開源的linux系統上執行的,所以你必須會基本的linux操作,比如使用者管理,許可權,shell程式設計之類的

一門JVM系語言:

當前大資料生態JVM系語言類的比重極大,某種程度上說是壟斷也不為過。這裡我推薦大家學習Java或Scala,至於Clojure這樣的語言上手不易,其實並不推薦大家使用。另外,如今是“母以子貴”的年代,某個大資料框架會帶火它的程式語言的流行,比如Docker之於Go、Kafka之於Scala。

因此筆者這裡建議您至少要精通一門JVM系的語言。值得一提的,一定要弄懂這門語言的多執行緒模型和記憶體模型,很多大資料框架的處理模式其實在語言層面和多執行緒處理模型是類似的,只是大資料框架把它們引申到了多機分散式這個層面。

筆者建議:學習Java或Scala

計算處理框架:

嚴格來說,這分為離線批處理和流式處理。流式處理是未來的趨勢,建議大家一定要去學習;而離線批處理其實已經快過時了,它的分批處理思想無法處理無窮資料集,因此其適用範圍日益縮小。事實上,Google已經在公司內部正式廢棄了以MapReduce為代表的離線處理。

因此如果要學習大資料工程,掌握一門實時流式處理框架是必須的。當下主流的框架包括:Apache Samza, Apache Storm, Apache Spark Streaming以及最近一年風頭正勁的Apache Flink。當然Apache Kafka也推出了它自己的流式處理框架:Kafka Streams

筆者建議:學習Flink、Spark Streaming或Kafka Streams中的一個

熟讀Google大神的這篇文章:《The world beyond batch: Streaming 101》,地址是https://www.oreilly.com/ideas/th ... batch-streaming-101

分散式儲存框架:

雖說MapReduce有些過時了,但Hadoop的另一個基石HDFS依然堅挺,並且是開源社群最受歡迎的分散式儲存,絕對您花時間去學習。如果想深入研究的話,Google的GFS論文也是一定要讀的([url=]https://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf[/url])。當然開源世界中還有很多的分散式儲存,國內阿里巴巴的OceanBase也是很優秀的一個。

筆者建議:學習HDFS

資源排程框架:

Docker可是整整火了最近一兩年。各個公司都在發力基於Docker的容器解決方案,最有名的開源容器排程框架就是K8S了,但同樣著名的還有Hadoop的YARN和Apache Mesos。後兩者不僅可以排程容器叢集,還可以排程非容器叢集,非常值得我們學習。

筆者建議:學習YARN

分散式協調框架:

有一些通用的功能在所有主流大資料分散式框架中都需要實現,比如服務發現、領導者選舉、分散式鎖、KV儲存等。這些功能也就催生了分散式協調框架的發展。最古老也是最有名的當屬Apache Zookeeper了,新一些的包括Consul,etcd等。學習大資料工程,分散式協調框架是不能不瞭解的, 某種程度上還要深入瞭解。

筆者建議:學習Zookeeper——太多大資料框架都需要它了,比如Kafka, Storm, HBase等

KV資料庫:

典型的就是memcache和Redis了,特別是Redis簡直是發展神速。其簡潔的API設計和高效能的TPS日益得到廣大使用者的青睞。即使是不學習大資料,學學Redis都是大有裨益的。

筆者建議:學習Redis,如果C語言功底好的,最好熟讀原始碼,反正原始碼也不多

列式儲存資料庫:

筆者曾經花了很長的時間學習Oracle,但不得不承認當下關係型資料庫已經慢慢地淡出了人們的視野,有太多的方案可以替代rdbms了。人們針對行式儲存不適用於大資料ad-hoc查詢這種弊端開發出了列式儲存,典型的列式儲存資料庫就是開源社群的HBASE。實際上列式儲存的概念也是出自Google的一篇論文:Google BigTable,有興趣的話大家最好讀一下:[url=]https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf[/url]

筆者建議:學習HBASE,這是目前應用最廣泛的開源列式儲存

訊息佇列:

大資料工程處理中訊息佇列作為“削峰填谷”的主力系統是必不可少的,當前該領域內的解決方案有很多,包括ActiveMQ,Kafka等。國內阿里也開源了RocketMQ。這其中的翹楚當屬Apache Kafka了。Kafka的很多設計思想都特別契合分佈流式資料處理的設計理念。這也難怪,Kafka的原作者Jay Kreps可是當今實時流式處理方面的頂級大神。

筆者建議:學習Kafka,不僅僅好找工作(幾乎所有大資料招聘簡歷都要求會Kafka:-) ),還能觸類旁通進一步理解基於備份日誌方式的資料處理範型

四,大資料分析師Or資料科學家

針對角色二:大資料分析,對應的工作崗位就叫大資料分析師或者資料科學家,作為資料科學家的我們必須要掌握以下技能:

數學功底:

微積分是嚴格要掌握的。不一定要掌握多元微積分,但一元微積分是必須要熟練掌握並使用的。另外線性代數一定要精通,特別是矩陣的運算、向量空間、秩等概念。當前機器學習框架中很多計算都需要用到矩陣的乘法、轉置或是求逆。雖然很多框架都直接提供了這樣的工具,但我們至少要了解內部的原型原理,比如如何高效判斷一個矩陣是否存在逆矩陣並如何計算等。

重溫同濟版《高等數學》,有條件可以去Coursea學習賓夕法尼亞大學的微積分課程

推薦學習Strang的線性代數:《Introduction to Linear Algebra》——這是最經典的教材,沒有之一!

數理統計:

概率論和各種統計學方法要做到基本掌握,比如貝葉斯概率如何計算?概率分佈是怎麼回事?雖不要求精通,但對相關背景和術語一定要了解

找一本《概率論》重新學習下

互動式資料分析框架:

這裡並不是指SQL或資料庫查詢,而是像Apache Hive或Apache Kylin這樣的分析互動框架。開源社群中有很多這樣類似的框架,可以使用傳統的資料分析方式對大資料進行資料分析或資料探勘。

筆者有過使用經驗的是Hive和Kylin。不過Hive特別是Hive1是基於MapReduce的,效能並非特別出色,而Kylin採用資料立方體的概念結合星型模型,可以做到很低延時的分析速度,況且Kylin是第一個研發團隊主力是中國人的Apache孵化專案,因此日益受到廣泛的關注。

首先學習Hive,有時間的話瞭解一下Kylin以及背後的資料探勘思想。

機器學習框架:

機器學習當前真是火爆宇宙了,人人都提機器學習和AI,但筆者一直認為機器學習恰似幾年前的雲端計算一樣,目前雖然火爆,但沒有實際的落地專案,可能還需要幾年的時間才能逐漸成熟。

不過在現在就開始儲備機器學習的知識總是沒有壞處的。說到機器學習的框架,大家耳熟能詳的有很多種, 信手拈來的就包括TensorFlow、Caffe8、Keras9、CNTK10、Torch711等,其中又以TensorFlow領銜。

筆者當前建議大家選取其中的一個框架進行學習,但以我對這些框架的瞭解,這些框架大多很方便地封裝了各種機器學習演算法提供給使用者使用,但對於底層演算法的瞭解其實並沒有太多可學習之處。因此筆者還是建議可以從機器學習演算法的原理來進行學習,比如:

目前機器學習領域最NB的入門課程:吳恩達博士的Machine Learning

五,大資料必備技能詳細

因為筆者本身是偏Java應用方向的,所以整理的大資料必備技能詳細,也是偏向於大資料工程師方向。總共分為五大部分,分別是:

大資料技術基礎
離線計算Hadoop
流式計算Storm
記憶體計算Spark
機器學習演算法
大資料技術基礎

linux操作基礎

linux系統簡介與安裝
linux常用命令–檔案操作
linux常用命令–使用者管理與許可權
linux常用命令–系統管理
linux常用命令–免密登陸配置與網路管理
linux上常用軟體安裝
linux本地yum源配置及yum軟體安裝
linux防火牆配置
linux高階文字處理命令cut、sed、awk
linux定時任務crontab
shell程式設計

shell程式設計–基本語法
shell程式設計–流程控制
shell程式設計–函式
shell程式設計–綜合案例–自動化部署指令碼
記憶體資料庫redis

redis和nosql簡介
redis客戶端連線
redis的string型別資料結構操作及應用-物件快取
redis的list型別資料結構操作及應用案例-任務排程佇列
redis的hash及set資料結構操作及應用案例-購物車
redis的sortedset資料結構操作及應用案例-排行榜
布式協調服務zookeeper

zookeeper簡介及應用場景
zookeeper叢集安裝部署
zookeeper的資料節點與命令列操作
zookeeper的java客戶端基本操作及事件監聽
zookeeper核心機制及資料節點
zookeeper應用案例–分散式共享資源鎖
zookeeper應用案例–伺服器上下線動態感知
zookeeper的資料一致性原理及leader選舉機制
java高階特性增強

Java多執行緒基本知識
Java同步關鍵詞詳解
java併發包執行緒池及在開源軟體中的應用
Java併發包訊息隊裡及在開源軟體中的應用
Java JMS技術
Java動態代理反射
輕量級RPC框架開發

RPC原理學習
Nio原理學習
Netty常用API學習
輕量級RPC框架需求分析及原理分析
輕量級RPC框架開發
離線計算Hadoop

hadoop快速入門

hadoop背景介紹
分散式系統概述
離線資料分析流程介紹
叢集搭建
叢集使用初步
HDFS增強

HDFS的概念和特性
HDFS的shell(命令列客戶端)操作
HDFS的工作機制
NAMENODE的工作機制
java的api操作
案例1:開發shell採集指令碼
MAPREDUCE詳解

自定義hadoop的RPC框架
Mapreduce程式設計規範及示例編寫
Mapreduce程式執行模式及debug方法
mapreduce程式執行模式的內在機理
mapreduce運算框架的主體工作流程
自定義物件的序列化方法
MapReduce程式設計案例
MAPREDUCE增強

Mapreduce排序
自定義partitioner
Mapreduce的combiner
mapreduce工作機制詳解
MAPREDUCE實戰

maptask並行度機制-檔案切片
maptask並行度設定
倒排索引
共同好友
federation介紹和hive使用

Hadoop的HA機制
HA叢集的安裝部署
叢集運維測試之Datanode動態上下線
叢集運維測試之Namenode狀態切換管理
叢集運維測試之資料塊的balance
HA下HDFS-API變化
hive簡介
hive架構
hive安裝部署
hvie初使用
hive增強和flume介紹

HQL-DDL基本語法
HQL-DML基本語法
HIVE的join
HIVE 引數配置
HIVE 自定義函式和Transform
HIVE 執行HQL的例項分析
HIVE最佳實踐注意點
HIVE優化策略
HIVE實戰案例
Flume介紹
Flume的安裝部署
案例:採集目錄到HDFS
案例:採集檔案到HDFS
流式計算Storm

Storm從入門到精通

Storm是什麼
Storm架構分析
Storm架構分析
Storm程式設計模型、Tuple原始碼、併發度分析
Storm WordCount案例及常用Api分析
Storm叢集部署實戰
Storm+Kafka+Redis業務指標計算
Storm原始碼下載編譯
Strom叢集啟動及原始碼分析
Storm任務提交及原始碼分析
Storm資料傳送流程分析
Storm通訊機制分析
Storm訊息容錯機制及原始碼分析
Storm多stream專案分析
編寫自己的流式任務執行框架
Storm上下游及架構整合

訊息佇列是什麼
Kakfa核心元件
Kafka叢集部署實戰及常用命令
Kafka配置檔案梳理
Kakfa JavaApi學習
Kafka檔案儲存機制分析
Redis基礎及單機環境部署
Redis資料結構及典型案例
Flume快速入門
Flume+Kafka+Storm+Redis整合
記憶體計算Spark

scala程式設計

scala程式設計介紹
scala相關軟體安裝
scala基礎語法
scala方法和函式
scala函數語言程式設計特點
scala陣列和集合
scala程式設計練習(單機版WordCount)
scala面向物件
scala模式匹配
actor程式設計介紹
option和偏函式
實戰:actor的併發WordCount
柯里化
隱式轉換
AKKA與RPC

Akka併發程式設計框架
實戰:RPC程式設計實戰
Spark快速入門

spark介紹
spark環境搭建
RDD簡介
RDD的轉換和動作
實戰:RDD綜合練習
RDD高階運算元
自定義Partitioner
實戰:網站訪問次數
廣播變數
實戰:根據IP計算歸屬地
自定義排序
利用JDBC RDD實現資料匯入匯出
WorldCount執行流程詳解
RDD詳解

RDD依賴關係
RDD快取機制
RDD的Checkpoint檢查點機制
Spark任務執行過程分析
RDD的Stage劃分
Spark-Sql應用

Spark-SQL
Spark結合Hive
DataFrame
實戰:Spark-SQL和DataFrame案例
SparkStreaming應用實戰

Spark-Streaming簡介
Spark-Streaming程式設計
實戰:StageFulWordCount
Flume結合Spark Streaming
Kafka結合Spark Streaming
視窗函式
ELK技術棧介紹
ElasticSearch安裝和使用
Storm架構分析
Storm程式設計模型、Tuple原始碼、併發度分析
Storm WordCount案例及常用Api分析
Spark核心原始碼解析

Spark原始碼編譯
Spark遠端debug
Spark任務提交行流程原始碼分析
Spark通訊流程原始碼分析
SparkContext建立過程原始碼分析
DriverActor和ClientActor通訊過程原始碼分析
Worker啟動Executor過程原始碼分析
Executor向DriverActor註冊過程原始碼分析
Executor向Driver註冊過程原始碼分析
DAGScheduler和TaskScheduler原始碼分析
Shuffle過程原始碼分析
Task執行過程原始碼分析
機器學習演算法

python及numpy庫

機器學習簡介
機器學習與python
python語言–快速入門
python語言–資料型別詳解
python語言–流程控制語句
python語言–函式使用
python語言–模組和包
phthon語言–面向物件
python機器學習演算法庫–numpy
機器學習必備數學知識–概率論
常用演算法實現

knn分類演算法–演算法原理
knn分類演算法–程式碼實現
knn分類演算法–手寫字識別案例
lineage迴歸分類演算法–演算法原理
lineage迴歸分類演算法–演算法實現及demo
樸素貝葉斯分類演算法–演算法原理
樸素貝葉斯分類演算法–演算法實現
樸素貝葉斯分類演算法–垃圾郵件識別應用案例
kmeans聚類演算法–演算法原理
kmeans聚類演算法–演算法實現
kmeans聚類演算法–地理位置聚類應用
決策樹分類演算法–演算法原理
決策樹分類演算法–演算法實現