大數據方向學習面試知識圖譜「值得收藏」

正所謂,無招勝有招。

願讀到這篇文章的技術人早日明白並且脫離技術本身,早登彼岸。

一切技術最終只是雕蟲小技。


大綱

本系列主題是大數據開發面試指南,旨在為大家提供一個大數據學習的基本路線,完善數據開發的技術棧,以及我們面試一個大數據開發崗位的時候,哪些東西是重點考察的,這些公司更希望面試者具備哪些技能。


本文不會對某一個知識點進行詳細的展開,後續會陸續出專題文章,希望讀者能當成一個學習或者複習的大綱,用以查漏補缺。


大數據方向學習面試知識圖譜「值得收藏」

語言基礎篇

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 失效問題也是我們關注的重點。

大數據算法

本部分的算法包含兩個部分。第一部分是:面試中針對大數據處理的常用算法題;第二部分是:常用的機器學習和數據挖掘算法。

我們重點講第一部分,第二部分我們學有餘力的同學可以去接觸一些,在面試的過程中也可以算是一個亮點。

常見的大數據算法問題:

  1. 兩個超大文件找共同出現的單詞
  2. 海量數據求 TopN
  3. 海量數據找出不重複的數據
  4. 布隆過濾器
  5. bit-map
  6. 字典樹
  7. 倒排索引


企業期望的你是什麼樣子?

我們先來看幾個典型的 BAT 招聘大數據開發工程師的要求:

大數據方向學習面試知識圖譜「值得收藏」

大數據方向學習面試知識圖譜「值得收藏」

大數據方向學習面試知識圖譜「值得收藏」

以上三則招聘分別來自百度阿里和騰訊,那麼我們把他們的要求分類歸納:

  1. 1~2 門語言基礎
  2. 紮實的後臺開發基礎
  3. 離線計算方向(Hadoop/Hbase/Hive 等)
  4. 實時計算方向(Spark/Flink/Kafka 等)
  5. 知識面更寬優先(對口經驗 + 其他)

如果你是 Apache 頂級項目的 Committer 那麼恭喜你,你將會是各大公司競相挖角對象。

我們在寫簡歷時應該注意什麼?

我曾經作為面試官面試過很多人,我認為一個比較優秀的簡歷應該包含:

  1. 漂亮的排版,杜絕使用 word,格式化的模板,推薦使用 MarkDown 生成 PDF
  2. 不要堆砌技術名詞,不會的不瞭解的不要寫,否則你會被虐的體無完膚
  3. 1~2 個突出的項目經歷,不要讓你的簡歷看起來像Demo一樣淺顯
  4. 寫在簡歷上的項目我建議你要熟悉每一個細節,即使不是你開發的也要知道是如何實現的
  5. 如果有一段知名企業的實習或者工作經歷那麼是很大的加分

技術深度和廣度?

在技術方向,大家更喜歡一專多能,深度廣度兼具的同學,當然這個要求已經很高了。但是最起碼應該做到的是,你用到的技術不僅要熟悉如何使用,也應該要知曉原理。

如果你曾經作為組內的核心開發或者技術 leader 那麼要突出自己的技術優勢和前瞻性,不僅要熟悉使用現在已經有的輪子的優劣,也要對未來的技術發展有一定的前瞻性和預見性。

如何投遞簡歷?

最建議的方式是直接找到招聘組的負責人或者讓同學或者同事內推。

最後說一下,想要學習大數據的限時領取免費資料及課程

領取方法:

還是那個萬年不變的老規矩

1.評論文章,沒字數限制,一個字都行!

3.私信小編:“大數據開發教程”即可!

謝謝大家,祝大家學習愉快!(拿到教程後一定要好好學習,多練習哦!)


分享到:


相關文章: