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