创业公司有很多东西是从探索慢慢走向成熟的,当然探索的过程也是站在了巨人的肩膀上的!
去年才接触到Thrift,它作为一个可扩展且跨语言的服务框架确实比较好用,利用它搭建一个服务是个非常容易的事情,现在也有很多公司开始使用这个框架了。
今年由于业务量的增长非常迅猛,数据流架构上也要相应的调整,随之数据也就迁移到HDFS上去了,同时也问题来了,怎么用Thrift的API从HDFS读取二进制数据?Google了一下发现这个东西是没有,至少在我们现在使用的这个版本里是没有这个东东的。怎么办?只有自己写一个API了。
Thrift在把数据的读取抽象出了两层,传输层和协议层以及应用层对应于Transport和Portocol,Transport负责把数据变成字节流,而Protocol负责把字节流数据序列化(serialize),从这里就可以看出只需要自己实现一个从HDFS读取数据的Transport层就行了。
在之前公司里的同事在测试thrift的读写API的时候发现如果用BufferedTransport的时候C的读Java写的文件或者Java读C写的文件会出错,原因是大小头问题,所以公司一直是使用的不带Buffer的Transport,这就导致读写速度一直很慢,不过由于数据量不是太大,也就忍了!
这次改造我正好想尝试使用带Buffer的Transport看看哪里会有问题,写好THDFSTransport后经测试发现不带Buffer的Transport非常之慢,慢到已经无法处理数据的地步了,于是就改成带Buffer。测试对比结果大致如下:
三次平均下来,无buffer读1.97M/s,有buffer的读为39.31M/s
三次平均下来 , 无buffe写1.62M/s,有buffer的写为47.99M/s
可以看出读写在是否存在Buffer上差距有20+倍。
改写为从HDFS处理数据后硬盘压力没了,机器也快了,单机每天处理4亿毫无压力啊。
用python和java都读写了一些数据来看看是否存在大小头问题,结果发现不存在这样的问题?
不知道是否有其他人遇到同样的问题?
Thrift的相关资料链接:http://thrift.apache.org/