什么是RPC服务

什么是RPC服务,第1张

俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用形式。常见的RPC有GRPC、Thrift、Dubbo等。

RPC简单理解就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据

RPC就是要像调用本地的函数一样去调远程函数。假设我们要调用函数Add来计算value1 value2的结果,直接调用Add方法即可。在远程调用时,我们要执行的函数在远程的机器上。

1、通过Configuration初始化集群Connection

11、Connction维持了客户端到整个HBase集群的链接,如一个HBase集群有2个Master、5个RegionServer,那么一般来说整个Connection会维持一个到Active Master的TCP连接和5个到ReginonServer的TCP链接。

12、通常一个进程只需要为一个独立的集群建立一个Connection即可,并不需要建立连接池。

13、Connection还缓存了访问的Meta信息,后续的大部分请求都可以通过缓存的Meta信息定位到对应的Region Server。

2、通过Connection初始化Table

21、Table是一个非常轻量级的对象,它所使用的连接资源、配置信息、线程池、Meta缓存等都来自于Connection。

22、由同一个Connection创建的多个Table,都会共享连接、配置信息、线程池、Meta缓存这些资源

23、在branch-1以及之前的版本中,Table并不是线程安全的类,所以不建议在多个线程中使用同一个Table实例。在HBase 200及之后,Table已经实现了线程安全。

24、由于Table是一个非常轻量级的对象,所以可以通过Connection为每个请求创建一个Table,但是记住,在该请求执行完毕之后需要关闭Table资源。

3、hbase:meta

31、hbase:meta用来保存整个集群的region信息

32、hbase:meta在HBase中保证始终只有一个Region,这是为了确保meta表多次 *** 作的原子性,因为HBase本质上只支持Region级别的事务<所谓Region级别的事务是指:当多个 *** 作落在同一个Region内时,HBase能保证这一批 *** 作执行的原子性。如果多个 *** 作分散在不同的Region,则无法保证这批 *** 作的原子性>

33、hbase:meta的一行就对应一个Region 它的rowkey主要由TableName、StartRow、TimeStamp、EncodeName、标识这个Region是属于哪个表,表Rowkey的起始行以及Region的创建时间戳

34、hbase:meta只有一个列簇<info>他有4列,info:regioninfo、info:seqnumDuringOpen、info:server、info:serverstartcode,表示这个表rowkey的起始位置,region落在哪个RegionServer上以及所在RegionServer的启动时间戳

4、HBase超时参数设置

hbaserpctimeout:表示单次RPC请求的超时时间,默认是60 000ms。

hbaseclinetretriesnumber:最多允许发生多少次RPC重试 *** 作默认是35次。

hbaseclinetpause:表示连续两次RPC重试之间的休眠时间,默认是100ms。重试休眠时间是按照随机退避算法设计的。也就是重试次数越多,休眠间隔时间就会越来越长。按照默认的重试次数35,则可能长期卡在休眠和重试两个步骤中

hbaseclinetoperationtimeout:表示单次API的超时时间,默认值为1 200 000ms一次API可能会有多次RPC重试,这个参数是API *** 作的总超时。

5、CAS<checkAndPut、inCrementColumnValue> *** 作是Region级别串行执行的,吞吐受限,在HBase 2x版本已调整设计,对于同一个Region内部的不同行可以并行执行CAS,这样大大提交了Region内部的CAS吞吐

6、Filter使用避坑指南

61、PrefixFilter 前缀过滤

低效使用方式:

Scan scan = new Scan();

scansetFilter(new PrefixFillter(BytestoBytes("def")));

这个Scan虽然能得到预期的效果,但是并不高效,因为对于rowKey在区间(-∞,def)的数据,会一条条扫描,发现前缀不为def,就读下一行,直到找到第一个rowkey为def的行为止

高效使用方式:

Scan scan = new Scan();

scansetStartRow(BytestoBytes("def"));

scansetFilter(new PrefixFillter(BytestoBytes("def")));

增加了一个startRow。RegionServer发现Scan设置了startRow,首先会寻址定位到startRow。这样就跳过了大量的(-∞,def)的数据。

最高效的使用方式:

Scan scan = new Scan();

scansetStartRow(BytestoBytes("def"));

scansetStopRow(BytestoBytes("deg"));

将PrefixFilter直接展开,扫描[def,deg)区间的数据,这样效率是最高的。

62、PageFilter:表有5个Region起始key为(-∞,1)、[1,2)、[2,3)、[3,4)、[4,+∞)每个Region 都有超过100条数据

