1. 程式人生 > >劍譜總綱 | 大資料方向學習面試知識圖譜

劍譜總綱 | 大資料方向學習面試知識圖譜

<u>關注我的公眾號,後臺回覆【JAVAPDF】獲取200頁面試題!</u> 5萬人關注的大資料成神之路,不來了解一下嗎? 5萬人關注的大資料成神之路,真的不來了解一下嗎? 5萬人關注的大資料成神之路,確定真的不來了解一下嗎?

歡迎您關注《大資料成神之路》

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

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

多執行緒

併發和並行的區別 執行緒與程序的區別 執行緒的實現、執行緒的狀態、優先順序、執行緒排程、建立執行緒的多種方式、守護執行緒 自己設計執行緒池、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 招聘大資料開發工程師的要求: file file file

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

紮實的後臺開發基礎

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

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

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

如果你是 Apache 頂級專案的 Committer 那麼恭喜你,你將會是各大公司競相挖角物件。 我們在寫簡歷時應該注意什麼? 我曾經作為面試官面試過很多人,我認為一個比較優秀的簡歷應該包含: 漂亮的排版,杜絕使用 word,格式化的模板,推薦使用 MarkDown 生成 PDF

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

1~2 個突出的專案經歷,不要讓你的簡歷看起來像Demo一樣淺顯

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

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

技術深度和廣度? 在技術方向,大家更喜歡一專多能,深度廣度兼具的同學,當然這個要求已經很高了。但是最起碼應該做到的是,你用到的技術不僅要熟悉如何使用,也應該要知曉原理。 如果你曾經作為組內的核心開發或者技術 leader 那麼要突出自己的技術優勢和前瞻性,不僅要熟悉使用現在已經有的輪子的優劣,也要對未來的技術發展有一定的前瞻性和預見性。 如何投遞簡歷? 最建議的方式是直接找到招聘組的負責人或者讓同學或者同事內推。

大資料技術與架構 歡迎掃碼關注我的公眾號,回覆【JAVAPDF】可以獲得一份200頁秋招