❶ 大數據分析應該掌握哪些基礎知識
java基礎語法
· 分支結構if/switch
· 循環結構for/while/do while
· 方法聲明和調用
· 方法重載
· 數組的使用
· 命令行參數、可變參數
IDEA
· IDEA常用設置、常用快捷鍵
· 自定義模板
· 關聯Tomcat
· Web項目案例實操
面向對象編程
· 封裝、繼承、多態、構造器、包
· 異常處理機制
· 抽象類、介面、內部類
· 常有基礎API、集合List/Set/Map
· 泛型、線程的創建和啟動
· 深入集合源碼分析、常見數據結構解析
· 線程的安全、同步和通信、IO流體系
· 反射、類的載入機制、網路編程
Java8/9/10/11新特性
· Lambda表達式、方法引用
· 構造器引用、StreamAPI
· jShell(JShell)命令
· 介面的私有方法、Optional加強
· 局部變數的類型推斷
· 更簡化的編譯運行程序等
MySQL
· DML語言、DDL語言、DCL語言
· 分組查詢、Join查詢、子查詢、Union查詢、函數
· 流程式控制制語句、事務的特點、事務的隔離級別等
JDBC
· 使用JDBC完成資料庫增刪改查操作
· 批處理的操作
· 資料庫連接池的原理及應用
· 常見資料庫連接池C3P0、DBCP、Druid等
Maven
· Maven環境搭建
· 本地倉庫&中央倉庫
· 創建Web工程
· 自動部署
· 持續繼承
· 持續部署
Linux
· VI/VIM編輯器
· 系統管理操作&遠程登錄
· 常用命令
· 軟體包管理&企業真題
Shell編程
· 自定義變數與特殊變數
· 運算符
· 條件判斷
· 流程式控制制
· 系統函數&自定義函數
· 常用工具命令
· 面試真題
Hadoop
· Hadoop生態介紹
· Hadoop運行模式
· 源碼編譯
· HDFS文件系統底層詳解
· DN&NN工作機制
· HDFS的API操作
· MapRece框架原理
· 數據壓縮
· Yarn工作機制
· MapRece案例詳解
· Hadoop參數調優
· HDFS存儲多目錄
· 多磁碟數據均衡
· LZO壓縮
· Hadoop基準測試
Zookeeper
· Zookeeper數據結果
· 內部原理
· 選舉機制
· Stat結構體
· 監聽器
· 分布式安裝部署
· API操作
· 實戰案例
· 面試真題
· 啟動停止腳本
HA+新特性
· HDFS-HA集群配置
Hive
· Hive架構原理
· 安裝部署
· 遠程連接
· 常見命令及基本數據類型
· DML數據操作
· 查詢語句
· Join&排序
· 分桶&函數
· 壓縮&存儲
· 企業級調優
· 實戰案例
· 面試真題
Flume
· Flume架構
· Agent內部原理
· 事務
· 安裝部署
· 實戰案例
· 自定義Source
· 自定義Sink
· Ganglia監控
Kafka
· 消息隊列
· Kafka架構
· 集群部署
· 命令行操作
· 工作流程分析
· 分區分配策略
· 數據寫入流程
· 存儲策略
· 高階API
· 低級API
· 攔截器
· 監控
· 高可靠性存儲
· 數據可靠性和持久性保證
· ISR機制
· Kafka壓測
· 機器數量計算
· 分區數計算
· 啟動停止腳本
DataX
· 安裝
· 原理
· 數據一致性
· 空值處理
· LZO壓縮處理
Scala
· Scala基礎入門
· 函數式編程
· 數據結構
· 面向對象編程
· 模式匹配
· 高階函數
· 特質
· 註解&類型參數
· 隱式轉換
· 高級類型
· 案例實操
Spark Core
· 安裝部署
· RDD概述
· 編程模型
· 持久化&檢查點機制
· DAG
· 運算元詳解
· RDD編程進階
· 累加器&廣播變數
Spark SQL
· SparkSQL
· DataFrame
· DataSet
· 自定義UDF&UDAF函數
Spark Streaming
· SparkStreaming
· 背壓機制原理
· Receiver和Direct模式原理
· Window原理及案例實操
· 7x24 不間斷運行&性能考量
Spark內核&優化
· 內核源碼詳解
· 優化詳解
Hbase
· Hbase原理及架構
· 數據讀寫流程
· API使用
· 與Hive和Sqoop集成
· 企業級調優
Presto
· Presto的安裝部署
· 使用Presto執行數倉項目的即席查詢模塊
Ranger2.0
· 許可權管理工具Ranger的安裝和使用
Azkaban3.0
· 任務調度工具Azkaban3.0的安裝部署
· 使用Azkaban進行項目任務調度,實現電話郵件報警
Kylin3.0
· Kylin的安裝部署
· Kylin核心思想
· 使用Kylin對接數據源構建模型
Atlas2.0
· 元數據管理工具Atlas的安裝部署
Zabbix
· 集群監控工具Zabbix的安裝部署
DolphinScheler
· 任務調度工具DolphinScheler的安裝部署
· 實現數倉項目任務的自動化調度、配置郵件報警
Superset
· 使用SuperSet對數倉項目的計算結果進行可視化展示
Echarts
· 使用Echarts對數倉項目的計算結果進行可視化展示
Redis
· Redis安裝部署
· 五大數據類型
· 總體配置
· 持久化
· 事務
· 發布訂閱
· 主從復制
Canal
· 使用Canal實時監控MySQL數據變化採集至實時項目
Flink
· 運行時架構
· 數據源Source
· Window API
· Water Mark
· 狀態編程
· CEP復雜事件處理
Flink SQL
· Flink SQL和Table API詳細解讀
Flink 內核
· Flink內核源碼講解
· 經典面試題講解
Git&GitHub
· 安裝配置
· 本地庫搭建
· 基本操作
· 工作流
· 集中式
ClickHouse
· ClickHouse的安裝部署
· 讀寫機制
· 數據類型
· 執行引擎
DataV
· 使用DataV對實時項目需求計算結果進行可視化展示
sugar
· 結合Springboot對接網路sugar實現數據可視化大屏展示
Maxwell
· 使用Maxwell實時監控MySQL數據變化採集至實時項目
ElasticSearch
· ElasticSearch索引基本操作、案例實操
Kibana
· 通過Kibana配置可視化分析
Springboot
· 利用Springboot開發可視化介面程序
❷ 數據分析需要掌握哪些知識
Java基礎語法
· 分支結構if/switch
· 循環結構for/while/do while
· 方法聲明和調用
· 方法重載
· 數組的使用
· 命令行參數、可變參數
IDEA
· IDEA常用設置、常用快捷鍵
· 自定義模板
· 關聯Tomcat
· Web項目案例實操
面向對象編程
· 封裝、繼承、多態、構造器、包
· 異常處理機制
· 抽象類、介面、內部類
· 常有基礎API、集合List/Set/Map
· 泛型、線程的創建和啟動
· 深入集合源碼分析、常見數據結構解析
· 線程的安全、同步和通信、IO流體系
· 反射、類的載入機制、網路編程
Java8/9/10/11
新特性
· Lambda表達式、方法引用
· 構造器引用、StreamAPI
· jShell(JShell)命令
· 介面的私有方法、Optional加強
· 局部變數的類型推斷
· 更簡化的編譯運行程序等
MySQL
· DML語言、DDL語言、DCL語言
· 分組查詢、Join查詢、子查詢、Union查詢、函數
· 流程式控制制語句、事務的特點、事務的隔離級別等
JDBC
· 使用JDBC完成資料庫增刪改查操作
· 批處理的操作
· 資料庫連接池的原理及應用
· 常見資料庫連接池C3P0、DBCP、Druid等
Maven
· Maven環境搭建
· 本地倉庫&中央倉庫
· 創建Web工程
· 自動部署
· 持續繼承
· 持續部署
Linux
· VI/VIM編輯器
· 系統管理操作&遠程登錄
· 常用命令
· 軟體包管理&企業真題
Shell編程
· 自定義變數與特殊變數
· 運算符
· 條件判斷
· 流程式控制制
· 系統函數&自定義函數
· 常用工具命令
· 面試真題
Hadoop
· Hadoop生態介紹
· Hadoop運行模式
· 源碼編譯
· HDFS文件系統底層詳解
· DN&NN工作機制
· HDFS的API操作
· MapRece框架原理
· 數據壓縮
· Yarn工作機制
· MapRece案例詳解
· Hadoop參數調優
· HDFS存儲多目錄
· 多磁碟數據均衡
· LZO壓縮
· Hadoop基準測試
Zookeeper
· Zookeeper數據結果
· 內部原理
· 選舉機制
· Stat結構體
· 監聽器
· 分布式安裝部署
· API操作
· 實戰案例
· 面試真題
· 啟動停止腳本
HA+新特性
· HDFS-HA集群配置
Hive
· Hive架構原理
· 安裝部署
· 遠程連接
· 常見命令及基本數據類型
· DML數據操作
· 查詢語句
· Join&排序
· 分桶&函數
· 壓縮&存儲
· 企業級調優
· 實戰案例
· 面試真題
Flume
· Flume架構
· Agent內部原理
· 事務
· 安裝部署
· 實戰案例
· 自定義Source
· 自定義Sink
· Ganglia監控
Kafka
· 消息隊列
· Kafka架構
· 集群部署
· 命令行操作
· 工作流程分析
· 分區分配策略
· 數據寫入流程
· 存儲策略
· 高階API
· 低級API
· 攔截器
· 監控
· 高可靠性存儲
· 數據可靠性和持久性保證
· ISR機制
· Kafka壓測
· 機器數量計算
· 分區數計算
· 啟動停止腳本
DataX
· 安裝
· 原理
· 數據一致性
· 空值處理
· LZO壓縮處理
Scala
· Scala基礎入門
· 函數式編程
· 數據結構
· 面向對象編程
· 模式匹配
· 高階函數
· 特質
· 註解&類型參數
· 隱式轉換
· 高級類型
· 案例實操
Spark Core
· 安裝部署
· RDD概述
· 編程模型
· 持久化&檢查點機制
· DAG
· 運算元詳解
· RDD編程進階
· 累加器&廣播變數
Spark SQL
· SparkSQL
· DataFrame
· DataSet
· 自定義UDF&UDAF函數
Spark Streaming
· SparkStreaming
· 背壓機制原理
· Receiver和Direct模式原理
· Window原理及案例實操
· 7x24 不間斷運行&性能考量
Spark內核&優化
· 內核源碼詳解
· 優化詳解
Hbase
· Hbase原理及架構
· 數據讀寫流程
· API使用
· 與Hive和Sqoop集成
· 企業級調優
Presto
· Presto的安裝部署
· 使用Presto執行數倉項目的即席查詢模塊
Ranger2.0
· 許可權管理工具Ranger的安裝和使用
Azkaban3.0
· 任務調度工具Azkaban3.0的安裝部署
· 使用Azkaban進行項目任務調度,實現電話郵件報警
Kylin3.0
· Kylin的安裝部署
· Kylin核心思想
· 使用Kylin對接數據源構建模型
Atlas2.0
· 元數據管理工具Atlas的安裝部署
Zabbix
· 集群監控工具Zabbix的安裝部署
DolphinScheler
· 任務調度工具DolphinScheler的安裝部署
· 實現數倉項目任務的自動化調度、配置郵件報警
Superset
· 使用SuperSet對數倉項目的計算結果進行可視化展示
Echarts
· 使用Echarts對數倉項目的計算結果進行可視化展示
Redis
· Redis安裝部署
· 五大數據類型
· 總體配置
· 持久化
· 事務
· 發布訂閱
· 主從復制
Canal
· 使用Canal實時監控MySQL數據變化採集至實時項目
Flink
· 運行時架構
· 數據源Source
· Window API
· Water Mark
· 狀態編程
· CEP復雜事件處理
Flink SQL
· Flink SQL和Table API詳細解讀
Flink 內核
· Flink內核源碼講解
· 經典面試題講解
Git&GitHub
· 安裝配置
· 本地庫搭建
· 基本操作
· 工作流
· 集中式
ClickHouse
· ClickHouse的安裝部署
· 讀寫機制
· 數據類型
· 執行引擎
DataV
· 使用DataV對實時項目需求計算結果進行可視化展示
sugar
· 結合Springboot對接網路sugar實現數據可視化大屏展示
Maxwell
· 使用Maxwell實時監控MySQL數據變化採集至實時項目
ElasticSearch
· ElasticSearch索引基本操作、案例實操
Kibana
· 通過Kibana配置可視化分析
Springboot
· 利用Springboot開發可視化介面程序
❸ 哪位好心人能提供個最新flink視頻學習教程,感謝
大數據教程flink從入門到精通
了解Flink,了解集群環境搭建運維,學習Flink中重要概念、原理和API的用法,通過知識點 + 案例教學法幫助小白快速掌握Flink。
課程內容:
1、Flink框架簡介
2、Flink集群搭建運維
3、Flink Dataset開發
4、Flink 廣播變數,分布式緩存,累加器
5、Flink Datastream開發
6、Flink Window操作
7、Flink watermark與側道輸出
8、Flink狀態計算
9、Flink容錯checkpoint與一致性語義
10、Flink進階 非同步IO,背壓,內存管理
11、Flink Table API與SQL
❹ Apache Flink現在在大數據處理方面能夠和Apache Spark分庭抗禮么
我們是否還需要另外一個新的數據處理引擎?當我第一次聽到flink的時候這是我是非常懷疑的。在大數據領域,現在已經不缺少數據處理框架了,但是沒有一個框架能夠完全滿足不同的處理需求。自從Apache spark出現後,貌似已經成為當今把大部分的問題解決得最好的框架了,所以我對另外一款解決類似問題的框架持有很強烈的懷疑態度。
不過因為好奇,我花費了數個星期在嘗試了解flink。一開始仔細看了flink的幾個例子,感覺和spark非常類似,心理就傾向於認為flink又是一個模仿spark的框架。但是隨著了解的深入,這些API體現了一些flink的新奇的思路,這些思路還是和spark有著比較明顯的區別的。我對這些思路有些著迷了,所以花費了更多的時間在這上面。
flink中的很多思路,例如內存管理,dataset API都已經出現在spark中並且已經證明 這些思路是非常靠譜的。所以,深入了解flink也許可以幫助我們分布式數據處理的未來之路是怎樣的
在後面的文章里,我會把自己作為一個spark開發者對flink的第一感受寫出來。因為我已經在spark上幹了2年多了,但是只在flink上接觸了2到3周,所以必然存在一些bias,所以大家也帶著懷疑和批判的角度來看這篇文章吧。
Apache Flink是什麼
flink是一款新的大數據處理引擎,目標是統一不同來源的數據處理。這個目標看起來和spark和類似。沒錯,flink也在嘗試解決spark在解決的問題。這兩套系統都在嘗試建立一個統一的平台可以運行批量,流式,互動式,圖處理,機器學習等應用。所以,flink和spark的目標差別並不大,他們最主要的區別在於實現的細節。
後面我會重點從不同的角度對比這兩者。
Apache Spark vs Apache Flink
1.抽象 Abstraction
spark中,對於批處理我們有RDD,對於流式,我們有DStream,不過內部實際還是RDD.所以所有的數據表示本質上還是RDD抽象。
後面我會重點從不同的角度對比這兩者。在flink中,對於批處理有DataSet,對於流式我們有DataStreams。看起來和spark類似,他們的不同點在於:
一)DataSet在運行時是表現為運行計劃(runtime plans)的
在spark中,RDD在運行時是表現為java objects的。通過引入Tungsten,這塊有了些許的改變。但是在flink中是被表現為logical plan(邏輯計劃)的,聽起來很熟悉?沒錯,就是類似於spark中的dataframes。所以在flink中你使用的類Dataframe api是被作為第一優先順序來優化的。但是相對來說在spark RDD中就沒有了這塊的優化了。
flink中的Dataset,對標spark中的Dataframe,在運行前會經過優化。
在spark 1.6,dataset API已經被引入spark了,也許最終會取代RDD 抽象。
二)Dataset和DataStream是獨立的API
在spark中,所有不同的API,例如DStream,Dataframe都是基於RDD抽象的。但是在flink中,Dataset和DataStream是同一個公用的引擎之上兩個獨立的抽象。所以你不能把這兩者的行為合並在一起操作,當然,flink社區目前在朝這個方向努力(https://issues.apache.org/jira/browse/FLINK-2320),但是目前還不能輕易斷言最後的結果。
2.內存管理
一直到1.5版本,spark都是試用java的內存管理來做數據緩存,明顯很容易導致OOM或者gc。所以從1.5開始,spark開始轉向精確的控制內存的使用,這就是tungsten項目了
flink從第一天開始就堅持自己控制內存試用。這個也是啟發了spark走這條路的原因之一。flink除了把數據存在自己管理的內存以外,還直接操作二進制數據。在spark中,從1.5開始,所有的dataframe操作都是直接作用在tungsten的二進制數據上。
3.語言實現
spark是用scala來實現的,它提供了Java,Python和R的編程介面。
flink是java實現的,當然同樣提供了Scala API
所以從語言的角度來看,spark要更豐富一些。因為我已經轉移到scala很久了,所以不太清楚這兩者的java api實現情況。
4.API
spark和flink都在模仿scala的collection API.所以從表面看起來,兩者都很類似。下面是分別用RDD和DataSet API實現的word count
// Spark wordcount
object WordCount {
def main(args: Array[String]) {
val env = new SparkContext("local","wordCount")
val data = List("hi","how are you","hi")
val dataSet = env.parallelize(data)
val words = dataSet.flatMap(value => value.split("\\s+"))
val mappedWords = words.map(value => (value,1))
val sum = mappedWords.receByKey(_+_)
println(sum.collect())
}
}
// Flink wordcount
object WordCount {
def main(args: Array[String]) {
val env = ExecutionEnvironment.getExecutionEnvironment
val data = List("hi","how are you","hi")
val dataSet = env.fromCollection(data)
val words = dataSet.flatMap(value => value.split("\\s+"))
val mappedWords = words.map(value => (value,1))
val grouped = mappedWords.groupBy(0)
val sum = grouped.sum(1)
println(sum.collect())
}
}
不知道是偶然還是故意的,API都長得很像,這樣很方便開發者從一個引擎切換到另外一個引擎。我感覺以後這種Collection API會成為寫data pipeline的標配。
Steaming
spark把streaming看成是更快的批處理,而flink把批處理看成streaming的special case。這裡面的思路決定了各自的方向,其中兩者的差異點有如下這些:
實時 vs 近實時的角度
flink提供了基於每個事件的流式處理機制,所以可以被認為是一個真正的流式計算。它非常像storm的model。
而spark,不是基於事件的粒度,而是用小批量來模擬流式,也就是多個事件的集合。所以spark被認為是近實時的處理系統。
Spark streaming 是更快的批處理,而Flink Batch是有限數據的流式計算。
雖然大部分應用對准實時是可以接受的,但是也還是有很多應用需要event level的流式計算。這些應用更願意選擇storm而非spark streaming,現在,flink也許是一個更好的選擇。
流式計算和批處理計算的表示
spark對於批處理和流式計算,都是用的相同的抽象:RDD,這樣很方便這兩種計算合並起來表示。而flink這兩者分為了DataSet和DataStream,相比spark,這個設計算是一個糟糕的設計。
對 windowing 的支持
因為spark的小批量機制,spark對於windowing的支持非常有限。只能基於process time,且只能對batches來做window。
而Flink對window的支持非常到位,且Flink對windowing API的支持是相當給力的,允許基於process time,data time,record 來做windowing。
我不太確定spark是否能引入這些API,不過到目前為止,Flink的windowing支持是要比spark好的。
Steaming這部分flink勝
SQL interface
目前spark-sql是spark裡面最活躍的組件之一,Spark提供了類似Hive的sql和Dataframe這種DSL來查詢結構化數據,API很成熟,在流式計算中使用很廣,預計在流式計算中也會發展得很快。
至於flink,到目前為止,Flink Table API只支持類似DataFrame這種DSL,並且還是處於beta狀態,社區有計劃增加SQL 的interface,但是目前還不確定什麼時候才能在框架中用上。
所以這個部分,spark勝出。
Data source Integration
Spark的數據源 API是整個框架中最好的,支持的數據源包括NoSql db,parquet,ORC等,並且支持一些高級的操作,例如predicate push down
Flink目前還依賴map/rece InputFormat來做數據源聚合。
這一場spark勝
Iterative processing
spark對機器學習的支持較好,因為可以在spark中利用內存cache來加速機器學習演算法。
但是大部分機器學習演算法其實是一個有環的數據流,但是在spark中,實際是用無環圖來表示的,一般的分布式處理引擎都是不鼓勵試用有環圖的。
但是flink這里又有點不一樣,flink支持在runtime中的有環數據流,這樣表示機器學習演算法更有效而且更有效率。
這一點flink勝出。
Stream as platform vs Batch as Platform
Spark誕生在Map/Rece的時代,數據都是以文件的形式保存在磁碟中,這樣非常方便做容錯處理。
Flink把純流式數據計算引入大數據時代,無疑給業界帶來了一股清新的空氣。這個idea非常類似akka-streams這種。
成熟度
目前的確有一部分吃螃蟹的用戶已經在生產環境中使用flink了,不過從我的眼光來看,Flink還在發展中,還需要時間來成熟。
結論
目前Spark相比Flink是一個更為成熟的計算框架,但是Flink的很多思路很不錯,Spark社區也意識到了這一點,並且逐漸在採用Flink中的好的設計思路,所以學習一下Flink能讓你了解一下Streaming這方面的更迷人的思路。
❺ flink 1.10 1.12區別
flink 1.10 1.12區別在於Flink 1.12 支持了 Flink SQL Kafka upsert connector 。
因為在 Flink 1.10 中,當前這類任務開發對於用戶來說,還是不夠友好,需要很多代碼,同時也會造成 Flink SQL 冗長。
Flink 1.12 SQL Connector 支持 Kafka Upsert Connector,這也是我們公司內部業務方對實時平台提出的需求。
收益:便利用戶有這種需要從 kafka 取最新記錄操作的實時任務開發,比如這種 binlog -> kafka,然後用戶聚合操作,這種場景還是非常多的,這能提升實時作業開發效率,同時 1.12 做了優化,性能會比單純的 last_value 性能要好。
Flink Yarn 作業 On k8s 的生產級別能力是:
Flink Jar 作業已經全部 K8s 化,Flink SQL 作業由於是推廣初期,還是在 Yarn 上面進行運行,為了將實時計算 Flink 全部K8s化。
所以我們 Flink SQL 作業也需要遷移到 K8s,目前 Flink 1.12 已經滿足生產級別的 Flink k8s 功能,所以 Flink SQL K8s 化,打算直接使用社區的 On k8s 能力。
風險:雖然和社區的人溝通,Flink 1.12 on k8s 沒有什麼問題,但是具體功能還是需要先 POC 驗證一下,同時可能社區 Flink on k8s 的能力。
可能會限制我們這邊一些 k8s 功能使用,比如 hostpath volome 以及 Ingress 的使用,這里可能需要改底層源碼來進行快速支持(社區有相關 JIRA 要做)。
❻ Apache Flink是什麼
Flink為流處理和批處理應用公用一個通用的引擎。
1、數據量&吞吐量&延遲性
Flink 的流處理引擎只需要很少配置就能實現高吞吐率和低延遲。
2、支持 Event Time 和亂序事件
Flink 支持了流處理和 Event Time 語義的窗口機制。
Event time 使得計算亂序到達的事件或可能延遲到達的事件更加簡單。
3、狀態計算的 exactly-once 語義
流程序可以在計算過程中維護自定義狀態。
Flink 的 checkpointing 機制保證了即時在故障發生下也能保障狀態的 exactly once 語義。
4、高度靈活的流式窗口
Flink 支持在時間窗口,統計窗口,session 窗口,以及數據驅動的窗口
窗口可以通過靈活的觸發條件來定製,以支持復雜的流計算模式。
5、帶反壓的連續流模型
數據流應用執行的是不間斷的(常駐)operators。
Flink streaming 在運行時有著天然的流控:慢的數據 sink 節點會反壓(backpressure)快的數據源(sources)。
6、容錯性
Flink 的容錯機制是基於 Chandy-Lamport distributed snapshots 來實現的。
這種機制是非常輕量級的,允許系統擁有高吞吐率的同時還能提供強一致性的保障。
7、Batch 和 Streaming 一個系統流處理和批處理共用一個引擎
Flink 為流處理和批處理應用公用一個通用的引擎。批處理應用可以以一種特殊的流處理應用高效地運行。
8、內存管理
Flink 在 JVM 中實現了自己的內存管理。
應用可以超出主內存的大小限制,並且承受更少的垃圾收集的開銷。
9、迭代和增量迭代
Flink 具有迭代計算的專門支持(比如在機器學習和圖計算中)。
增量迭代可以利用依賴計算來更快地收斂。
10、程序調優
批處理程序會自動地優化一些場景,比如避免一些昂貴的操作(如 shuffles 和 sorts),還有緩存一些中間數據。
❼ 聊聊批計算、流計算、Hadoop、Spark、Storm、Flink等等
批:處理離線數據,冷數據。單個處理數據量大,處理速度比流慢。
流:處理在線,實時產生的數據。單次處理的數據量小,但處理速度更快。
Spark是UC Berkeley AMP lab所開源的類Hadoop MapRece的通用並行框架。
Spark,擁有Hadoop MapRece所具有的優點;但不同於MapRece的是Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的MapRece的演算法。
Spark 是一種與 Hadoop 相似的開源集群計算環境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負載方面表現得更加優越,換句話說, Spark 啟用了RDD(彈性分布式數據集),除了能夠提供互動式查詢外,它還可以優化迭代工作負載。RDD可以常駐內存的屬性,大大簡化了迭代計算所需的開銷,Spark任務可以立馬利用上一次計算出來的RDD來進行下次迭代。
Apache Hadoop中的MapRece是屬於離線計算技術;
Spark中Spark Core屬於離線計算技術,只不過它基於內存存儲中間結果,速度上比MapRece 快很多倍,又離實時計算技術很近;
Spark中Spark Streaming 子項目屬於實時計算技術,類似於Storm;
Spark中SparkSQL屬於離線計算技術,只不過它基於內存存儲中間結果,速度上比Hive快很多倍。
Spark並不是要成為一個大數據領域的「獨裁者」,一個人霸佔大數據領域所有的「地盤」,而是與Hadoop進行了高度的集成,兩者可以完美的配合使用。Hadoop的HDFS、Hive、HBase負責存儲,YARN負責資源調度;Spark負責大數據計算。實際上,Hadoop+Spark的組合,可以解決絕大部分大數據的場景。
Spark逐漸形成了一套完整的生態系統,既能夠提供內存計算框架,也可以支持SQL 即席查詢、實時流計算、機器學習和圖計算等。
Spark所提供的生態,可以支持如下3中場景:
一棧式解決方案(one stack to rule them all)
Spark包含了大數據領域常見的各種計算框架:
Spark streaming批量讀取數據源中的數據,然後把每個batch轉化成內部的RDD。Spark streaming以batch為單位進行計算(默認1s產生一個batch),而不是以Tuple為單位,大大減少了ack所需的開銷,顯著提高了吞吐。
但也因為處理數據的粒度變大,導致Spark streaming的數據延時不如Storm,Spark streaming是秒級返回結果(與設置的batch間隔有關),Storm則是毫秒級。
Storm提供了低延遲的計算,但是吞吐較低,並且無法保證exactly once(Storm trident採用batch的方式改善了這兩點),Spark streaming通過小批量的方式保證了吞吐的情況下,同時提供了exactly once語義,但是實時性不如Storm,而且由於採用micro-batch的方式,對window和event time的支持比較有限(Spark streaming 2.0中引入了window和event time,還在起步階段)。
Flink採用分布式快照的方式實現了一個高吞吐、低延遲、支持exactly once的流式系統,流式處理的方式也能更優雅的支持window和event time。
當然也不是說Flink一定就比Storm、Spark streaming好, 沒有最好的框架,只有最合適的框架 。根據自身的業務、公司的技術儲備選擇最合適的框架才是正確的選擇。
❽ Flink的類載入器解析
在運行 Flink 應用程序時,JVM 會隨著時間的推移載入各種類。 這些類可以根據它們的來源分為三組:
作為一般規則,無論何時您先啟動 Flink 進程然後再提交作業,作業的類都會動態載入。 如果 Flink 進程與作業/應用程序一起啟動,或者如果應用程序產生 Flink 組件(JobManager、TaskManager 等),那麼所有作業的類都在 Java 類路徑中。
插件組件中的代碼由每個插件的專用類載入器動態載入一次。
以下是有關不同部署模式的更多詳細信息:
當作為獨立會話啟動 Flink 集群時,JobManagers 和 TaskManagers 使用 Java 類路徑中的 Flink 框架類啟動。 針對會話(通過 REST / CLI)提交的所有作業/應用程序中的類都是動態載入的。
Docker / Kubernetes 設置首先啟動一組 JobManagers / TaskManagers,然後通過 REST 或 CLI 提交作業/應用程序,其行為類似於獨立會話:Flink 的代碼位於 Java 類路徑中,插件組件和作業代碼在啟動時動態載入。
YARN 類載入在單個作業部署和會話之間有所不同:
當直接向 YARN 提交 Flink 作業/應用程序時(通過 bin/flink run -m yarn-cluster ...),將為該作業啟動專用的 TaskManager 和 JobManager。 這些 JVM 在 Java 類路徑中具有用戶代碼類。 這意味著在這種情況下,作業不涉及動態類載入。
當啟動一個 YARN 會話時,JobManagers 和 TaskManagers 是用 classpath 中的 Flink 框架類啟動的。 針對會話提交的所有作業的類都是動態載入的。
在涉及動態類載入的設置中(插件組件、會話設置中的 Flink 作業),通常有兩個類載入器的層次結構:(1)Java 的應用程序類載入器,它包含類路徑中的所有類,以及(2)動態插件/ 用戶代碼類載入器。 用於從插件或用戶代碼 jar 載入類。 動態 ClassLoader 將應用程序類載入器作為其父級。
默認情況下,Flink 反轉類載入順序,這意味著它首先查看動態類載入器,如果類不是動態載入代碼的一部分,則僅查看父類(應用程序類載入器)。
反向類載入的好處是插件和作業可以使用與 Flink 核心本身不同的庫版本,這在不同版本的庫不兼容時非常有用。 該機制有助於避免常見的依賴沖突錯誤,如 IllegalAccessError 或 NoSuchMethodError。 代碼的不同部分只是具有單獨的類副本(Flink 的核心或其依賴項之一可以使用與用戶代碼或插件代碼不同的副本)。 在大多數情況下,這運行良好,不需要用戶進行額外配置。
但是,在某些情況下,反向類載入會導致問題(請參閱下文,「X cannot be cast to X」)。 對於用戶代碼類載入,您可以通過在 Flink 配置中通過 classloader.resolve-order 將 ClassLoader 解析順序配置為 parent-first(從 Flink 的默認 child-first)來恢復到 Java 的默認模式。
請注意,某些類總是以父級優先的方式解析(首先通過父類載入器),因為它們在 Flink 的核心和插件/用戶代碼或面向插件/用戶代碼的 API 之間共享。 這些類的包是通過 classloader.parent-first-patterns-default 和 classloader.parent-first-patterns-additional 配置的。 要添加父級優先載入的新包,請設置 classloader.parent-first-patterns-additional 配置選項。
所有組件(JobManger、TaskManager、Client、ApplicationMaster 等)在啟動時記錄它們的類路徑設置。 它們可以作為日誌開頭的環境信息的一部分找到。
當運行 JobManager 和 TaskManagers 專用於一項特定作業的設置時,可以將用戶代碼 JAR 文件直接放入 /lib 文件夾中,以確保它們是類路徑的一部分而不是動態載入。
通常將作業的 JAR 文件放入 /lib 目錄中。 JAR 將成為類路徑(AppClassLoader)和動態類載入器(FlinkUserCodeClassLoader)的一部分。 因為 AppClassLoader 是 FlinkUserCodeClassLoader 的父級(並且 Java 載入父級,默認情況下),這應該導致類只載入一次。
對於無法將作業的 JAR 文件放入 /lib 文件夾的設置(例如因為安裝程序是由多個作業使用的會話),仍然可以將公共庫放入 /lib 文件夾,並避免動態為那些類進行載入。
在某些情況下,轉換函數、源或接收器需要手動載入類(通過反射動態載入)。 為此,它需要能夠訪問作業類的類載入器。
在這種情況下,函數(或源或接收器)可以成為 RichFunction(例如 RichMapFunction 或 RichWindowFunction)並通過 getRuntimeContext().getUserCodeClassLoader() 訪問用戶代碼類載入器。
在使用動態類載入的設置中,您可能會看到 com.foo.X cannot be cast to com.foo.X 樣式中的異常。 這意味著 com.foo.X 類的多個版本已被不同的類載入器載入,並且該類的類型試圖相互分配。
一個常見的原因是庫與 Flink 的反向類載入方法不兼容。 您可以關閉反向類載入來驗證這一點(在 Flink 配置中設置 classloader.resolve-order: parent-first)或從反向類載入中排除庫(在 Flink 配置中設置 classloader.parent-first-patterns-additional)。
另一個原因可能是緩存對象實例,如 Apache Avro 之類的某些庫或通過注冊(例如通過 Guava 的 Interners)生成的對象實例。 這里的解決方案是要麼在沒有任何動態類載入的情況下進行設置,要麼確保相應的庫完全是動態載入代碼的一部分。 後者意味著該庫不能被添加到 Flink 的 /lib 文件夾中,而必須是應用程序的 fat-jar/uber-jar 的一部分
所有涉及動態用戶代碼類載入(會話)的場景都依賴於再次卸載類。 類卸載意味著垃圾收集器發現類中不存在任何對象,因此刪除該類(代碼、靜態變數、元數據等)。
每當 TaskManager 啟動(或重新啟動)一個任務時,它將載入該特定任務的代碼。 除非可以卸載類,否則這將成為內存泄漏,因為載入了新版本的類,並且載入的類總數會隨著時間的推移而累積。 這通常通過 OutOfMemoryError: Metaspace 表現出來。
類泄漏的常見原因和建議的修復:
卸載動態載入類的一個有用工具是用戶代碼類載入器釋放鉤子。 這些是在卸載類載入器之前執行的鉤子。 通常建議關閉和卸載資源作為常規函數生命周期的一部分(通常是 close() 方法)。 但在某些情況下(例如對於靜態欄位),最好在不再需要類載入器時卸載。
類載入器釋放鉤子可以通過 RuntimeContext.() 方法注冊。
從應用程序開發人員的角度解決依賴沖突的一種方法是通過隱藏它們來避免暴露依賴關系。
Apache Maven 提供了 maven-shade-plugin,它允許在編譯後更改類的包(因此您編寫的代碼不受陰影影響)。 例如,如果您的用戶代碼 jar 中有來自 aws sdk 的 com.amazonaws 包,則 shade 插件會將它們重新定位到 org.myorg.shaded.com.amazonaws 包中,以便您的代碼調用您的 aws sdk 版本。
注意 Flink 的大部分依賴,比如 guava、netty、jackson 等,都被 Flink 的維護者屏蔽掉了,所以用戶通常不用擔心。