劍譜總綱 | 大數據方向學習面試知識圖譜

<u>關注個人公衆號,後臺回覆【JAVAPDF】獲取200頁面試題!</u>
5萬人關注的大數據成神之路,不來了解一下嗎?
5萬人關注的大數據成神之路,真的不來了解一下嗎?
5萬人關注的大數據成神之路,肯定真的不來了解一下嗎?java

歡迎您關注《大數據成神之路》

願讀到這篇文章的技術人早日明白而且脫離技術自己,早登彼岸。
一切技術最終只是雕蟲小技。面試

file

大綱

本系列主題是大數據開發面試指南,旨在爲你們提供一個大數據學習的基本路線,完善數據開發的技術棧,以及咱們面試一個大數據開發崗位的時候,哪些東西是重點考察的,這些公司更但願面試者具有哪些技能。
本文不會對某一個知識點進行詳細的展開,後續會陸續出專題文章,但願讀者能當成一個學習或者複習的大綱,用以查漏補缺。算法

語言基礎篇

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 三個類的使用和原理segmentfault

多線程

併發和並行的區別
線程與進程的區別
線程的實現、線程的狀態、優先級、線程調度、建立線程的多種方式、守護線程
本身設計線程池、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、G一、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 招聘大數據開發工程師的要求:
file
file
file

以上三則招聘分別來自百度阿里和騰訊,那麼咱們把他們的要求分類概括:
1~2 門語言基礎

紮實的後臺開發基礎

離線計算方向(Hadoop/Hbase/Hive 等)

實時計算方向(Spark/Flink/Kafka 等)

知識面更寬優先(對口經驗 + 其餘)

若是你是 Apache 頂級項目的 Committer 那麼恭喜你,你將會是各大公司競相挖角對象。
咱們在寫簡歷時應該注意什麼?
我曾經做爲面試官面試過不少人,我認爲一個比較優秀的簡歷應該包含:
漂亮的排版,杜絕使用 word,格式化的模板,推薦使用 MarkDown 生成 PDF

不要堆砌技術名詞,不會的不瞭解的不要寫,不然你會被虐的體無完膚

1~2 個突出的項目經歷,不要讓你的簡歷看起來像Demo同樣淺顯

寫在簡歷上的項目我建議你要熟悉每個細節,即便不是你開發的也要知道是如何實現的

若是有一段知名企業的實習或者工做經歷那麼是很大的加分

技術深度和廣度?
在技術方向,你們更喜歡一專多能,深度廣度兼具的同窗,固然這個要求已經很高了。可是最起碼應該作到的是,你用到的技術不只要熟悉如何使用,也應該要知曉原理。
若是你曾經做爲組內的核心開發或者技術 leader 那麼要突出本身的技術優點和前瞻性,不只要熟悉使用如今已經有的輪子的優劣,也要對將來的技術發展有必定的前瞻性和預見性。
如何投遞簡歷?
最建議的方式是直接找到招聘組的負責人或者讓同窗或者同事內推。

大數據技術與架構
歡迎掃碼關注個人公衆號,回覆【JAVAPDF】能夠得到一份200頁秋招面試題!

相關文章
相關標籤/搜索