作为一个avro库,spavro是使用cython的(sp)eedier avro实现——spavro是apache avro python 2官方实现的分支,其目标是大大提高数据读取反序列化和写入序列化性能。
spavro的Python项目详细描述
(SP)EEDIER AVRO-斯帕夫罗
spavro是official Apache AVRO python 2 implementation的分支,其目标是大大提高数据读反序列化和写序列化性能。
spavro也兼容python 2/3(而不是sperate项目/实现)。Currently tested使用python 2.7、3.3、3.4、3.5和3.6。由于使用Unicode文本和其他兼容性功能,不支持3.3之前的Python版本。
实施细节
官方实施与spavro有三个主要区别。首先,spavro使用cython创建的c扩展来加速一些低级二进制序列化逻辑。另外,spavro使用不同的模式来处理模式。spavro试图解析写和读模式once并且只解析once并从模式定义创建递归读/写函数。这些读写器函数对模式的类型结构进行编码,因此在处理数据时不需要额外的查找。最后一个区别是spavro已经使用six
库更新为python 2和python 3兼容。正式的apache avro实现对于python 2和python 3有两个独立的代码库,而spavro只有一个。
这有助于大大提高读写单个数据的吞吐量,因为模式不是针对每个数据进行查询的。这对于“兼容”模式的读取尤其有益,因为读和写模式都需要能够读取完整的数据集。
性能/基准
结果
这些测试是使用运行centos 7的aws m4.large
实例运行的。它们的运行版本如下:avro-python3==1.8.2
,fastavro==0.17.9
,spavro==1.1.10
。python3.6.4
用于python 3测试。
tldr是spavro拥有默认apache avro实现的14-23x吞吐量和fastavro库的2-4x吞吐量(取决于记录的形状)。
反序列化avro记录(读取)
每秒读取记录数:
每秒基准(单个字段)读取:
序列化avro记录(写入)
每秒写入记录数:
每秒基准(单个字段)写入:
方法论
基准测试是使用存储库中/benchmarks
路径中的benchmark.py
脚本执行的(如果您想运行自己的测试)。
导致创建spavro的许多记录都是{"type": "record", "name": "somerecord", "fields": [1 ... n fields usually with a type of the form of a union of ['null' and a primitive type]]}
形式的,因此创建基准来模拟这种类型的记录结构。我相信这是avro的一个very常见用例,因此基准是围绕这个模式创建的。
基准创建一个包含字符串、double、long和布尔类型的随机记录模式,并创建一个随机记录生成器来测试该模式。伪随机生成器使用相同的字符串进行播种,以使结果具有确定性(但记录不同)。记录中的字段数量从1个到500个不等,并且针对每个情况测试了avro实现的性能。
序列化程序和反序列化程序基准在内存中创建一个模拟记录数组,然后尝试使用三种不同的实现尽快处理它们。这意味着最大工作大小仅限于内存(模拟记录中的记录数和字段数的组合)。对于这些基准,每次运行处理5 m基准(除以每个记录中的字段数)。
架构/记录/实现的每次运行都重复十次,并平均完成时间。
API
spavro保留默认的apache库的api。这使得spavro可以代替使用t现有的Apache实现。
测试
由于API与现有库匹配,现有的大多数APACHE测试套件用于验证SPAVro的正确操作。spavro添加了一些额外的正确性测试来比较新旧行为,以及原始库之上和之外的一些额外逻辑测试。一些基于java的“map reduce”测试(特别是系链测试)被删除,因为spavro不包含实现该逻辑的java代码。