摘要:前言這一講將介紹一下序列化機制和過程函數。然而由于的類型擦除,自動提取并不是總是有效。開發者在自定義類上使用注解,隨后創建相應的并覆蓋方法。
前言
這一講將介紹一下序列化機制和過程函數(processfunction)。
序列化機制
使用 Flink 編寫處理邏輯時,新手總是容易被林林總總的概念所混淆:
為什么 Flink 有那么多的類型聲明方式? BasicTypeInfo.STRING_TYPE_INFO、Types.STRING 、Types.STRING() 有何區別? TypeInfoFactory 又是什么? TypeInformation.of 和 TypeHint 是如何使用的呢?
接下來本文將逐步解密 Flink 的類型和序列化機制(TypeInformation)。
Flink 的類型系統源碼位于 org.apache.flink.api.common.typeinfo 包,讓我們對上圖TypeInformation深入追蹤,看一下類的繼承關系圖:
可以看到,上面兩個圖片是一一對應的,TypeInformation 類是描述一切類型的公共基類,它和它的所有子類必須可序列化(Serializable),因為類型信息將會伴隨 Flink 的作業提交,被傳遞給每個執行節點。
由于 Flink 自己管理內存,采用了一種非常緊湊的存儲格式(見官方博文),因而類型信息在整個數據處理流程中屬于至關重要的元數據。
TypeExtractror 類型提取
Flink 內部實現了名為 TypeExtractror 的類,可以利用方法簽名、子類信息等蛛絲馬跡,自動提取和恢復類型信息(當然也可以顯式聲明,即本文所介紹的內容)。
然而由于 Java 的類型擦除,自動提取并不是總是有效。因而一些情況下(例如通過 URLClassLoader 動態加載的類),仍需手動處理;例如下圖中對 DataSet 變換時,使用 .returns() 方法聲明返回類型。
這里需要說明一下,returns() 接受三種類型的參數:字符串描述的類名(例如 "String")、TypeHint(接下來會講到,用于泛型類型參數)、Java 原生 Class(例如 String.class) 等;不過字符串形式的用法即將廢棄,如果確實有必要,請使用 Class.forName() 等方法來解決。
聲明類型信息的常見手段
通過 TypeInformation.of() 方法,可以簡單地創建類型信息對象。
1. 對于非泛型的類,直接傳入 Class 對象即可
2.對于泛型類,需要借助 TypeHint 來保存泛型類型信息
3. 預定義的快捷方式 例如 BasicTypeInfo,這個類定義了一系列常用類型的快捷方式,對于 String、Boolean、Byte、Short、Integer、Long、Float、Double、Char 等基本類型的類型聲明,可以直接使用。
4. 自定義 TypeInfo 和 TypeInfoFactory
通過自定義 TypeInfo 為任意類提供 Flink 原生內存管理(而非 Kryo),可令存儲更緊湊,運行時也更高效。
開發者在自定義類上使用 @TypeInfo 注解,隨后創建相應的 TypeInfoFactory 并覆蓋 createTypeInfo 方法。
注意需要繼承 TypeInformation 類,為每個字段定義類型,并覆蓋元數據方法,例如是否是基本類型(isBasicType)、是否是 Tuple(isTupleType)、元數(對于一維的 Row 類型,等于字段的個數)等等,從而為 TypeExtractor 提供決策依據。
更多示例,請參考 Flink 源碼的 org/apache/flink/api/java/typeutils/TypeInfoFactoryTest.java
Kryo 序列化
待研究中...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75782.html
摘要:另外,將機制發揚光大,對有著非常好的支持。系統也注意到并討論了和的問題。總結本文分享了四本相關的書籍和一份領域相關的論文列表篇,涉及的設計,實現,故障恢復,彈性擴展等各方面。 前言 之前也分享了不少自己的文章,但是對于 Flink 來說,還是有不少新入門的朋友,這里給大家分享點 Flink 相關的資料(國外數據 pdf 和流處理相關的 Paper),期望可以幫你更好的理解 Flink。...
摘要:前言最近因公司業務需求,需要使用到大數據分析。提供的可用于處理無盡的數據流。類似于把一個記錄拆分成兩條三條甚至是四條記錄例如把一個字符串分割成一個字符數組。是一個聚合操作,如計數求和求平均等。實現把兩個流連成一個流。 前言 最近因公司業務需求,需要使用到大數據分析。選擇了flink,第一次聽說flink我也是很懵逼的狀態,不過一段時間下來有了一點心得,在這里和大家分享分享。有很多描述不...
摘要:由于配置流是從關系型數據庫中讀取,速度較慢,導致實時數據流流入數據的時候,配置信息還未發送,這樣會導致有些實時數據讀取不到配置信息。從數據庫中解析出來,再去統計近兩周占比。 showImg(https://segmentfault.com/img/remote/1460000019367651); Flink 學習項目代碼 https://github.com/zhisheng17/f...
摘要:模塊中的類結構如下博客從到學習介紹從到學習上搭建環境并構建運行簡單程序入門從到學習配置文件詳解從到學習介紹從到學習如何自定義從到學習介紹從到學習如何自定義從到學習轉換從到學習介紹中的從到學習中的幾種詳解從到學習讀取數據寫入到從到學 Flink-Client 模塊中的類結構如下: https://t.zsxq.com/IMzNZjY showImg(https://segmentfau...
閱讀 882·2021-09-02 09:55
閱讀 1521·2019-12-27 12:02
閱讀 1730·2019-08-30 14:24
閱讀 1151·2019-08-30 14:18
閱讀 2764·2019-08-29 13:57
閱讀 2210·2019-08-26 11:51
閱讀 1376·2019-08-26 10:37
閱讀 775·2019-08-23 16:09