正所謂,無招勝有招。
願讀到這篇文章的技術人早日明白並且脫離技術本身,早登彼岸。
一切技術最終只是雕蟲小技。
大綱
本系列主題是大數據開發面試指南,旨在為大家提供一個大數據學習的基本路線,完善數據開發的技術棧,以及我們面試一個大數據開發崗位的時候,哪些東西是重點考察的,這些公司更希望面試者具備哪些技能。
本文不會對某一個知識點進行詳細的展開,後續會陸續出專題文章,希望讀者能當成一個學習或者複習的大綱,用以查漏補缺。
![大數據方向學習面試知識圖譜「值得收藏」](http://p2.ttnews.xyz/loading.gif)
語言基礎篇
Java基礎篇
整個大數據開發技術棧我們從實時性的角度來看,主要包含了離線計算和實時計算兩大部分,而整個大數據生態中的框架絕大部分都是用 Java 開發或者兼容了 Java 的 API 調用,那麼作為基於 JVM 的第一語言 Java 就是我們繞不過去的坎,Java 語言的基礎也是我們閱讀源碼和進行代碼調優的基礎。
Java 基礎主要包含以下部分:
- 語言基礎
- 鎖
- 多線程
- 併發包中常用的併發容器(J.U.C)
語言基礎
- Java 的面向對象
- Java 語言的三大特徵:封裝、繼承和多態
- Java 語言數據類型
- Java 的自動類型轉換,強制類型轉換
- String 的不可變性,虛擬機的常量池,String.intern() 的底層原理
- Java 語言中的關鍵字:final、static、transient、instanceof、volatile、synchronized的底層原理
- Java 中常用的集合類的實現原理:ArrayList/LinkedList/Vector、SynchronizedList/Vector、HashMap/HashTable/ConcurrentHashMap 互相的區別以及底層實現原理
- 動態代理的實現方式
鎖
- CAS、樂觀鎖與悲觀鎖、數據庫相關鎖機制、分佈式鎖、偏向鎖、輕量級鎖、重量級鎖、monitor
- 鎖優化、鎖消除、鎖粗化、自旋鎖、可重入鎖、阻塞鎖、死鎖
- 死鎖的原因
- 死鎖的解決辦法
- CountDownLatch、CyclicBarrier 和 Semaphore 三個類的使用和原理
多線程
- 併發和並行的區別
- 線程與進程的區別
- 線程的實現、線程的狀態、優先級、線程調度、創建線程的多種方式、守護線程
- 自己設計線程池、submit() 和 execute()、線程池原理
- 為什麼不允許使用 Executors 創建線程池
- 死鎖、死鎖如何排查、線程安全和內存模型的關係
- ThreadLocal 變量
- Executor 創建線程池的幾種方式:
- newFixedThreadPool(int nThreads)
- newCachedThreadPool()
- newSingleThreadExecutor()
- newScheduledThreadPool(int corePoolSize)
- newSingleThreadExecutor()
- ThreadPoolExecutor 創建線程池、拒絕策略
- 線程池關閉的方式
併發容器(J.U.C)
- JUC 包中 List 接口的實現類:CopyOnWriteArrayList
- JUC 包中 Set 接口的實現類:CopyOnWriteArraySet、ConcurrentSkipListSet
- JUC 包中 Map 接口的實現類:ConcurrentHashMap、ConcurrentSkipListMap
- JUC包中Queue接口的實現類:ConcurrentLinkedQueue、ConcurrentLinkedDeque、ArrayBlockingQueue、LinkedBlockingQueue、LinkedBlockingDeque
Java 進階篇
進階篇部分是對 Java 基礎篇的補充,這部分內容是我們熟讀大數據框架的源碼必備的技能,也是我們在面試高級職位的時候的面試重災區。
JVM
JVM 內存結構
class 文件格式、運行時數據區:堆、棧、方法區、直接內存、運行時常量池
堆和棧區別
Java 中的對象一定在堆上分配嗎?
Java 內存模型
計算機內存模型、緩存一致性、MESI 協議、可見性、原子性、順序性、happens-before、內存屏障、synchronized、volatile、final、鎖
垃圾回收
GC 算法:標記清除、引用計數、複製、標記壓縮、分代回收、增量式回收、GC 參數、對象存活的判定、垃圾收集器(CMS、G1、ZGC、Epsilon)
JVM 參數及調優
-Xmx、-Xmn、-Xms、Xss、-XX:SurvivorRatio、-XX:PermSize、-XX:MaxPermSize、-XX:MaxTenuringThreshold
Java 對象模型
oop-klass、對象頭
HotSpot
即時編譯器、編譯優化
虛擬機性能監控與故障處理工具
jps、jstack、jmap、jstat、jconsole、 jinfo、 jhat、javap、btrace、TProfiler、Arthas
類加載機制
classLoader、類加載過程、雙親委派(破壞雙親委派)、模塊化(jboss modules、osgi、jigsaw)
NIO
- 用戶空間以及內核空間
- Linux 網絡 I/O 模型:阻塞 I/O (Blocking I/O)、非阻塞 I/O (Non-Blocking I/O)、I/O 複用(I/O Multiplexing)、信號驅動的 I/O (Signal Driven I/O)、異步 I/O
- 靈拷貝(ZeroCopy)
- BIO 與 NIO 對比
- 緩衝區 Buffer
- 通道 Channel
- 反應堆
- 選擇器
- AIO
RPC
- RPC 的原理編程模型
- 常用的 RPC 框架:Thrift、Dubbo、SpringCloud
- RPC 的應用場景和與消息隊列的差別
- RPC 核心技術點:服務暴露、遠程代理對象、通信、序列化
Linux 基礎
- 瞭解 Linux 的常用命令
- 遠程登錄
- 上傳下載
- 系統目錄
- 文件和目錄操作
- Linux 下的權限體系
- 壓縮和打包
- 用戶和組
- Shell 腳本的編寫
- 管道操作
分佈式理論篇
- 分佈式中的一些基本概念:集群(Cluster)、負載均衡(Load Balancer)等
- 分佈式系統理論基礎:一致性、2PC 和 3PC
- 分佈式系統理論基礎:CAP
- 分佈式系統理論基礎:時間、時鐘和事件順序
- 分佈式系統理論進階:Paxos
- 分佈式系統理論進階:Raft、Zab
- 分佈式系統理論進階:選舉、多數派和租約
- 分佈式鎖的解決方案
- 分佈式事務的解決方案
- 分佈式 ID 生成器解決方案
大數據框架網絡通信基石——Netty
Netty 是當前最流行的 NIO 框架,Netty 在互聯網領域、大數據分佈式計算領域、遊戲行業、通信行業等獲得了廣泛的應用,業界著名的開源組件只要涉及到網絡通信,Netty 是最佳的選擇。
關於 Netty 我們要掌握:
- Netty 三層網絡架構:Reactor 通信調度層、職責鏈 PipeLine、業務邏輯處理層
- Netty 的線程調度模型
- 序列化方式
- 鏈路有效性檢測
- 流量整形
- 優雅停機策略
- Netty 對 SSL/TLS 的支持
- Netty 的源碼質量極高,推薦對部分的核心代碼進行閱讀:
- Netty 的 Buffer
- Netty 的 Reactor
- Netty 的 Pipeline
- Netty 的 Handler 綜述
- Netty 的 ChannelHandler
- Netty 的 LoggingHandler
- Netty 的 TimeoutHandler
- Netty 的 CodecHandler
- Netty 的 MessageToByteEncoder
離線計算
Hadoop 體系是我們學習大數據框架的基石,尤其是 MapReduce、HDFS、Yarn 三駕馬車基本墊定了整個數據方向的發展道路。也是後面我們學習其他框架的基礎,關於 Hadoop 本身我們應該掌握哪些呢?
MapReduce:
- 掌握 MapReduce 的工作原理
- 能用 MapReduce 手寫代碼實現簡單的 WordCount 或者 TopN 算法
- 掌握 MapReduce Combiner 和 Partitioner的作用
- 熟悉 Hadoop 集群的搭建過程,並且能解決常見的錯誤
- 熟悉 Hadoop 集群的擴容過程和常見的坑
- 如何解決 MapReduce 的數據傾斜
- Shuffle 原理和減少 Shuffle 的方法
HDFS:
- 十分熟悉 HDFS 的架構圖和讀寫流程
- 十分熟悉 HDFS 的配置
- 熟悉 DataNode 和 NameNode 的作用
- NameNode 的 HA 搭建和配置,Fsimage 和 EditJournal 的作用的場景
- HDFS 操作文件的常用命令
- HDFS 的安全模式
Yarn:
- Yarn 的產生背景和架構
- Yarn 中的角色劃分和各自的作用
- Yarn 的配置和常用的資源調度策略
- Yarn 進行一次任務資源調度的過程
OLAP 引擎 Hive
Hive 是一個數據倉庫基礎工具,在 Hadoop 中用來處理結構化數據。它架構在 Hadoop 之上,總歸為大數據,並使得查詢和分析方便。Hive 是應用最廣泛的 OLAP 框架。Hive SQL 也是我們進行 SQL 開發用的最多的框架。
關於 Hive 你必須掌握的知識點如下:
- HiveSQL 的原理:我們都知道 HiveSQL 會被翻譯成 MapReduce 任務執行,那麼一條 SQL 是如何翻譯成 MapReduce 的?
- Hive 和普通關係型數據庫有什麼區別?
- Hive 支持哪些數據格式
- Hive 在底層是如何存儲 NULL 的
- HiveSQL 支持的幾種排序各代表什麼意思(Sort By/Order By/Cluster By/Distrbute By)
- Hive 的動態分區
- HQL 和 SQL 有哪些常見的區別
- Hive 中的內部表和外部表的區別
- Hive 表進行關聯查詢如何解決長尾和數據傾斜問題
- HiveSQL 的優化(系統參數調整、SQL 語句優化)
列式數據庫 Hbase
我們在提到列式數據庫這個概念的時候,第一反應就是 Hbase。
HBase 本質上是一個數據模型,類似於谷歌的大表設計,可以提供快速隨機訪問海量結構化數據。它利用了 Hadoop 的文件系統(HDFS)提供的容錯能力。
它是 Hadoop 的生態系統,提供對數據的隨機實時讀/寫訪問,是 Hadoop 文件系統的一部分。
我們可以直接或通過 HBase 的存儲 HDFS 數據。使用 HBase 在 HDFS 讀取消費/隨機訪問數據。 HBase 在 Hadoop 的文件系統之上,並提供了讀寫訪問。
HBase 是一個面向列的數據庫,在表中它由行排序。表模式定義只能列族,也就是鍵值對。一個表有多個列族以及每一個列族可以有任意數量的列。後續列的值連續地存儲在磁盤上。表中的每個單元格值都具有時間戳。總之,在一個 HBase:表是行的集合、行是列族的集合、列族是列的集合、列是鍵值對的集合。
關於 Hbase 你需要掌握:
- Hbase 的架構和原理
- Hbase 的讀寫流程
- Hbase 有沒有併發問題?Hbase 如何實現自己的 MVVC 的?
- Hbase 中幾個重要的概念:HMaster、RegionServer、WAL 機制、MemStore
- Hbase 在進行表設計過程中如何進行列族和 RowKey 的設計
- Hbase 的數據熱點問題發現和解決辦法
- 提高 Hbase 的讀寫性能的通用做法
- HBase 中 RowFilter 和 BloomFilter 的原理
- Hbase API 中常見的比較器
- Hbase 的預分區
- Hbase 的 Compaction
- Hbase 集群中 HRegionServer 宕機如何解決
實時計算篇
分佈式消息隊列 Kafka
Kafka 是最初由 Linkedin 公司開發,是一個分佈式、支持分區的(partition)、多副本的(replica)的分佈式消息系統,它的最大的特性就是可以實時的處理大量數據以滿足各種需求場景:比如基於 Hadoop 的批處理系統、低延遲的實時系統、Spark 流式處理引擎,Nginx 日誌、訪問日誌,消息服務等等,用 Scala 語言編寫,Linkedin 於 2010 年貢獻給了 Apache 基金會併成為頂級開源項目。
Kafka 或者類似 Kafka 各個公司自己造的消息'輪子'已經是大數據領域消息中間件的事實標準。目前 Kafka 已經更新到了 2.x 版本,支持了類似 KafkaSQL 等功能,Kafka 不滿足單純的消息中間件,也正朝著平臺化的方向演進。
關於 Kafka 我們需要掌握:
- Kafka 的特性和使用場景
- Kafka 中的一些概念:Leader、Broker、Producer、Consumer、Topic、Group、Offset、Partition、ISR
- Kafka 的整體架構
- Kafka 選舉策略
- Kafka 讀取和寫入消息過程中都發生了什麼
- Kakfa 如何進行數據同步(ISR)
- Kafka 實現分區消息順序性的原理
- 消費者和消費組的關係
- 消費 Kafka 消息的 Best Practice(最佳實踐)是怎樣的
- Kafka 如何保證消息投遞的可靠性和冪等性
- Kafka 消息的事務性是如何實現的
- 如何管理 Kafka 消息的 Offset
- Kafka 的文件存儲機制
- Kafka 是如何支持 Exactly-once 語義的
- 通常 Kafka 還會要求和 RocketMQ 等消息中間件進行比較
Spark
Spark 是專門為大數據處理設計的通用計算引擎,是一個實現快速通用的集群計算平臺。它是由加州大學伯克利分校 AMP 實驗室開發的通用內存並行計算框架,用來構建大型的、低延遲的數據分析應用程序。它擴展了廣泛使用的 MapReduce 計算模型。高效的支撐更多計算模式,包括交互式查詢和流處理。Spark 的一個主要特點是能夠在內存中進行計算,即使依賴磁盤進行復雜的運算,Spark 依然比 MapReduce 更加高效。
Spark 生態包含了:Spark Core、Spark Streaming、Spark SQL、Structured Streming 和機器學習相關的庫等。
學習 Spark 我們應該掌握:
(1)Spark Core:
- Spark的集群搭建和集群架構(Spark 集群中的角色)
- Spark Cluster 和 Client 模式的區別
- Spark 的彈性分佈式數據集 RDD
- Spark DAG(有向無環圖)
- 掌握 Spark RDD 編程的算子 API(Transformation 和 Action 算子)
- RDD 的依賴關係,什麼是寬依賴和窄依賴
- RDD 的血緣機制
- Spark 核心的運算機制
- Spark 的任務調度和資源調度
- Spark 的 CheckPoint 和容錯
- Spark 的通信機制
- Spark Shuffle 原理和過程
(2)Spark Streaming:
- 原理剖析(源碼級別)和運行機制
- Spark Dstream 及其 API 操作
- Spark Streaming 消費 Kafka 的兩種方式
- Spark 消費 Kafka 消息的 Offset 處理
- 數據傾斜的處理方案
- Spark Streaming 的算子調優
- 並行度和廣播變量
- Shuffle 調優
(3)Spark SQL:
- Spark SQL 的原理和運行機制
- Catalyst 的整體架構
- Spark SQL 的 DataFrame
Spark SQL 的優化策略:內存列式存儲和內存緩存表、列存儲壓縮、邏輯查詢優化、Join 的優化
(4)Structured Streaming
Spark 從 2.3.0 版本開始支持 Structured Streaming,它是一個建立在 Spark SQL 引擎之上可擴展且容錯的流處理引擎,統一了批處理和流處理。正是 Structured Streaming 的加入使得 Spark 在統一流、批處理方面能和 Flink 分庭抗禮。
我們需要掌握:
- Structured Streaming 的模型
- Structured Streaming 的結果輸出模式
- 事件時間(Event-time)和延遲數據(Late Data)
- 窗口操作
- 水印
- 容錯和數據恢復
Spark Mlib:
本部分是 Spark 對機器學習支持的部分,我們學有餘力的同學可以瞭解一下 Spark 對常用的分類、迴歸、聚類、協同過濾、降維以及底層的優化原語等算法和工具。可以嘗試自己使用 Spark Mlib 做一些簡單的算法應用。
Flink
Apache Flink(以下簡稱 Flink)項目是大數據處理領域最近冉冉升起的一顆新星,其不同於其他大數據項目的諸多特性吸引了越來越多人的關注。尤其是 2019 年初 Blink 開源將 Flink 的關注度提升到了前所未有的程度。
那麼關於 Flink 這個框架我們應該掌握哪些核心知識點?
- Flink 集群的搭建
- Flink 的架構原理
- Flink 的編程模型
- Flink 集群的 HA 配置
- Flink DataSet 和 DataSteam API
- 序列化
- Flink 累加器
- 狀態 State 的管理和恢復
- 窗口和時間
- 並行度
- Flink 和消息中間件 Kafka 的結合
- Flink Table 和 SQL 的原理和用法
另外這裡重點講一下,阿里巴巴 Blink 對 SQL 的支持,在阿里雲官網上可以看到,Blink 部分最引以為傲的就是對 SQL 的支持,那麼 SQL 中最常見的兩個問題:1.雙流 JOIN 問題,2.State 失效問題也是我們關注的重點。
大數據算法
本部分的算法包含兩個部分。第一部分是:面試中針對大數據處理的常用算法題;第二部分是:常用的機器學習和數據挖掘算法。
我們重點講第一部分,第二部分我們學有餘力的同學可以去接觸一些,在面試的過程中也可以算是一個亮點。
常見的大數據算法問題:
- 兩個超大文件找共同出現的單詞
- 海量數據求 TopN
- 海量數據找出不重複的數據
- 布隆過濾器
- bit-map
- 堆
- 字典樹
- 倒排索引
企業期望的你是什麼樣子?
我們先來看幾個典型的 BAT 招聘大數據開發工程師的要求:
![大數據方向學習面試知識圖譜「值得收藏」](http://p2.ttnews.xyz/loading.gif)
以上三則招聘分別來自百度阿里和騰訊,那麼我們把他們的要求分類歸納:
- 1~2 門語言基礎
- 紮實的後臺開發基礎
- 離線計算方向(Hadoop/Hbase/Hive 等)
- 實時計算方向(Spark/Flink/Kafka 等)
- 知識面更寬優先(對口經驗 + 其他)
如果你是 Apache 頂級項目的 Committer 那麼恭喜你,你將會是各大公司競相挖角對象。
我們在寫簡歷時應該注意什麼?
我曾經作為面試官面試過很多人,我認為一個比較優秀的簡歷應該包含:
- 漂亮的排版,杜絕使用 word,格式化的模板,推薦使用 MarkDown 生成 PDF
- 不要堆砌技術名詞,不會的不瞭解的不要寫,否則你會被虐的體無完膚
- 1~2 個突出的項目經歷,不要讓你的簡歷看起來像Demo一樣淺顯
- 寫在簡歷上的項目我建議你要熟悉每一個細節,即使不是你開發的也要知道是如何實現的
- 如果有一段知名企業的實習或者工作經歷那麼是很大的加分
技術深度和廣度?
在技術方向,大家更喜歡一專多能,深度廣度兼具的同學,當然這個要求已經很高了。但是最起碼應該做到的是,你用到的技術不僅要熟悉如何使用,也應該要知曉原理。
如果你曾經作為組內的核心開發或者技術 leader 那麼要突出自己的技術優勢和前瞻性,不僅要熟悉使用現在已經有的輪子的優劣,也要對未來的技術發展有一定的前瞻性和預見性。
如何投遞簡歷?
最建議的方式是直接找到招聘組的負責人或者讓同學或者同事內推。
最後說一下,想要學習大數據的限時領取免費資料及課程
領取方法:
還是那個萬年不變的老規矩
1.評論文章,沒字數限制,一個字都行!
3.私信小編:“大數據開發教程”即可!
謝謝大家,祝大家學習愉快!(拿到教程後一定要好好學習,多練習哦!)
閱讀更多 微笑數據工程師 的文章