愿讀到這篇文章的技術(shù)人早日明白并且脫離技術(shù)本身彰阴,早登彼岸怕轿。
一切技術(shù)最終只是雕蟲小技断傲。
大綱
本系列主題是大數(shù)據(jù)開發(fā)面試指南,旨在為大家提供一個大數(shù)據(jù)學習的基本路線谴古,完善數(shù)據(jù)開發(fā)的技術(shù)棧质涛,以及我們面試一個大數(shù)據(jù)開發(fā)崗位的時候,哪些東西是重點考察的掰担,這些公司更希望面試者具備哪些技能汇陆。
本文不會對某一個知識點進行詳細的展開,后續(xù)會陸續(xù)出專題文章带饱,希望讀者能當成一個學習或者復習的大綱毡代,用以查漏補缺。
語言基礎(chǔ)篇
Java基礎(chǔ)篇
整個大數(shù)據(jù)開發(fā)技術(shù)棧我們從實時性的角度來看勺疼,主要包含了離線計算和實時計算兩大部分教寂,而整個大數(shù)據(jù)生態(tài)中的框架絕大部分都是用 Java 開發(fā)或者兼容了 Java 的 API 調(diào)用,那么作為基于 JVM 的第一語言 Java 就是我們繞不過去的坎执庐,Java 語言的基礎(chǔ)也是我們閱讀源碼和進行代碼調(diào)優(yōu)的基礎(chǔ)酪耕。
Java 基礎(chǔ)主要包含以下部分:
語言基礎(chǔ)
鎖
多線程
并發(fā)包中常用的并發(fā)容器(J.U.C)
語言基礎(chǔ)
Java 的面向?qū)ο?/p>
Java 語言的三大特征:封裝、繼承和多態(tài)
Java 語言數(shù)據(jù)類型
Java 的自動類型轉(zhuǎn)換轨淌,強制類型轉(zhuǎn)換
String 的不可變性迂烁,虛擬機的常量池看尼,String.intern() 的底層原理
Java 語言中的關(guān)鍵字:final、static盟步、transient藏斩、instanceof、volatile却盘、synchronized的底層原理
Java 中常用的集合類的實現(xiàn)原理:ArrayList/LinkedList/Vector狰域、SynchronizedList/Vector、HashMap/HashTable/ConcurrentHashMap 互相的區(qū)別以及底層實現(xiàn)原理
【大數(shù)據(jù)開發(fā)學習資料領(lǐng)取方式】:加入大數(shù)據(jù)技術(shù)學習交流群458345782谷炸,點擊加入群聊,私信管理員即可免費領(lǐng)取
動態(tài)代理的實現(xiàn)方式
鎖
CAS禀挫、樂觀鎖與悲觀鎖旬陡、數(shù)據(jù)庫相關(guān)鎖機制、分布式鎖语婴、偏向鎖描孟、輕量級鎖、重量級鎖砰左、monitor
鎖優(yōu)化匿醒、鎖消除、鎖粗化缠导、自旋鎖廉羔、可重入鎖、阻塞鎖僻造、死鎖
死鎖的原因
死鎖的解決辦法
CountDownLatch憋他、CyclicBarrier 和 Semaphore 三個類的使用和原理
多線程
并發(fā)和并行的區(qū)別
線程與進程的區(qū)別
線程的實現(xiàn)、線程的狀態(tài)髓削、優(yōu)先級竹挡、線程調(diào)度、創(chuàng)建線程的多種方式立膛、守護線程
自己設(shè)計線程池揪罕、submit() 和 execute()、線程池原理
為什么不允許使用 Executors 創(chuàng)建線程池
死鎖宝泵、死鎖如何排查好啰、線程安全和內(nèi)存模型的關(guān)系
ThreadLocal 變量
Executor 創(chuàng)建線程池的幾種方式:
newFixedThreadPool(int nThreads)
newCachedThreadPool()
newSingleThreadExecutor()
newScheduledThreadPool(int corePoolSize)
newSingleThreadExecutor()
ThreadPoolExecutor 創(chuàng)建線程池、拒絕策略
線程池關(guān)閉的方式
并發(fā)容器(J.U.C)
JUC 包中 List 接口的實現(xiàn)類:CopyOnWriteArrayList
JUC 包中 Set 接口的實現(xiàn)類:CopyOnWriteArraySet儿奶、ConcurrentSkipListSet
JUC 包中 Map 接口的實現(xiàn)類:ConcurrentHashMap坎怪、ConcurrentSkipListMap
JUC包中Queue接口的實現(xiàn)類:ConcurrentLinkedQueue、ConcurrentLinkedDeque廓握、ArrayBlockingQueue搅窿、LinkedBlockingQueue嘁酿、LinkedBlockingDeque
Java 進階篇
進階篇部分是對 Java 基礎(chǔ)篇的補充,這部分內(nèi)容是我們熟讀大數(shù)據(jù)框架的源碼必備的技能男应,也是我們在面試高級職位的時候的面試重災區(qū)闹司。
JVM
JVM 內(nèi)存結(jié)構(gòu)
class 文件格式、運行時數(shù)據(jù)區(qū):堆沐飘、棧游桩、方法區(qū)、直接內(nèi)存耐朴、運行時常量池
堆和棧區(qū)別
Java 中的對象一定在堆上分配嗎借卧?
Java 內(nèi)存模型
計算機內(nèi)存模型、緩存一致性筛峭、MESI 協(xié)議铐刘、可見性、原子性影晓、順序性镰吵、happens-before、內(nèi)存屏障挂签、synchronized疤祭、volatile、final饵婆、鎖
垃圾回收
GC 算法:標記清除勺馆、引用計數(shù)、復制侨核、標記壓縮谓传、分代回收、增量式回收芹关、GC 參數(shù)续挟、對象存活的判定、垃圾收集器(CMS侥衬、G1诗祸、ZGC、Epsilon)
JVM 參數(shù)及調(diào)優(yōu)
-Xmx轴总、-Xmn直颅、-Xms支鸡、Xss三幻、-XX:SurvivorRatio、-XX:PermSize座慰、-XX:MaxPermSize往堡、-XX:MaxTenuringThreshold
Java 對象模型
oop-klass械荷、對象頭
HotSpot
即時編譯器共耍、編譯優(yōu)化
虛擬機性能監(jiān)控與故障處理工具
jps、jstack吨瞎、jmap痹兜、jstat、jconsole颤诀、 jinfo字旭、 jhat、javap崖叫、btrace遗淳、TProfiler、Arthas
類加載機制
classLoader心傀、類加載過程屈暗、雙親委派(破壞雙親委派)、模塊化(jboss modules剧包、osgi恐锦、jigsaw)
NIO
用戶空間以及內(nèi)核空間
Linux 網(wǎng)絡 I/O 模型:阻塞 I/O (Blocking I/O)往果、非阻塞 I/O (Non-Blocking I/O)疆液、I/O 復用(I/O Multiplexing)、信號驅(qū)動的 I/O (Signal Driven I/O)陕贮、異步 I/O
靈拷貝(ZeroCopy)
BIO 與 NIO 對比
緩沖區(qū) Buffer
通道 Channel
反應堆
選擇器
AIO
RPC
RPC 的原理編程模型
常用的 RPC 框架:Thrift堕油、Dubbo、SpringCloud
RPC 的應用場景和與消息隊列的差別
RPC 核心技術(shù)點:服務暴露肮之、遠程代理對象掉缺、通信、序列化
Linux 基礎(chǔ)
了解 Linux 的常用命令
遠程登錄
上傳下載
系統(tǒng)目錄
文件和目錄操作
Linux 下的權(quán)限體系
壓縮和打包
用戶和組
Shell 腳本的編寫
管道操作
分布式理論篇
分布式中的一些基本概念:集群(Cluster)戈擒、負載均衡(Load Balancer)等
分布式系統(tǒng)理論基礎(chǔ):一致性眶明、2PC 和 3PC
分布式系統(tǒng)理論基礎(chǔ):CAP
分布式系統(tǒng)理論基礎(chǔ):時間、時鐘和事件順序
分布式系統(tǒng)理論進階:Paxos
分布式系統(tǒng)理論進階:Raft筐高、Zab
分布式系統(tǒng)理論進階:選舉搜囱、多數(shù)派和租約
分布式鎖的解決方案
分布式事務的解決方案
分布式 ID 生成器解決方案
大數(shù)據(jù)框架網(wǎng)絡通信基石——Netty
Netty 是當前最流行的 NIO 框架,Netty 在互聯(lián)網(wǎng)領(lǐng)域柑土、大數(shù)據(jù)分布式計算領(lǐng)域蜀肘、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應用稽屏,業(yè)界著名的開源組件只要涉及到網(wǎng)絡通信扮宠,Netty 是最佳的選擇。
關(guān)于 Netty 我們要掌握:
Netty 三層網(wǎng)絡架構(gòu):Reactor 通信調(diào)度層狐榔、職責鏈 PipeLine坛增、業(yè)務邏輯處理層
Netty 的線程調(diào)度模型
序列化方式
鏈路有效性檢測
流量整形
優(yōu)雅停機策略
Netty 對 SSL/TLS 的支持
Netty 的源碼質(zhì)量極高获雕,推薦對部分的核心代碼進行閱讀:
Netty 的 Buffer
Netty 的 Reactor
Netty 的 Pipeline
Netty 的 Handler 綜述
Netty 的 ChannelHandler
Netty 的 LoggingHandler
Netty 的 TimeoutHandler
Netty 的 CodecHandler
Netty 的 MessageToByteEncoder
離線計算
Hadoop 體系是我們學習大數(shù)據(jù)框架的基石,尤其是 MapReduce轿偎、HDFS典鸡、Yarn 三駕馬車基本墊定了整個數(shù)據(jù)方向的發(fā)展道路。也是后面我們學習其他框架的基礎(chǔ)坏晦,關(guān)于 Hadoop 本身我們應該掌握哪些呢萝玷?
MapReduce:
掌握 MapReduce 的工作原理
能用 MapReduce 手寫代碼實現(xiàn)簡單的 WordCount 或者 TopN 算法
掌握 MapReduce Combiner 和 Partitioner的作用
熟悉 Hadoop 集群的搭建過程,并且能解決常見的錯誤
熟悉 Hadoop 集群的擴容過程和常見的坑
如何解決 MapReduce 的數(shù)據(jù)傾斜
Shuffle 原理和減少 Shuffle 的方法
HDFS:
十分熟悉 HDFS 的架構(gòu)圖和讀寫流程
十分熟悉 HDFS 的配置
熟悉 DataNode 和 NameNode 的作用
NameNode 的 HA 搭建和配置昆婿,F(xiàn)simage 和 EditJournal 的作用的場景
HDFS 操作文件的常用命令
HDFS 的安全模式
Yarn:
Yarn 的產(chǎn)生背景和架構(gòu)
Yarn 中的角色劃分和各自的作用
Yarn 的配置和常用的資源調(diào)度策略
Yarn 進行一次任務資源調(diào)度的過程
OLAP 引擎 Hive
Hive 是一個數(shù)據(jù)倉庫基礎(chǔ)工具球碉,在 Hadoop 中用來處理結(jié)構(gòu)化數(shù)據(jù)。它架構(gòu)在 Hadoop 之上仓蛆,總歸為大數(shù)據(jù)睁冬,并使得查詢和分析方便。Hive 是應用最廣泛的 OLAP 框架看疙。Hive SQL 也是我們進行 SQL 開發(fā)用的最多的框架豆拨。
關(guān)于 Hive 你必須掌握的知識點如下:
HiveSQL 的原理:我們都知道 HiveSQL 會被翻譯成 MapReduce 任務執(zhí)行,那么一條 SQL 是如何翻譯成 MapReduce 的能庆?
Hive 和普通關(guān)系型數(shù)據(jù)庫有什么區(qū)別施禾?
Hive 支持哪些數(shù)據(jù)格式
Hive 在底層是如何存儲 NULL 的
HiveSQL 支持的幾種排序各代表什么意思(Sort By/Order By/Cluster By/Distrbute By)
Hive 的動態(tài)分區(qū)
HQL 和 SQL 有哪些常見的區(qū)別
Hive 中的內(nèi)部表和外部表的區(qū)別
Hive 表進行關(guān)聯(lián)查詢?nèi)绾谓鉀Q長尾和數(shù)據(jù)傾斜問題
HiveSQL 的優(yōu)化(系統(tǒng)參數(shù)調(diào)整、SQL 語句優(yōu)化)
列式數(shù)據(jù)庫 Hbase
我們在提到列式數(shù)據(jù)庫這個概念的時候搁胆,第一反應就是 Hbase弥搞。
HBase 本質(zhì)上是一個數(shù)據(jù)模型,類似于谷歌的大表設(shè)計渠旁,可以提供快速隨機訪問海量結(jié)構(gòu)化數(shù)據(jù)攀例。它利用了 Hadoop 的文件系統(tǒng)(HDFS)提供的容錯能力。
它是 Hadoop 的生態(tài)系統(tǒng)顾腊,提供對數(shù)據(jù)的隨機實時讀/寫訪問粤铭,是 Hadoop 文件系統(tǒng)的一部分。
我們可以直接或通過 HBase 的存儲 HDFS 數(shù)據(jù)杂靶。使用 HBase 在 HDFS 讀取消費/隨機訪問數(shù)據(jù)梆惯。 HBase 在 Hadoop 的文件系統(tǒng)之上,并提供了讀寫訪問伪煤。
HBase 是一個面向列的數(shù)據(jù)庫加袋,在表中它由行排序。表模式定義只能列族抱既,也就是鍵值對职烧。一個表有多個列族以及每一個列族可以有任意數(shù)量的列。后續(xù)列的值連續(xù)地存儲在磁盤上。表中的每個單元格值都具有時間戳蚀之』雀遥總之,在一個 HBase:表是行的集合足删、行是列族的集合寿谴、列族是列的集合、列是鍵值對的集合失受。
關(guān)于 Hbase 你需要掌握:
Hbase 的架構(gòu)和原理
Hbase 的讀寫流程
Hbase 有沒有并發(fā)問題讶泰?Hbase 如何實現(xiàn)自己的 MVVC 的?
Hbase 中幾個重要的概念:HMaster拂到、RegionServer痪署、WAL 機制、MemStore
Hbase 在進行表設(shè)計過程中如何進行列族和 RowKey 的設(shè)計
Hbase 的數(shù)據(jù)熱點問題發(fā)現(xiàn)和解決辦法
提高 Hbase 的讀寫性能的通用做法
HBase 中 RowFilter 和 BloomFilter 的原理
Hbase API 中常見的比較器
Hbase 的預分區(qū)
Hbase 的 Compaction
Hbase 集群中 HRegionServer 宕機如何解決
實時計算篇
分布式消息隊列 Kafka
Kafka 是最初由 Linkedin 公司開發(fā)兄旬,是一個分布式狼犯、支持分區(qū)的(partition)、多副本的(replica)的分布式消息系統(tǒng)领铐,它的最大的特性就是可以實時的處理大量數(shù)據(jù)以滿足各種需求場景:比如基于 Hadoop 的批處理系統(tǒng)悯森、低延遲的實時系統(tǒng)、Spark 流式處理引擎绪撵,Nginx 日志瓢姻、訪問日志,消息服務等等莲兢,用 Scala 語言編寫汹来,Linkedin 于 2010 年貢獻給了 Apache 基金會并成為頂級開源項目续膳。
Kafka 或者類似 Kafka 各個公司自己造的消息'輪子'已經(jīng)是大數(shù)據(jù)領(lǐng)域消息中間件的事實標準改艇。目前 Kafka 已經(jīng)更新到了 2.x 版本,支持了類似 KafkaSQL 等功能坟岔,Kafka 不滿足單純的消息中間件谒兄,也正朝著平臺化的方向演進。
關(guān)于 Kafka 我們需要掌握:
Kafka 的特性和使用場景
Kafka 中的一些概念:Leader社付、Broker承疲、Producer、Consumer鸥咖、Topic燕鸽、Group、Offset啼辣、Partition啊研、ISR
Kafka 的整體架構(gòu)
Kafka 選舉策略
Kafka 讀取和寫入消息過程中都發(fā)生了什么
Kakfa 如何進行數(shù)據(jù)同步(ISR)
Kafka 實現(xiàn)分區(qū)消息順序性的原理
消費者和消費組的關(guān)系
消費 Kafka 消息的 Best Practice(最佳實踐)是怎樣的
Kafka 如何保證消息投遞的可靠性和冪等性
Kafka 消息的事務性是如何實現(xiàn)的
如何管理 Kafka 消息的 Offset
Kafka 的文件存儲機制
Kafka 是如何支持 Exactly-once 語義的
通常 Kafka 還會要求和 RocketMQ 等消息中間件進行比較
Spark
Spark 是專門為大數(shù)據(jù)處理設(shè)計的通用計算引擎,是一個實現(xiàn)快速通用的集群計算平臺。它是由加州大學伯克利分校 AMP 實驗室開發(fā)的通用內(nèi)存并行計算框架党远,用來構(gòu)建大型的削解、低延遲的數(shù)據(jù)分析應用程序。它擴展了廣泛使用的 MapReduce 計算模型沟娱。高效的支撐更多計算模式氛驮,包括交互式查詢和流處理。Spark 的一個主要特點是能夠在內(nèi)存中進行計算济似,即使依賴磁盤進行復雜的運算矫废,Spark 依然比 MapReduce 更加高效。
Spark 生態(tài)包含了:Spark Core砰蠢、Spark Streaming磷脯、Spark SQL、Structured Streming 和機器學習相關(guān)的庫等娩脾。
學習 Spark 我們應該掌握:
(1)Spark Core:
Spark的集群搭建和集群架構(gòu)(Spark 集群中的角色)
Spark Cluster 和 Client 模式的區(qū)別
Spark 的彈性分布式數(shù)據(jù)集 RDD
Spark DAG(有向無環(huán)圖)
掌握 Spark RDD 編程的算子 API(Transformation 和 Action 算子)
RDD 的依賴關(guān)系赵誓,什么是寬依賴和窄依賴
RDD 的血緣機制
Spark 核心的運算機制
Spark 的任務調(diào)度和資源調(diào)度
Spark 的 CheckPoint 和容錯
Spark 的通信機制
Spark Shuffle 原理和過程
(2)Spark Streaming:
原理剖析(源碼級別)和運行機制
Spark Dstream 及其 API 操作
Spark Streaming 消費 Kafka 的兩種方式
Spark 消費 Kafka 消息的 Offset 處理
數(shù)據(jù)傾斜的處理方案
Spark Streaming 的算子調(diào)優(yōu)
并行度和廣播變量
Shuffle 調(diào)優(yōu)
(3)Spark SQL:
Spark SQL 的原理和運行機制
Catalyst 的整體架構(gòu)
Spark SQL 的 DataFrame
Spark SQL 的優(yōu)化策略:內(nèi)存列式存儲和內(nèi)存緩存表、列存儲壓縮柿赊、邏輯查詢優(yōu)化俩功、Join 的優(yōu)化
(4)Structured Streaming
Spark 從 2.3.0 版本開始支持 Structured Streaming,它是一個建立在 Spark SQL 引擎之上可擴展且容錯的流處理引擎碰声,統(tǒng)一了批處理和流處理诡蜓。正是 Structured Streaming 的加入使得 Spark 在統(tǒng)一流、批處理方面能和 Flink 分庭抗禮胰挑。
我們需要掌握:
Structured Streaming 的模型
Structured Streaming 的結(jié)果輸出模式
事件時間(Event-time)和延遲數(shù)據(jù)(Late Data)
窗口操作
水印
容錯和數(shù)據(jù)恢復
Spark Mlib:
本部分是 Spark 對機器學習支持的部分蔓罚,我們學有余力的同學可以了解一下 Spark 對常用的分類、回歸瞻颂、聚類豺谈、協(xié)同過濾、降維以及底層的優(yōu)化原語等算法和工具贡这〔缒可以嘗試自己使用 Spark Mlib 做一些簡單的算法應用。
Flink
Apache Flink(以下簡稱 Flink)項目是大數(shù)據(jù)處理領(lǐng)域最近冉冉升起的一顆新星盖矫,其不同于其他大數(shù)據(jù)項目的諸多特性吸引了越來越多人的關(guān)注丽惭。尤其是 2019 年初 Blink 開源將 Flink 的關(guān)注度提升到了前所未有的程度。
那么關(guān)于 Flink 這個框架我們應該掌握哪些核心知識點辈双?
Flink 集群的搭建
Flink 的架構(gòu)原理
Flink 的編程模型
Flink 集群的 HA 配置
Flink DataSet 和 DataSteam API
序列化
Flink 累加器
狀態(tài) State 的管理和恢復
窗口和時間
并行度
Flink 和消息中間件 Kafka 的結(jié)合
Flink Table 和 SQL 的原理和用法
另外這里重點講一下责掏,阿里巴巴 Blink 對 SQL 的支持,在阿里云官網(wǎng)上可以看到湃望,Blink 部分最引以為傲的就是對 SQL 的支持换衬,那么 SQL 中最常見的兩個問題:1.雙流 JOIN 問題局义,2.State 失效問題也是我們關(guān)注的重點。
大數(shù)據(jù)算法
本部分的算法包含兩個部分冗疮。第一部分是:面試中針對大數(shù)據(jù)處理的常用算法題萄唇;第二部分是:常用的機器學習和數(shù)據(jù)挖掘算法。
我們重點講第一部分术幔,第二部分我們學有余力的同學可以去接觸一些另萤,在面試的過程中也可以算是一個亮點。
常見的大數(shù)據(jù)算法問題:
兩個超大文件找共同出現(xiàn)的單詞
海量數(shù)據(jù)求 TopN
海量數(shù)據(jù)找出不重復的數(shù)據(jù)
布隆過濾器
bit-map
堆
字典樹
倒排索引
企業(yè)期望的你是什么樣子诅挑?
我們先來看幾個典型的 BAT 招聘大數(shù)據(jù)開發(fā)工程師的要求:
以上三則招聘分別來自百度阿里和騰訊四敞,那么我們把他們的要求分類歸納:
1~2 門語言基礎(chǔ)
扎實的后臺開發(fā)基礎(chǔ)
離線計算方向(Hadoop/Hbase/Hive 等)
實時計算方向(Spark/Flink/Kafka 等)
知識面更寬優(yōu)先(對口經(jīng)驗 + 其他)
如果你是 Apache 頂級項目的 Committer 那么恭喜你,你將會是各大公司競相挖角對象拔妥。
我們在寫簡歷時應該注意什么忿危?
我曾經(jīng)作為面試官面試過很多人,我認為一個比較優(yōu)秀的簡歷應該包含:
漂亮的排版没龙,杜絕使用 word铺厨,格式化的模板,推薦使用 MarkDown 生成 PDF
不要堆砌技術(shù)名詞硬纤,不會的不了解的不要寫解滓,否則你會被虐的體無完膚
1~2 個突出的項目經(jīng)歷,不要讓你的簡歷看起來像Demo一樣淺顯
寫在簡歷上的項目我建議你要熟悉每一個細節(jié)筝家,即使不是你開發(fā)的也要知道是如何實現(xiàn)的
如果有一段知名企業(yè)的實習或者工作經(jīng)歷那么是很大的加分
技術(shù)深度和廣度洼裤?
在技術(shù)方向,大家更喜歡一專多能溪王,深度廣度兼具的同學腮鞍,當然這個要求已經(jīng)很高了。但是最起碼應該做到的是莹菱,你用到的技術(shù)不僅要熟悉如何使用移国,也應該要知曉原理。
如果你曾經(jīng)作為組內(nèi)的核心開發(fā)或者技術(shù) leader 那么要突出自己的技術(shù)優(yōu)勢和前瞻性芒珠,不僅要熟悉使用現(xiàn)在已經(jīng)有的輪子的優(yōu)劣桥狡,也要對未來的技術(shù)發(fā)展有一定的前瞻性和預見性搅裙。
如何投遞簡歷皱卓?
最建議的方式是直接找到招聘組的負責人或者讓同學或者同事內(nèi)推。