云服务器内容精选

  • HBase开源增强特性:HFS HBase文件存储模块(HBase FileStream,简称HFS)是HBase的独立模块,它作为对HBase与HDFS接口的封装,应用在MRS的上层应用,为上层应用提供文件的存储、读取、删除等功能。 在Hadoop生态系统中,无论是HDFS,还是HBase,均在面对海量文件的存储的时候,在某些场景下,都会存在一些很难解决的问题: 如果把海量小文件直接保存在HDFS中,会给NameNode带来极大的压力。 由于HBase接口以及内部机制的原因,一些较大的文件也不适合直接保存到HBase中。 HFS的出现,就是为了解决需要在Hadoop中存储海量小文件,同时也要存储一些大文件的混合的场景。简单来说,就是在HBase表中,需要存放大量的小文件(10MB以下),同时又需要存放一些比较大的文件(10MB以上)。 HFS为以上场景提供了统一的操作接口,这些操作接口与HBase的函数接口类似。
  • HBase开源增强特性:HBase热点自愈 该功能适用于MRS 3.3.0及之后版本。 HBase是一个分布式的KV数据库,Region是HBase数据管理的最小单元。如果用户在规划表和设计rowkey不合理,请求过于集中在少量固定Region时,会导致业务压力集中在单节点,造成业务侧可感知的性能下降甚至请求失败。 HBase服务增加了MetricController实例,开启热点检测能力,能够监控每个RegionServer节点的请求流量,通过聚合分析,识别出请求偏高的节点和Region,有助于快速发现热点问题;并提供一定的热点问题自愈能力,比如热点Region自动转移或Split。对于无法提供自愈的热点场景(单rowkey热点、顺序写热点等),提供了热点限流的能力,避免单点问题影响同节点的其他正常业务。
  • HBase开源增强特性:HBase双读 在HBase存储场景下,因为GC、网络抖动、磁盘坏道等原因,很难保证99.9%的查询稳定性。为了满足用户大数据量随机读低毛刺的要求,新增了HBase双读特性。 HBase双读特性是建立在主备集群容灾能力之上,两套集群同时产生毛刺的概率要远远小于一套集群,即采用双集群并发访问的方式,保证查询的稳定性。当用户发起查询请求时,同时查询两个集群的HBase服务,在等待一段时间(最大容忍的毛刺时间)后,如果主集群没有返回结果,则可以使用响应最快的集群数据。原理图如下:
  • HBase开源增强特性:支持多点分割 当用户在HBase创建Region预先分割的表时,用户可能不知道数据的分布趋势,所以Region的分割可能不合适,所以当系统运行一段时间后,Region需要重新分割以获得更好的查询性能,HBase只会分割空的Region。 HBase自带的Region分割只有当Region到达设定的Threshold后才会进行分割,这种分割被称为单点分割。 为了实现根据用户的需要动态分割Region以获得更好的性能这一目标,开发了多点分割又称动态分割,即把空的Region预先分割成多个Region。通过预先分割,避免了因为Region空间不足出现Region分割导致性能下降的现象。 图2 多点分割
  • HBase开源增强特性:容灾增强 主备集群之间的容灾能力可以增强HBase数据的高可用性,主集群提供数据服务,备用集群提供数据备份,当主集群出现故障时,备集群可以提供数据服务。相比开源Replication功能,做了如下增强: 备集群白名单功能,只接受指定集群IP的数据推送。 开源版本中replication是基于WAL同步,在备集群回放WAL实现数据备份的。对于BulkLoad,由于没有WAL产生,BulkLoad的数据不会replicate到备集群。通过将BulkLoad操作记录在WAL上,同步至备集群,备集群通过WAL读取BulkLoad操作记录,将对应的主集群的HFile加载到备集群,完成数据的备份。 开源版本中HBase对于系统表ACL做了过滤,ACL信息不会同步至备集群,通过新加一个过滤器org.apache.hadoop.hbase.replication.SystemTableWALEntryFilterAllowACL,允许ACL信息同步至备集群,用户可以通过配置hbase.replication.filter.sytemWALEntryFilter使用该过滤其实现ACL同步。 备集群只读限制,备集群只接受备集群节点内的内置管理用户对备集群的HBase进行修改操作,即备集群节点之外的HBase客户端只能对备集群的HBase进行读操作。
  • HBase开源增强特性:Phoenix CsvBulkLoad工具导入支持用户自定义分隔符 该内容适用于MRS 3.2.0及之后版本。 Phoenix开源CsvBulkLoad工具当前仅支持指定单个字符作为数据分割符,当用户数据文件中可能包含任意字符时,一般会采用特殊的字符串作为分隔符,为了满足此类场景,增加了对用户自定义分隔符的支持,用户可以采用限定长度内的任意可见字符进行组合作为分隔符来导入数据文件。
  • HBase开源增强特性:Batch TRSP HBase 2.x内核版本使用HBase Procedure框架重写了region assignment的逻辑(AMV2)。每个Region的open或者close都会有一个TransitRegionStateProcedure(TRSP)与之关联。当RegionServer因为故障或重启需要恢复业务时,HMaster会为每个需要恢复的Region创建一个TRSP,大量的TRSP需要把数据持久化到Proc WAL文件中并且需要跟RegionServer进行RPC交互,可能造成HMaster性能瓶颈,导致服务恢复时间过长。 本功能主要通过在TRSP中添加attach region的方式,利用一个TRSP将一个RegionServer所有的Region进行恢复处理,RegionServer也将进行Region的批量open/close并一次性全部上报给HMaster。 该特性只支持将Region恢复到原来的RegionServer,因此该优化生效的前提为HMaster在创建TRSP时,故障或重启的RegionServer已经重新上线。因此,该特性主要用于优化HBase重启或者服务故障恢复的时长,如果是少量RegionServer发生故障,可能因为HMaster在RegionServer重新上线前已经创建了TRSP而不生效。 该内容适用于MRS 3.2.0及之后版本。
  • HBase开源增强特性:使用HAR文件格式拆分WAL文件 该内容适用于MRS 3.2.0及之后版本。 当RegionServer发生故障或重启时,HMaster会使用ServerCrashProcedure对RegionServer的业务进行恢复,恢复过程中包括拆分WAL文件。在WAL文件拆分过程中,会产生大量的小文件,可能造成HDFS的性能瓶颈,导致服务恢复时间过长。 本功能主要在拆分过程中将原本的小文件写入到HAR文件中,旨在减少拆分WAL过程中产生的小文件,从而缩短RegionServer恢复时长。
  • 资源释放 关于ResultScanner和Table实例,在用完之后,需要调用它们的Close方法,将资源释放掉。Close方法,要放在finally块中,来确保一定会被调用到。 正确示例: ResultScanner scanner = null; try { scanner = demoTable.getScanner(s); //Do Something here. } finally { scanner.close(); } 错误示例: 在代码中未调用scanner.close()方法释放相关资源。 scanner.close()方法未放置在finally块中。 ResultScanner scanner = null; scanner = demoTable.getScanner(s); //Do Something here. scanner.close();
  • 共享Configuration实例 HBase客户端代码通过创建一个与ZooKeeper之间的HConnection,来获取与一个HBase集群进行交互的权限。一个ZooKeeper的HConnection连接,对应着一个Configuration实例,已经创建的HConnection实例,会被缓存起来。也就是说,如果客户端需要与HBase集群进行交互的时候,会传递一个Configuration实例到缓存中去,HBase Client部分通过已缓存的HConnection实例,来判断属于这个Configuration实例的HConnection实例是否存在,如果不存在,会创建一个新的HConnection,如果存在,则会直接返回相应的实例。 因此,如果频频的创建Configuration实例,会导致创建很多不必要的HConnection实例,很容易达到ZooKeeper的连接数上限。 建议在整个客户端代码范围内,都共用同一个Configuration对象实例。
  • Configuration实例的创建 该类应该通过调用HBaseConfiguration的create()方法来实例化。否则,将无法正确加载HBase中的相关配置项。 正确示例: //该部分,应该是在类成员变量的声明区域声明 private Configuration hbaseConfig = null; //建议在类的构造函数中,或者初始化方法中实例化该类 hbaseConfig = HBaseConfiguration.create(); 错误示例: hbaseConfig = new Configuration();
  • Table实例的创建 public abstract class TableOperationImpl { private static Configuration conf = null; private static Connection connection = null; private static Table table = null; private static TableName tableName = TableName.valueOf("sample_table"); public TableOperationImpl() { init(); } public void init() { conf = ConfigurationSample.getConfiguration(); try { connection = ConnectionFactory.createConnection(conf); table = conn.getTable(tableName); } catch (IOException e) { e.printStackTrace(); } } public void close() { if (table != null) { try { table.close(); } catch (IOException e) { System.out.println("Can not close table."); } finally { table = null; } } if (connection != null) { try { connection.close(); } catch (IOException e) { System.out.println("Can not close connection."); } finally { connection = null; } } } public void operate() { init(); process(); close(); } }
  • 将主备集群相关配置设置到HBaseMultiClusterConnection中 该操作仅适用于MRS 3.3.0及之后版本。 将在准备MRS应用开发用户时获取的主集群keytab认证文件“user.keytab”与“krb5.conf”放置到二次样例“src/main/resources/conf”目录下。 创建双读Configuration,取消“com.huawei.bigdata.hbase.examples”包的“TestMain”类main方法中的testHBaseDualReadSample注释,确保“com.huawei.bigdata.hbase.examples”包的“HBaseDualReadSample”类中的“IS_CREATE_CONNECTION_BY_XML”值为“false”。 在“HBaseDualReadSample”类的addHbaseDualXmlParam方法中添加相关配置,相关配置项可参考HBase双读配置项。 private void addHbaseDualXmlParam(Configuration conf) { // We need to set the optional parameters contained in hbase-dual.xml to conf // when we use configuration transfer solution conf.set(CONNECTION_IMPL_KEY, DUAL_READ_CONNECTION); // conf.set("", ""); } 在“HBaseDualReadSample”类的initActiveConf方法中添加主集群客户端相关配置: private void initActiveConf() { // The hbase-dual.xml configuration scheme is used to generate the client configuration of the active cluster. // In actual application development, you need to generate the client configuration of the active cluster. String activeDir = HBaseDualReadSample.class.getClassLoader().getResource(Utils.CONF_DIRECTORY).getPath() + File.separator + ACTIVE_DIRECTORY + File.separator; Configuration activeConf = Utils.createConfByUserDir(activeDir); HBaseMultiClusterConnection.setActiveConf(activeConf); } 在“HBaseDualReadSample”类initStandbyConf方法中添加备集群客户端相关配置: private void initStandbyConf() { // The hbase-dual.xml configuration scheme is used to generate the client configuration of the standby cluster. // In actual application development, you need to generate the client configuration of the standby cluster. String standbyDir = HBaseDualReadSample.class.getClassLoader().getResource(Utils.CONF_DIRECTORY).getPath() + File.separator + STANDBY_DIRECTORY + File.separator; Configuration standbyConf = Utils.createConfByUserDir(standbyDir); HBaseMultiClusterConnection.setStandbyConf(standbyConf); } 确定数据来源的集群。 GET请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testGet方法中添加。 Result result = table.get(get); if (result instanceof DualResult) { LOG.info(((DualResult)result).getClusterId()); } Scan请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testScanData方法中添加。 ResultScanner rScanner = table.getScanner(scan); if (rScanner instanceof HBaseMultiScanner) { LOG.info(((HBaseMultiScanner)rScanner).getClusterId()); } 客户端支持打印metric信息。 “log4j.properties”文件中增加如下内容,客户端将metric信息输出到指定文件。指标项信息可参考打印metric信息。 log4j.logger.DUAL=debug,DUAL log4j.appender.DUAL=org.apache.log4j.RollingFileAppender log4j.appender.DUAL.File=/var/log/dual.log //客户端本地双读日志路径,根据实际路径修改,但目录要有写入权限 log4j.additivity.DUAL=false log4j.appender.DUAL.MaxFileSize=${hbase.log.maxfilesize} log4j.appender.DUAL.MaxBackupIndex=${hbase.log.maxbackupindex} log4j.appender.DUAL.layout=org.apache.log4j.PatternLayout log4j.appender.DUAL.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n
  • 操作场景 HBase客户端应用通过自定义加载主备集群配置项,实现了双读能力。HBase双读作为提高HBase集群系统高可用性的一个关键特性,适用于四个查询场景:使用Get读取数据、使用批量Get读取数据、使用Scan读取数据,以及基于二级索引查询。它能够同时读取主备集群数据,减少查询毛刺,具体表现为: 高成功率:双并发读机制,保证每一次读请求的成功率。 可用性:单集群故障时,查询业务不中断。短暂的网络抖动也不会导致查询时间变长。 通用性:双读特性不支持双写,但不影响原有的实时写场景。 易用性:客户端封装处理,业务侧不感知。 HBase双读使用约束: HBase双读特性基于Replication实现,备集群读取的数据可能和主集群存在差异,因此只能实现最终一致性。 目前HBase双读功能仅用于查询。主集群宕机时,最新数据无法同步,备集群可能查询不到最新数据。 HBase的Scan操作可能分解为多次RPC。由于相关session信息在不同集群间不同步,数据不能保证完全一致,因此双读只在第一次RPC时生效,ResultScanner close之前的请求会固定访问第一次RPC时使用的集群。 HBase Admin接口、实时写入接口只会访问主集群。所以主集群宕机后,不能提供Admin接口功能和实时写入接口功能,只能提供Get、Scan查询服务。
  • 使用HBase客户端 安装客户端,具体请参考安装客户端章节。 以客户端安装用户,登录安装客户端的节点。 执行以下命令切换到客户端目录。 cd /opt/hadoopclient 执行以下命令配置环境变量。 source bigdata_env 如果当前集群已启用Kerberos认证,执行以下命令认证当前用户,当前用户需要具有创建HBase表的权限,具体请参见角色管理配置拥有对应权限的角色,参考创建用户章节,为用户绑定对应角色。如果当前集群未启用Kerberos认证,则无需执行此命令。 kinit 组件业务用户 例如,kinit hbaseuser。 直接执行HBase组件的客户端命令。 hbase shell