How to read binary data from HDFS with Thrift?

来源:互联网 发布:java向ftp上传文件 编辑:程序博客网 时间:2024/05/17 02:36


     创业公司有很多东西是从探索慢慢走向成熟的,当然探索的过程也是站在了巨人的肩膀上的! 

     去年才接触到Thrift,它作为一个可扩展且跨语言的服务框架确实比较好用,利用它搭建一个服务是个非常容易的事情,现在也有很多公司开始使用这个框架了。

    今年由于业务量的增长非常迅猛,数据流架构上也要相应的调整,随之数据也就迁移到HDFS上去了,同时也问题来了,怎么用ThriftAPIHDFS读取二进制数据?Google了一下发现这个东西是没有,至少在我们现在使用的这个版本里是没有这个东东的。怎么办?只有自己写一个API了。

     Thrift在把数据的读取抽象出了两层,传输层和协议层以及应用层对应于TransportPortocolTransport负责把数据变成字节流,而Protocol负责把字节流数据序列化(serialize),从这里就可以看出只需要自己实现一个从HDFS读取数据的Transport层就行了。

      在之前公司里的同事在测试thrift的读写API的时候发现如果用BufferedTransport的时候C的读Java写的文件或者JavaC写的文件会出错,原因是大小头问题,所以公司一直是使用的不带BufferTransport,这就导致读写速度一直很慢,不过由于数据量不是太大,也就忍了!

      这次改造我正好想尝试使用带BufferTransport看看哪里会有问题,写好THDFSTransport后经测试发现不带BufferTransport非常之慢,慢到已经无法处理数据的地步了,于是就改成带Buffer。测试对比结果大致如下:

     三次平均下来,无buffer1.97M/s,有buffer的读为39.31M/s

     

How to read binary data from HDFS with Thrift? - zengkui111 - zengkui111的博客

   三次平均下来 , 无buffe写1.62M/s,有buffer的写为47.99M/s

    

How to read binary data from HDFS with Thrift? - zengkui111 - zengkui111的博客


       可以看出读写在是否存在Buffer上差距有20+倍。

       改写为从HDFS处理数据后硬盘压力没了,机器也快了,单机每天处理4亿毫无压力啊。

       用pythonjava都读写了一些数据来看看是否存在大小头问题,结果发现不存在这样的问题?

不知道是否有其他人遇到同样的问题?

 

Thrift的相关资料链接:http://thrift.apache.org/


原创粉丝点击