一分钟ECS上搭建云HBase Thriftserver-阿里云开发者社区

开发者社区> 数据库> 正文

一分钟ECS上搭建云HBase Thriftserver

简介: 介绍ecs部署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的官网下载,下载的参考指南是这里(当然也可以从hbase 官网下载bin包)。下载后ls -l 下显示:

[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;

DingTalk20171023233710

​ 有上述2个东西以后,基本上我们就可以开始着手部署hbase 的thriftserver了,但是这里接下来需要有几点东西需要说明下,thriftserver实际上部署的话,一台ecs就是一个单节点,那么可能存在如果部署一台ecs的话,所有的请求打到这台ecs,可能整个集群的性能瓶颈卡在这个节点,此外这台机器可用性会影响整个集群的可用性。

二:部署的模式也有大概几种:

​ 1.集群模式:
de5eb77c70c1c4e0bcdaa6f731c78b4aef4813a5

​ 把thriftserver部署为一个集群,前段的client的业务请求,在挂一个slb或者业务自己写请求的路由策略,都是ok的,后端请求落到thriftserver集群,集群在做转发。集群的部署方式实际上就是:单独抽几个ecs机器,每一个机器只需要部署单节点thriftserver(参考下面单节点thriftserver部署),集群内的thriftserver对于client的请求处理(处理哪一条请求)由SLB做路由或者客户可以自己写代码实现路由规则,比如做key的模余哈希。

​ 这是最常见的模式,集群模式中的thrift建议不要和RS或者DN混部署。并且如果你使用集群模式的部署方案,你的client端不要去维护长连接。因为如果你维护一个长连接,负载均衡就会失效,如果thrift集群重启,大部分连接会连上第一个起来的thrfit server。

​ 2.本地模式:
31f3745fea2bf7dc5b281a2847be49dc883f111b

​ 每一个用户跑程序的代码那台机器可以顺便部署一个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端口。

​ 后续如何使用的话,参考文章

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章