Apache Avro作為一個內置的數據源在Apache 2.4火花
2018年11月30日 在工程的博客
Apache Avro是一種流行的數據序列化格式。廣泛用於Apache火花和Apache Hadoop生態係統,特別是對於Kafka-based數據管道。從Apache 2.4火花釋放,引發閱讀和寫作Avro數據提供了內置的支持。新的內置spark-avro模塊是最初從磚的開源項目Avro數據源為Apache火花(稱為spark-avro從現在開始)。另外,它還提供了:
- 新功能from_avro ()和to_avro ()讀寫DataFrame Avro數據而不是文件。
- Avro邏輯類型支持,包括小數,日期和時間戳,類型。有關詳細信息,請參閱相關的模式轉換。
- 2 x讀提高吞吐量和10%寫提高吞吐量。
在這個博客中,我們檢查每個上述特性的例子,給你一個味道的簡單API使用,性能改進和優點。
加載和保存功能
在Apache 2.4火花,Avro加載/保存數據格式,您可以簡單地指定文件格式為“Avro”DataFrameReader DataFrameWriter。的一致性和熟悉,使用類似於其他數據源。
val usersDF = spark.read。格式(“avro”).load (“例子/ src / main /資源/ users.avro”)usersDF.select (“名稱”,“favorite_color”).write。格式(“avro”).save (“namesAndFavColors.avro”)
的力量from_avro()和to_avro ()
為了進一步簡化數據轉換管道,我們引入了兩個新的內置函數:from_avro ()和to_avro ()。Avro通常用於序列化/反序列化消息/ Apache Kafka-based數據管道中的數據。使用Avro記錄作為列讀取或寫入卡夫卡時是有用的。每個卡夫卡鍵-值記錄增強一些元數據,如攝入時間戳到卡夫卡,卡夫卡的抵消,等等。
有三個實例,這些功能是有用的:
- 當火花從卡夫卡讀取Avro二進製數據,from_avro ()可以提取數據、清潔它,改變它。
- 當你想要改變你的結構成Avro二進製記錄,然後把他們下遊再次卡夫卡或寫一個文件,使用to_avro ()。
- 當你想要將多個列成一個編碼,使用to_avro ()。
兩個函數隻有在Scala和Java。
< br / >進口org.apache.spark.sql.avro._/ /“from_avro”需要Avro JSON字符串格式的模式。val jsonFormatSchema =新字符串(Files.readAllBytes (Paths.get (”。/例子/ src / main /資源/ user.avsc”)))
val df =火花.readStream.format (“卡夫卡”).option (“kafka.bootstrap.servers”,“host1:端口1,host2:端口2”).option (“訂閱”,“人類”).load ()/ / 1。解碼Avro數據結構;/ / 2。過濾列“favorite_color”;/ / 3。在Avro格式編碼列的名字”。val輸出= df.select (from_avro (“價值,jsonFormatSchema)”用戶)其中(“用戶。favorite_color = = \“紅色\ ").select (to_avro(美元)“user.name”)作為“價值)val查詢=輸出.writeStream.format(“卡夫卡”).option (“kafka.bootstrap。服務器”、“host1:端口1,host2:端口2”).option(“主題”、“話題二”).start ()
更多的例子,請參閱讀和寫流與DataFrames Avro數據。
兼容數據磚spark-avro
內置的spark-avro模塊兼容磚的開源庫spark-avro。
讀/寫數據使用以前創建的源表com.databricks.spark.avro
,您可以加載/寫這些相同的表使用這個內置Avro模塊,沒有任何代碼更改。事實上,如果你喜歡使用自己的構建spark-avro jar文件,您可以禁用該配置spark.sql.legacy.replaceDatabricksSparkAvro.enabled
,使用的選項——罐子
當部署您的應用程序。讀了先進的依賴管理部分的應用程序提交指南為更多的細節。
性能改進
IO優化火星- 24800,內置Avro數據源實現性能改進讀寫Avro文件。我們進行了一些基準測試和觀察2 x的性能在讀取,而8%的改善寫道。
配置和方法論
我們跑的基準在單個節點上Apache火花集群磚社區版。詳細的實施的基準,檢查Avro基準筆記本。
如圖表所示,讀取性能幾乎2倍,寫性能也提高8%。
配置信息:
- 數據:1 m-row DataFrame列的各種類型:Int /雙/字符串/地圖/數組/結構體,等等。
- 集群- 6.0 GB的內存,0.88內核,1
- 磚的運行時版本的:5.0(使用新的內置spark-avro)和4.0(與外部數據磚spark-avro庫)
結論
新的內置spark-avro模塊提供了更好的用戶體驗和IO性能在SQL和火花結構化流。原spark-avro將棄用的新的內置支持Avro火花本身。
你可以試試的Apache 2.4火花釋放與這個包磚5.0運行時今天。了解更多關於如何使用Apache Avro結構化流在雲中,閱讀我們的文檔Azure磚或AWS。