错误的使用方式:

Scan scan = new Scan();

scansetStartRow(BytestoBytes("1"));

scansetStopRow(BytestoBytes("3"));

scansetFilter(new PageFilter(100))

这样写得出来的分页每页数据就会有200 条。但是明明设置了分页每页条数是100。原因是,它需要scan 2个Regionscan从一个region切换到另一个region之前的那个Filter的内部状态就无效了,新的region内部用的是一个全新的FilterFilter计数器被清零。Filter不是全局的, 所以它分别从2个region各查了100 条,总共200 条返回。

正确的使用方式:

如果想实现分页功能,可以不通过Filter而直接通过limit来实现。

Scan scan = new Scan();

scansetStartRow(BytestoBytes("1"));

scansetStopRow(BytestoBytes("3"));

scansetLimit(100);

所以对于用户来说,正常情况下PageFilter并没有太多的存在价值

63、SingleColumnValueFilter

使用方式:

Scan scan = new Scan();

SingleColumnValueFilter scvf = new  SingleColumnValueFilter(BytestoBytes("family"),BytestoBytes("qualifier"),

CompareOpEQUAL,BytestoBytes("value"));

scansetFilter(scvf);

表面上是将列簇为family,列为qualifier,值为value的cell返回给用户,但事实上那些不包含family:qualifier的行也会默认返回给用户,如果用户不希望读取那些不包含family:qualifier的数据,需要设计如下scan

Scan scan = new Scan();

SingleColumnValueFilter scvf = new  SingleColumnValueFilter(BytestoBytes("family"),BytestoBytes("qualifier"),

CompareOpEQUAL,BytestoBytes("value"));

scvfsetFiterIfMisssing(true);

scansetFilter(scvf);

另外当SingleColumnValueFilter设置为filterIfMisssing为true时,和其他Filter组合成FilterList时可能导致返回的结果不正确。建议是不要使用SingleColumnValueFilter与其他Filter组合成FilterList。 直接指定列,通过ValueFilter替换掉SingleColumnValueFilter

Scan scan = new Scan();

ValueFilter vf = new ValueFilter(CompareOfEQUAL,new BinaryComparatoe(BytestoBytes("value")));

scanaddColum(BytestoBytes("family"),BytestoBytes("qualifier"));

scansetFilter(vf);

7、HBase写入方式对比

71、tableput(Put):

每次执行都会执行一次RPC和磁盘持久化,写入吞吐受限于磁盘带宽、网络带宽,不会有数据丢失能保证put *** 作的原子性。

72、tableput(List<Put>):

客户端打包一批put提交,执行一次RPC,一次WAL。相比第一种省略了多次往返的RPC和磁盘持久化。但是时间会变长。如果打包的put分布在多个Region。则不能保证这一批put的原子性,应为HBase不支持跨Region的多行事务,失败的put会经历若干次重试。

73、bulk load:

将待写入的数据生成HFile,然后采用bulk load方式将HFile直接加载到对于的Region的CF内。这是一种完全离线的快速写入方式。它应该是最快的批量写入手段,同时不会对线上的集群产生巨大压力,在load完HFile之后,CF内部会进行Compaction,但是Compaction是异步的且可以限速,所以bulk load对线上集群非常友好。

使用场景举例:

731、两个集群互为主备,其中一个集群由存在数据丢失,想通过另一备份集群的数据来修复异常集群。最快的方式是:把备份集群的数据导一个快照拷贝到异常集群,然后通过copyTable工具扫快照生成HFile,然后bulk load 到异常集群,完成数据的修复。

732、当用户写入大量数据后,发现选择的split keys不合适,想重新选择split keys见表,这时也可以通过 snapshort生成HFile再bulk load的方式生成新表。

右击我的电脑,找到管理选项并点击,此时便会来到计算机管理界面,看到有三个大的选项,而今天需要进行设置的就是服务和应用程序,展开它,此时可以看到两个小的选项,双击服务选项即可。

1、在键盘按下“win+R”打开运行对话框,并运行diskmgmtmsc,回车打开磁盘管理界面;

2、如果Virtual Disk服务被停用的,重新启动该服务就可以解决问题了。

3、如果Virtual Disk服务是正在运行的状态的话,而磁盘管理器依然报错,那么可以把该服务重新启动然后重新打开磁盘管理试试看,应该就可以解决问题了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/13389636.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存