一分鍾ECS上搭建雲HBase Thriftserver
這裏詳細的介紹下客戶自己搭建thriftserver的流程以及步驟;通過一步步的演示達到分鍾級別在ecs上自構建Thriftserver流程;Thrfitserver是接收各種語言的client的請求,可以是:java/c++/php/python and so on;thriftserver接收客戶端請求,然後等於做一層proxy機製給HBbase server 發送請求,然後等待響應給client;
一:搭建前我們需要確定好幾個需要的東西:
1.jdk(java運行環境,因為Thriftserve是java寫的);這裏以1.8版本為例子;如何部署java環境穀歌一坨資料;這裏不在贅述;
[root@xxxxx apps]# java -version
java version "1.8.0_102"
OpenJDK Runtime Environment (Alibaba 8.2.4fp1) (build 1.8.0102-b8)
OpenJDK 64-Bit Server VM (Alibaba 8.2.4_fp1) (build 25.102-b8, mixed mode)
2.hbase的安裝包;從hbase 官網下載bin的tar包:下載鏈接
[root@xxxxx apps]#ls -l
drwxr-xr-x 5 hbase hbase 4096 Oct 9 14:58 bin
-rw-r--r-- 1 hbase hbase 165450 Aug 8 20:45 CHANGES.txt
drwxr-xr-x 2 hbase hbase 4096 Sep 6 17:47 conf
drwxr-xr-x 7 hbase hbase 4096 Sep 6 17:47 hbase-webapps
-rw-r--r-- 1 hbase hbase 261 Aug 8 20:45 LEGAL
drwxr-xr-x 4 root root 16384 Sep 26 14:47 lib
-rw-r--r-- 1 hbase hbase 129225 Aug 8 20:45 LICENSE.txt
-rw-r--r-- 1 hbase hbase 49093 Aug 8 20:45 NOTICE.txt
drwxrwxr-x 2 hbase hbase 4096 Oct 23 14:41 pids
-rw-r--r-- 1 hbase hbase 1477 Aug 8 20:45 README.txt
3.在雲hbase的白名單目錄裏麵配置上部署ecs的機器的ip;
有上述2個東西以後,基本上我們就可以開始著手部署hbase 的thriftserver了,但是這裏接下來需要有幾點東西需要說明下,thriftserver實際上部署的話,一台ecs就是一個單節點,那麼可能存在如果部署一台ecs的話,所有的請求打到這台ecs,可能整個集群的性能瓶頸卡在這個節點,此外這台機器可用性會影響整個集群的可用性。
二:部署的模式也有大概幾種:
把thriftserver部署為一個集群,前段的client的業務請求,在掛一個slb或者業務自己寫請求的路由策略,都是ok的,後端請求落到thriftserver集群,集群在做轉發。集群的部署方式實際上就是:單獨抽幾個ecs機器,每一個機器隻需要部署單節點thriftserver(參考下麵單節點thriftserver部署),集群內的thriftserver對於client的請求處理(處理哪一條請求)由SLB做路由或者客戶可以自己寫代碼實現路由規則,比如做key的模餘哈希。
這是最常見的模式,集群模式中的thrift建議不要和RS或者DN混部署。並且如果你使用集群模式的部署方案,你的client端不要去維護長連接。因為如果你維護一個長連接,負載均衡就會失效,如果thrift集群重啟,大部分連接會連上第一個起來的thrfit server。
每一個用戶跑程序的代碼那台機器可以順便部署一個thriftserver,那個thriftserver 處理本機器的進程請求即可。實際上和上述的集群模式是一種簡化。複用了客戶端的ecs ,節省了開銷。
本地模式就是在每個客戶機上起一個client,這個客戶機獨享一個thrift。優點是部署簡單,網絡開銷少。並且這種模式可以使用長連接,自己維護TTransport池。對於持續的寫入或者讀取,效果要比短連接好很多。HBase IPC本身也是維護一個長連接。缺點是,可靠性略差,如果thrift server掛了的話。但本身如果是多Client,其實也無所謂。
總結:我們的客戶case 中2種做法都有的,具體哪一種基於客戶的業務預算以及場景來參考;
三:單節點的thriftserver部署:
1.配置處理:
在啟動thriftservr之前,我們需要處理下一些相關的配置,需要處理的配置文件有:主要是在hbase的bin的tar包解壓下麵的conf的hbase-site.xml/hbase-env.sh:
1.1.hbase-site.xml
這個配置文件裏麵可以添加最基本的訪問hbase的東西:zk的地址:
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zkip1:port,zkip2:port,zkip3:port</value>
</property>
</configuration>
當然上述東西裏麵你可以添加別的選項。比如我感覺thriftserver本地的線程少了我可以加一下:
<property>
<name>hbase.thrift.maxWorkerThreads</name>
<value>200</value>
</property>
可以配置的參數有(大致列舉):
hbase.thrift.minWorkerThreads:thriftserver端最小線程池線程數;
hbase.thrift.maxWorkerThreads:最大線程數
hbase.thrift.maxQueuedRequests:thriftser排隊隊列裏麵最大允許的排隊數;
hbase.thrift.threadKeepAliveTimeSec:thrift線程池線程活的最長時間
hbase.regionserver.thrift.compact:thriftserver使用compact協議傳輸(穀歌了解thrift協議細節);
1.2.hbase-env.sh
export HBASE_LOG_DIR="thriftserver打的log的目錄"
export JVM_OPTS="-XX:+UseConcMarkSweepGC -XX:+UnlockDiagnosticVMOptions -XX:+BlockOffsetArrayUseUnallocatedBlock" #使用的是cms gc,當然這裏可以使用別的gc算法
export JVM_OPTS="$JVM_OPTS -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75" #cmsgc的相關算法的默認配置
export JVM_OPTS="$JVM_OPTS -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps" #標誌打gc log
export HBASE_THRIFT_OPTS="-Xms4096m -Xmx4096m" # 配置的gc的堆上內存大小,可以基於業務自己有的ecs機器配置
export HBASE_THRIFT_OPTS="$HBASE_THRIFT_OPTS $JVM_OPTS -XX:ErrorFile=$HBASE_LOG_DIR/hs_err.log -Xloggc:$HBASE_LOG_DIR/gc-thrift-`date +%Y%m%d-%H-%M`.log" #thrift serv log的格式
這裏需要明確幾點:gc的算法可以配置不同種,jdk1.8以後g1 gc實際上算是比較成熟,也有生產環境使用:配置g1 gc參考這裏,以及詳細的cms 與g1的區別;對於cms的話,一般默認上述數據配置(除了堆內存)還是可以的。具體cms的調優也可以參考網上細節;
對於堆內存的大小配置建議:
1.2.1:一般使用thfrift的話,主要是使用thriftserver做請求處理,那麼壓力是全打在thriftserver的,那麼對於如果業務請求大的話,且資源允許的話,還是希望給與thriftserver較多的內存資源,一個客戶的case 是:集群模式部署thriftserver,單條請求KB級別,大概4台ecs 做業務請求,ecs的物理配置是4core 8g,thriftserver配置4G內存。如果ecs全部是用於業務請求thriftserver還是希望足夠多,如果是4G ecs,那麼給2G給thriftserver也是有必要的。
1.2.2:如果請求壓力過大,我們建議調低cms的CMSInitiatingOccupancyFraction閾值,比如到65的樣子,此外,希望可以限製put/get的數據量,單條put入的數據值希望是不要不可控,這樣給與thriftserver的壓力也是很大的。oom風險較大。
1.3.啟動
啟動的流程很簡單,到bin目錄下:執行下
sh hbase-deamon.sh start thrift (這裏需要你自己明確啟動的thrift的版本)
完成以後會有log輸出,如果ok 執行jps 或者是ps aux|grep ThriftServer 有thriftserver進程表示ok;
root xxx xxx /usr/java/jdk1.8.0_131/bin/java -Dproc_thrift -Xmx4G -XX:+UseConcMarkSweepGC -Xms4096m -Xmx4096m -XX:+UseConcMarkSweepGC -XX:+UnlockDiagnosticVMOptions -XX:+BlockOffsetArrayUseUnallocatedBlock -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:ErrorFile=/xxx/logs/hs_err.log -Xloggc:xx -Dhbase.log.dir=/xxx/logs -Dhbase.log.file=xxx.log -Dhbase.home.dir=/xxx/bin/.. -Dhbase.id.str=root -Dhbase.root.logger=INFO,RFA -Dhbase.security.logger=INFO,RFAS org.apache.hadoop.hbase.thrift.ThriftServer start
默認啟動的thriftserve 是9090端口。
後續如何使用的話,參考文章
最後更新:2017-10-24 00:34:18