关注 spark技术分享,
撸spark源码 玩spark最佳实践

学习 | Spark 2.4 原生支持内置支持avro, spark read avro

在hadoop 生态圈,我们经常会看到 avro, avro 是什么呢,首先 avro 是可以作为一种基于二进制数据传输高性能的中间件, 比如在 Flume 中,我们使用 avro sinker 来发送数据,使用 avro source 来接受网络数据。

avro 尽管提供了 rpc 机制,事实上Avro的核心特性决定了它通常用在“大数据”存储场景, 即我们通过借助schema将数据写入到“本地文件”或者HDFS中,然后reader再根据schema去迭代获取数据条目, 好处是它的schema 是动态可演变的,这种强大的可扩展性正是“文件数据”存储所必须的。

关键词: Spark 2.4 原生支持内置支持avro, spark read avro

在 spark2.4 之前的版本中,我们如果需要在 spark 中读取 avro 格式的文件,通常要使用第三方库, 也就是这个项目 https://github.com/databricks/spark-avro,  spark2.4中内置了对avro 格式的支持,有以下好处

  • 不用依赖第三方包,开箱即用

  • 可以在 DataFrame 中方便使用 from_avro() ,  to_avro()  转来转去

  • 支持 Logical types , 也就是我们自己扩展出来的 avro 格式

  • 读性能 2倍提升,写性能 提高10%, 原因下文中说明

可以看到,databrick 的人觉得 avro 还是一种很重要的格式,有必要把他放在 spark sql 源码中内置了,不用你再去别的地方去引用,同时官方也顺手做了些性能优化

一个简单的例子

spark2.4中,读取和写入 avro 格式极其方便,只要指定一下 format 为 avro 即可,指定后, DataFrameReader 和 DataFrameWriter 就可以找到相关的 source 实现类,当然这些我们完全不需要关心。

学习 | Spark 2.4 原生支持了avro, 别再引用第三方库了

from_avro() and to_avro()

 

我们都知道,在kafka 中是可以写入 avro 格式的数据,比如 flume 收集的数据就可以直接用 avro 格式写入 kafka, 针对这种场景, 官方内置了两个函数,from_avro() , to_avro(), 很实用,我们从kafka 中加载数据到 spark , schema 中有这么几个字段:

学习 | Spark 2.4 原生支持了avro, 别再引用第三方库了

 

关键词: Spark 2.4 原生支持内置支持avro, spark read avro

这里的 value 是一个字节数组,如果kafka中是 avro 格式的数据,那么这个字节数组中保存的就是 avro 格式的数据,这时候你只需要使用 from_avro()  函数,同时传入一个avro shema(你使用json 格式定义的 avro schema), 就可以轻松的转换,后面你就可以使用 avro 定义的字段进行相应的操作了 :

学习 | Spark 2.4 原生支持了avro, 别再引用第三方库了

如果你想使用 avro 格式写入kafka 就更方便了,上述例子中,使用o_avro() 转换为avro 格式,然后 输出到 kafka中。

关键词: Spark 2.4 原生支持内置支持avro, spark read avro

你的老代码应该怎么办

spark2.4 中的内置的 avro 完全兼容原来的第三方库中的 spark-avro,也就是说如果你原来使用的 format 是 com.databricks.spark.avro , 现在这个代码你完全不用动,如果说你自己在第三方库上做了自己的变更,就是想用外部引用过来的类,也可以,设置 spark.sql.legacy.replaceDatabricksSparkAvro.enabled 为 false 就行。

关键词: Spark 2.4 原生支持内置支持avro, spark read avro

性能提升

这个性能提升才应该是我们使用新版本最大的动力,这个性能优化在哪里呢,SPARK-24800, 大家可以看下这个 pr 学习一下,我们都知道 spark 内部数据流转格式是 InternalRow,DataFrame 的Row 是要靠 RowEncoder 转换为 InternalRow 格式的, 对于avro 格式来将,原来的实现方式是先把 avro 格式转换为 Row, 然后把 Row 转换为 InternalRow, 新的实现方式是直接把 avro 格式转换为 InternalRow, 省了一步。

下面有一个 databrick 官方做的性能测试报告:

学习 | Spark 2.4 原生支持了avro, 别再引用第三方库了

可以看到,读性能提高了一倍,写性能提高了8%左右,这么来看,spark2.4 中使用 avro 确实便利了很多,而且有了 IO 性能的提高,估计以后最新的变动应该第一时间体现在内置的 avro 支持中,而不是第三方的库里面。

关键词: Spark 2.4 原生支持内置支持avro, spark read avro

所以升不升级你看着办,我先升为敬

 

大家都在看

spark sql源码系列:

是时候学习真正的spark技术了从0到1认识 spark sql

structured streaming 系列:

structured streaming 原理剖析structured streaming 碰上kafkastructured streaming 是如何搞定乱序时间的

spark streaming 系列:

spark streaming 读取kafka各种姿势详解spark streaming流式计算中的困境与解决之道

spark core 系列:

彻底搞懂spark shuffle过程(1)彻底搞懂spark shuffle过程(2)spark内存管理-Tungsten框架探秘

spark 机器学习系列

 

 

关注【spark技术分享】

一起撸spark源码,一起玩spark最佳实践

学习 | Spark 2.4 原生支持了avro, 别再引用第三方库了

听说新版微信这有个好看

原文始发于微信公众号(spark技术分享):学习 | Spark 2.4 原生支持了avro, 别再引用第三方库了

赞(0) 打赏
未经允许不得转载:spark技术分享 » 学习 | Spark 2.4 原生支持内置支持avro, spark read avro
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

关注公众号:spark技术分享

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