HBase thrift/thrift2 使用指南
Thrift server簡介
Thrift server是HBase中的一種服務,主要用於對多語言API的支持。基於Apache Thrift(多語言支持的通信框架)開發,目前有兩種版本thrift和thrift2。
thrift2是當時為了適應新的Java API,提出來的。由於種種原因,thrift2沒有完美兼容並替代thrift,所有就留下了兩個版本。
Thrift 和 Thrift2 的區別
- 接口設計上Thrift2要比Thrfit更優雅,或者說和現在的API更貼近。比如兩者的get接口:
js // Thrift2 的get接口,傳入TGet(對應Java API種的Get類) // 用過Java API的同學看起來應該會更親切 TResult get( /** the table to get from */ 1: required binary table, /** the TGet to fetch */ 2: required TGet tget ) throws (1: TIOError io)
js // Thrift 的get接口,沒有TGet這些包裝,比較裸 list<TCell> get( /** name of table */ 1:Text tableName, /** row key */ 2:Text row, /** column name */ 3:Text column, /** Get attributes */ 4:map<Text, Text> attributes ) throws (1:IOError io)
- Thrift2沒有DDL方麵的接口,所以現在Hue還是用Thrift的接口。如果你隻想讀寫數據,建議用Thrift2。
Thrift server原理
Thrfit其實就是個代理,你的請求發到Thrift server上後,server通過Java API再幫你訪問HBase。
Thrift實現類是org.apache.hadoop.hbase.thrift.ThriftServer
,thrift2的實現類是org.apache.hadoop.hbase.thrift2.ThriftServer
。它們訪問HBase使用的也是普通的HBase client API,所以當你的請求到達Thrift server後,它通過client API去幫你定位數據,然後讀取數據。這麼來看,Thrift Server比較靈活,你可以部署在HBase集群內,也可以獨立部署在集群外。
Thrift server 參數選擇
- TServer的選擇。這是Thrift框架server端處理模型的選擇。有三種,
TNonblockingServer
,THsHaServer
,TThreadPoolServer
。可以通過啟動命令參數指定,具體運行./bin/hbase thrift
可以看到命令幫助(or./bin/hbase thrift2
)。默認是用TThreadPoolServer
,建議就不用改了,除非你特別了解你的場景。關於這幾種模型的區別,性能對比可以看這篇文章。 -
hbase.regionserver.thrift.compact
是否使用Thrift TCompactProtocol,默認false。如果你每列數據比較大,可以試著開啟,減少帶寬。 -
hbase.thrift.minWorkerThreads
TThreadPoolServer的線程池中的corePoolSize,也就是即便空閑時候保持的線程數,默認16。 -
hbase.thrift.maxWorkerThreads
TThreadPoolServer的線程池中的maximumPoolSize,默認1000。這個會影響server最大處理能力,需要根據硬件衡量。 -
hbase.thrift.maxQueuedRequests
TThreadPoolServer的線程池隊列長度上限,超過這個值時會去創建一個新的線程處理請求(前提是沒有達到maxWorkerThreads,否則拒絕請求)
注:上述最後三個值對thrift2無效。1.3之前的版本中,thrift2無法設定這些值。2.0版本中在thrift2啟動命令裏通過指定'w'選項來設置maxWorkerThreads。具體可以運行上文中提到的命令,查看是否支持'w'選項,如果不支持,默認max=int最大值。
遺留:是否能使用thrift長連接,減少server線程數,減少建立建立連接的開銷,待驗證。
Thrift部署模式
等待更新
最後更新:2017-05-22 22:01:46