这两天正在做mysql到hbase的数据迁移,本人java玩不转,用的是thrift hbase的手段。 一开始写入的时候,速度居然才有100,这太闹了把。 忍无可忍也,查了下资料,别人是用java,速度基本是在1500左右。 我就纳闷了,用java速度提升最主要是有 个叫做 setautoflush的东西。
public static void putData(String tableName) throws IOException{ HTable table = (HTable) tablePool.getTable(tableName);// 获取表 System.out.println("Auto flush:" + table.isAutoFlush()); table.setAutoFlush(false); Put put1 = new Put(Bytes.toBytes("rowkey1"));
thrift作为rpc的一个服务层,他下面调用的应该也是java的类库,为啥就没有这相关的尼 。
最后看了下源码,里面有个buffer ,咱们调用的时候,传递一个buffer值就行了 。 如果压力源如果的话,python thrift的写入速度是可以到1k左右的。 下面的那个测试是我在hbase的模拟环境搞的,他就几台服务器组件的hbase集群,性能一般,才到700左右。
class TBufferedTransport(TTransportBase, CReadableTransport): """Class that wraps another transport and buffers its I/O. #xiaorui.cc The implementation uses a (configurable) fixed-size read buffer but buffers all writes until a flush is performed. """ DEFAULT_BUFFER = 4096 def __init__(self, trans, rbuf_size=DEFAULT_BUFFER): self.__trans = trans self.__wbuf = StringIO() self.__rbuf = StringIO("") self.__rbuf_size = rbuf_size def isOpen(self): return self.__trans.isOpen() def open(self): return self.__trans.open() def close(self): return self.__trans.close() def read(self, sz): ret = self.__rbuf.read(sz) if len(ret) != 0: return ret self.__rbuf = StringIO(self.__trans.read(max(sz, self.__rbuf_size))) return self.__rbuf.read(sz) [transport/TTransport.py]
原文: xiaorui.cc
完成, Hbase做大数据的持久化,还是不错的。 推荐使用 !