内容简介:在hadoop 生态圈,我们经常会看到 avro, avro 是什么呢,首先 avro 是可以作为一种基于二进制数据传输高性能的中间件, 比如在 Flume 中,我们使用 avro sinker 来发送数据,使用 avro source 来接受网络数据。avro 尽管提供了 rpc 机制,事实上Avro的核心特性决定了它通常用在“大数据”存储场景, 即我们通过借助schema将数据写入到“本地文件”或者HDFS中,然后reader再根据schema去迭代获取数据条目, 好处是它的schema 是动态可演变
在hadoop 生态圈,我们经常会看到 avro, avro 是什么呢,首先 avro 是可以作为一种基于二进制数据传输高性能的中间件, 比如在 Flume 中,我们使用 avro sinker 来发送数据,使用 avro source 来接受网络数据。
avro 尽管提供了 rpc 机制,事实上Avro的核心特性决定了它通常用在“大数据”存储场景, 即我们通过借助schema将数据写入到“本地文件”或者HDFS中,然后reader再根据schema去迭代获取数据条目, 好处是它的schema 是动态可演变的,这种强大的可扩展性正是“文件数据”存储所必须的。
在 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 实现类,当然这些我们完全不需要关心。
from_avro() and to_avro()
我们都知道,在kafka 中是可以写入 avro 格式的数据,比如 flume 收集的数据就可以直接用 avro 格式写入 kafka, 针对这种场景, 官方内置了两个函数,from_avro() , to_avro(), 很实用,我们从kafka 中加载数据到 spark , schema 中有这么几个字段:
这里的 value 是一个字节数组,如果kafka中是 avro 格式的数据,那么这个字节数组中保存的就是 avro 格式的数据,这时候你只需要使用 from_avro() 函数,同时传入一个avro shema(你使用json 格式定义的 avro schema), 就可以轻松的转换,后面你就可以使用 avro 定义的字段进行相应的操作了 :
如果你想使用 avro 格式写入kafka 就更方便了,上述例子中,使用o_avro() 转换为avro 格式,然后 输出到 kafka中。
你的老代码应该怎么办
spark2.4 中的内置的 avro 完全兼容原来的第三方库中的 spark-avro,也就是说如果你原来使用的 format 是 com.databricks.spark.avro , 现在这个代码你完全不用动,如果说你自己在第三方库上做了自己的变更,就是想用外部引用过来的类,也可以,设置 spark.sql.legacy.replaceDatabricksSparkAvro.enabled 为 false 就行。
性能提升
这个性能提升才应该是我们使用新版本最大的动力,这个性能优化在哪里呢,SPARK-24800, 大家可以看下这个 pr 学习一下,我们都知道 spark 内部数据流转格式是 InternalRow,DataFrame 的Row 是要靠 RowEncoder 转换为 InternalRow 格式的, 对于avro 格式来将,原来的实现方式是先把 avro 格式转换为 Row, 然后把 Row 转换为 InternalRow, 新的实现方式是直接把 avro 格式转换为 InternalRow, 省了一步。
下面有一个 databrick 官方做的性能测试报告:
可以看到,读性能提高了一倍,写性能提高了8%左右,这么来看,spark2.4 中使用 avro 确实便利了很多,而且有了 IO 性能的提高,估计以后最新的变动应该第一时间体现在内置的 avro 支持中,而不是第三方的库里面。
所以升不升级你看着办,我先升为敬
大家都在看
▼
关注 【spark技术分享】
一起撸spark源码,一起玩spark最佳实践
听说新版微信这有个好看
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Machine Learning in Action
Peter Harrington / Manning Publications / 2012-4-19 / GBP 29.99
It's been said that data is the new "dirt"—the raw material from which and on which you build the structures of the modern world. And like dirt, data can seem like a limitless, undifferentiated mass. ......一起来看看 《Machine Learning in Action》 这本书的介绍吧!