云服务器内容精选

  • StarRocks简介 StarRocks是一款全托管分析型 数据仓库 ,可以灵活创建和管理集群以及数据。使用向量化、MPP架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。 StarRocks既支持从各种实时和离线的数据源高效导入数据,同时支持直接分析 数据湖 上各种格式的数据。 StarRocks兼容MySQL协议,可使用MySQL客户端和常用BI工具对接进行数据分析,同时StarRocks具备水平扩展、高可用、高可靠、易运维等特性,广泛应用于实时数仓、高并发查询、统一分析等场景。更多相关介绍请参见StarRocks。 该组件当前为白名单阶段,如果使用请联系技术支持申请白名单开通。
  • StarRocks架构 StarRocks整体架构如下图所示,FE和BE节点可以水平无限扩展。 图1 StarRocks架构 表1 StarRocks节点及角色说明 名称 说明 Client Application StarRocks兼容MySQL协议,支持标准SQL语法,用户可通过各类MySQL客户端和常用BI工具对接。 FE StarRocks的前端节点,主要负责管理元数据、管理客户端连接、进行查询规划、查询调度等工作。 BE StarRocks的后端节点,主要负责数据存储和SQL计算等工作。 Leader Leader从Follower中自动选出,FE Leader提供元数据读写服务,Follower和Observer只有读取权限,无写入权限。 Follower Follower只有元数据读取权限,无写入权限,Follower参与Leader选举。 Observer Observer主要用于扩展集群的查询并发能力,可选部署。Observer不参与选主,不会增加集群的选主压力。
  • StarRocks基本概念 在StarRocks中,数据都以表(Table)的形式进行逻辑上的描述。 StarRocks中的表由行和列构成,每行数据对应用户一条记录,每列数据具有相同的数据类型。所有数据行的列数相同,可以动态增删列。在StarRocks中,一张表的列可以分为维度列(也称为Key列)和指标列(也称为Value列),维度列用于分组和排序,指标列的值可以通过聚合函数sum、count、min、max、hll_union_agg和bitmap_union等累加起来。 列式存储 在StarRocks中,表数据按列存储。物理上,一列数据会经过分块编码、压缩等操作,然后持久化存储到非易失设备上。但在逻辑上,一列数据可以看成是由相同类型的元素构成的一个数组, 一行数据的所有列值在各自的数组中按照列顺序排列,即拥有相同的数组下标。数组下标是隐式的,不需要存储。表中所有的行按照维度列,做多重排序,排序后的位置就是该行的行号。 索引 StarRocks通过前缀索引 (Prefix Index) 和列级索引,能够快速找到目标行所在数据块的起始行号。 加速处理 StarRocks通过预先聚合、分区分桶、物化视图、列级索引等机制实现数据的加速处理。 数据模型 StarRocks支持四种数据模型,分别是明细模型(Duplicate Key Model)、聚合模型(Aggregate Key Model)、更新模型(Unique Key Model)和主键模型(Primary Key Model)。 这四种数据模型能够支持多种数据分析场景,例如 日志分析 、数据汇总分析、实时分析等。创建表时,您需要指定数据模型(Data Model),当数据导入至数据模型时,StarRocks会按照排序键对数据进行排序、处理和存储。四种数据模型介绍如下: 明细模型 明细模型是StarRocks默认的建表模型。如果在建表时未指定任何模型,默认创建明细类型的表。 聚合模型 建表时,支持定义排序键和指标列,并为指标列指定聚合函数。当多条数据具有相同的排序键时,指标列会进行聚合。在分析统计和汇总数据时,聚合模型能够减少查询时所需要处理的数据,提升查询效率。 更新模型 建表时,支持定义主键和指标列,查询时返回主键相同的一组数据中的最新数据。相对于明细模型,更新模型简化了数据导入流程,能够更好地支撑实时和频繁更新的场景。 主键模型 主键模型支持分别定义主键和排序键。数据导入至主键模型的表中时,先按照排序键排序后再存储。查询时返回主键相同的一组数据中的最新数据。相对于更新模型,主键模型在查询时不需要执行聚合操作,并且支持谓词和索引下推,能够在支持实时和频繁更新等场景的同时,提供高效查询。 数据分布 建表时,您可以通过设置合理的分区和分桶,实现数据均匀分布和查询性能提升。数据均匀分布是指数据按照一定规则划分为子集,并且均衡地分布在不同节点上。查询时能够有效裁剪数据扫描量,最大限度地利用集群的并发性能,从而提升查询性能。
  • 云搜索服务 CSS CloudTable使用云搜索服务(Cloud Search Service,简称CSS)中的Elasticsearch搜索引擎来补充全文检索能力。用户在HBase的建表语句中,通过METADATA来定义索引字段的Elasticsearch schema并指定云搜索服务集群的连接地址,在建表时会自动连接云搜索服务集群并在Elasticsearch中创建索引。用户的源数据存储在CloudTable的HBase中,索引数据存放在云搜索服务的Elasticsearch中。 了解更多CSS的相关信息,请参见云搜索服务。
  • 集群管理功能 CloudTable服务是华为云提供的一项分布式、可扩展的KeyValue数据存储服务。CloudTable提供Web官网服务界面,CloudTable HBase集群管理的具体功能如下: 创建集群:在CloudTable服务界面完成集群的创建。支持按照用户创建集群时选择的计算单元个数、实际使用存储容量计费。用户可以自主地选择服务提供的高级特性,独立安装、独立收费。扣费时余额不足先提醒用户续费,在保留期冻结集群资源,续费后再解冻。通过计算存储分离架构和计算资源动态调整,尽可能的为用户降低成本。 扩容集群:支持集群扩容计算单元。 扩容计算单元:用户根据实际需要或业务情况,动态的增加计算单元的个数,保证读写性能。集群自适应的实现负载均衡,保证业务不中断,平滑扩容。扩容计算单元将会产生额外的费用。 管理集群:对创建的集群进行管理。 指标监控:集群运行中,收集各项监控数据,上报 云监控 (Cloud Eye),向用户以图形化的方式呈现集群运行状况。当指标出现异常时,通过 消息通知 用户和管理员,及时人工介入。 删除集群:当用户不再需要集群时,可选择删除集群。此操作为高危操作,删除集群可能导致数据丢失,因此在执行删除操作之前,请确认不存在正在运行的业务,所有数据都已经保存。 重启集群:当修改完集群HBase参数后,或者因长时间不重启导致系统运行缓慢等情况下,用户需要重启集群。重启操作将有可能会导致正在运行中的业务数据丢失,如果需要执行重启操作,请确定不存在正在运行的业务,所有数据都已经保存。 查询告警:集群运行异常或系统故障时,CloudTable服务会收集故障信息并上报网管系统,维护人员可根据用户提供的告警信息定位问题原因。 日志查询:记录用户对集群操作信息,便于集群运行异常时定位分析问题原因。
  • HBase产品简介 HBase是一个稳定可靠,性能卓越、可伸缩、面向列的分布式 云存储 系统,适用于海量数据存储以及分布式计算的场景,用户可以利用HBase搭建起TB至PB级数据规模的存储系统,对数据轻松进行过滤分析,毫秒级得到响应,快速发现数据价值。 HBase适用场景有: 海量数据存储。 适用于TB~PB级以上的数据存储,提供动态伸缩能力,方便用户在性能或容量需要改变时,改变集群资源,轻松构建企业海量数据存储系统。 实时查询。 HBase的列式KeyValue存储机制,适用于企业用户明细数据即时查询,基于主键的低时延点查,响应时延一般为秒级或毫秒级,方便用户对数据的实时分析。 HBase的架构和详细原理介绍,请参见:https://hbase.apache.org/book.html 当前CloudTable HBase暂无安全认证机制,如果需使用认证鉴权机制的HBase服务,建议使用华为云 MapReduce服务
  • 首次使用CloudTable 如果您是首次使用CloudTable的用户,建议您学习并了解如下信息: 基础知识了解 通过CloudTable产品功能章节的内容,了解CloudTable相关的基础知识,包含CloudTable各组件的基本原理和场景介绍,以及CloudTable服务的特有概念和功能的详细介绍。 入门使用 您可以参考《快速入门》学习并上手使用CloudTable。《快速入门》提供了样例的详细操作指导,您可以基于此操作指导,创建和使用CloudTable集群。 使用更多的功能,并查看其相关操作指导 如果您是一个CloudTable集群使用人员,可以参考用户指南完成集群创建、参数配置、查看告警等操作。 如果您是一个开发者,可以参考CloudTable提供的开发指南操作指导及样例工程开发并运行调测自己的应用程序。您也可以通过API调用完成CloudTable集群创建/查询操作,您可以参考《API参考》获取详情。
  • CloudTable权限 默认情况下,管理员创建的 IAM 用户没有任何权限,需要将其加入用户组,并给用户组授予策略或角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。 CloudTable部署时通过物理区域划分,为项目级服务。授权时,“作用范围”需要选择“区域级项目”,然后在指定区域(如华北-北京1)对应的项目(cn-north-1)中设置相关权限,并且该权限仅对此项目生效;如果在“所有项目”中设置权限,则该权限在所有区域项目中都生效。访问CloudTable时,需要先切换至授权区域。 如表1所示,包括了CloudTable的所有系统角色。由于华为云各服务之间存在业务交互关系, 表格存储服务 的角色依赖其他服务的角色实现功能。因此给用户授予 表格存储 服务的角色时,需要同时授予依赖的角色,表格存储服务的权限才能生效。 表1 CloudTable系统角色 系统角色 描述 类别 依赖关系 cloudtable Administrator 表格存储服务的管理员权限。 系统角色 依赖Tenant Guest和Server Administrator角色,在同项目中勾选依赖的角色。 表2列出了CloudTable常用操作与系统权限的授权关系,您可以参照该表选择合适的系统权限。 表2 CloudTable操作与系统策略关系 模式 操作 cloudtable Administrator 集群模式 创建集群 √ 重启集群 √ 扩容集群 √ 删除集群 √ 参数配置 √ 查看CloudTable服务集群列表、集群详细信息 √ 查看监控信息 √ 查看审计日志 √
  • 基本语法 DROP [TEMPORARY] TABLE [IF EXISTS] [database_name.]name [ON CLUSTER cluster] [SYNC] 示例: 删除表t1。 drop table t1 SYNC; 在删除复制表时,因为复制表需要在Zookeeper上建立一个路径,存放相关数据。ClickHouse默认的库引擎是原子数据库引擎,删除Atomic数据库中的表后,它不会立即删除,而是会在24小时后删除。在删除表时,加上SYNC字段,即可解决该问题,例如:drop table t1 SYNC; 删除本地表和分布式表,则不会出现该问题,可不带SYNC字段,例如:drop table t1; 如果建表语句中包含了“ON CLUSTER ClickHouse集群名”,删除表命令: drop table 表名 ON CLUSTER default_cluster; 如果建表语句不包含“ON CLUSTER ClickHouse集群名”,删除表命令: drop table 表名; 删除数据表前,需确认此数据表是否应用中,以免引起不必要的麻烦。删除数据表后可在24小时内恢复,超过24小时无法恢复。恢复命令如下: set allow_experimental_undrop_table_query = 1; UNDROP TABLE 数据表名;
  • 注意事项 注[1] 可以设置列族的压缩方式,代码片段如下: //设置编码算法,HBase提供了DIFF,FAST_DIFF,PREFIX和PREFIX_TREE四种编码算法 hcd.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF); //设置文件压缩方式,HBase默认提供了GZ和SNAPPY两种压缩算法 //其中GZ的压缩率高,但压缩和解压性能低,适用于冷数据 //SNAPPY压缩率低,但压缩解压性能高,适用于热数据 //建议默认开启SNAPPY压缩 hcd.setCompressionType(Compression.Algorithm.SNAPPY); 注[2] 可以通过指定起始和结束RowKey,或者通过RowKey数组预分Region两种方式建表,代码片段如下: // 创建一个预划分region的表 byte[][] splits = new byte[4][]; splits[0] = Bytes.toBytes("A"); splits[1] = Bytes.toBytes("H"); splits[2] = Bytes.toBytes("O"); splits[3] = Bytes.toBytes("U"); admin.createTable(htd, splits);
  • 功能简介 HBase通过org.apache.hadoop.hbase.client.Admin对象的createTable方法来创建表,并指定表名、列族名。创建表有两种方式(强烈建议采用预分Region建表方式): 快速建表,即创建表后整张表只有一个Region,随着数据量的增加会自动分裂成多个Region。 预分Region建表,即创建表时预先分配多个Region,此种方法建表可以提高写入大量数据初期的数据写入速度。 表名以及列族名不能包含特殊字符,可以由字母、数字以及下划线组成。
  • 代码样例 public void testCreateTable() { LOG .info("Entering testCreateTable."); // Specify the table descriptor. HTableDescriptor htd = new HTableDescriptor(tableName); // (1) // Set the column family name to info. HColumnDescriptor hcd = new HColumnDescriptor("info"); // (2) // Set data encoding methods. HBase provides DIFF,FAST_DIFF,PREFIX // and PREFIX_TREE hcd.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF); // 注[1] // Set compression methods, HBase provides two default compression // methods:GZ and SNAPPY // GZ has the highest compression rate,but low compression and // decompression efficiency,fit for cold data // SNAPPY has low compression rate, but high compression and // decompression efficiency,fit for hot data. // it is advised to use SANPPY hcd.setCompressionType(Compression.Algorithm.SNAPPY); htd.addFamily(hcd); // (3) Admin admin = null; try { // Instantiate an Admin object. admin = conn.getAdmin(); // (4) if (!admin.tableExists(tableName)) { LOG.info("Creating table..."); admin.createTable(htd); // 注[2] (5) LOG.info(admin.getClusterStatus()); LOG.info(admin.listNamespaceDescriptors()); LOG.info("Table created successfully."); } else { LOG.warn("table already exists"); } } catch (IOException e) { LOG.error("Create table failed.", e); } finally { if (admin != null) { try { // Close the Admin object. admin.close(); } catch (IOException e) { LOG.error("Failed to close admin ", e); } } } LOG.info("Exiting testCreateTable."); }
  • ClickHouse通过MySQL引擎对接RDS服务 MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。 MySQL引擎使用语法: CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] ENGINE = MySQL('host:port', ['database' | database], 'user', 'password') 表1 MySQL数据库引擎参数说明 参数 描述 hostport RDS服务MySQL数据库实例IP地址和端口。 database RDS服务MySQL数据库名。 user RDS服务MySQL数据库用户名。 password RDS服务MySQL数据库用户密码。 MySQL引擎使用示例: 连接到RDS服务的MySQL数据库。详细操作可以参考RDS服务MySQ L实例 连接。 在MySQL数据库上创建表,并插入数据。 使用客户端命令连接ClickHouse。 非安全集群连接命令 ./clickhouse client --host 集群内网地址 --port 端口 --user admin --password password 安全集群连接命令,详细操作请参见ClickHouse安全通道章节。 ./clickhouse client --host 集群内网地址 --port 端口 --user admin --password password --secure --config-file /root/config.xml 集群内网地址:集群详情页面中集群访问地址,这里替换成您自己购买的集群的访问地址。 在ClickHouse中创建MySQL引擎的数据库,创建成功后自动与MySQL服务器交换数据。 CREATE DATABASE mysql_db ENGINE = MySQL('RDS服务MySQL数据库实例IP地址:MySQL数据库实例端口', 'MySQL数据库名', 'MySQL数据库用户名', 'MySQL数据库用户名密码'); 切换到新建的数据库mysql_db,并查询表数据。 USE mysql_db; 在ClickHouse中查询MySQL数据库表数据。 SELECT * FROM mysql_table; ┌─int_id─┬─float─┐ │ 1 │ 2 │ └─────┴──── ┘ 新增插入数据后也可以正常进行查询。 INSERT INTO mysql_table VALUES (3,4); SELECT * FROM mysql_table; ┌─int_id─┬─float─┐ │ 1 │ 2 │ │ 3 │ 4 │ └─────┴──── ┘
  • 代码样例 下面代码片段在com.huaweicloudtable.hbase.examples包中。 private static void init() throws IOException { // Default load from conf directory conf = HBaseConfiguration.create(); // 注[1] String userdir = System.getProperty("user.dir") + File.separator + "conf" + File.separator; Path hbaseSite = new Path(userdir + "hbase-site.xml"); if (new File(hbaseSite.toString()).exists()) { conf.addResource(hbaseSite); } }
  • Python代码样例 # -*- coding: utf-8 -*- # 引入公共模块 import sys import os # 引入Thrift自带模块,如果不存在则需要执行pip install thrift安装 from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol from thrift.transport import THttpClient from thrift.transport import TSocket # 引入通过hbase.thrift生成的模块 gen_py_path = os.path.abspath('gen-py') sys.path.append(gen_py_path) from hbase import THBaseService from hbase.ttypes import TColumnValue, TColumn, TTableName, TTableDescriptor, TColumnFamilyDescriptor, TGet, TPut, TScan # 配置CloudTable HBase集群的ThriftServer的IP,可以通过集群的详情页面获取 host = "x.x.x.x" socket = TSocket.TSocket(host, 9090) transport = TTransport.TBufferedTransport(socket) protocol = TBinaryProtocol.TBinaryProtocol(transport) client = THBaseService.Client(protocol) transport.open() # 测试表名 tableNameInBytes = "test".encode("utf8") tableName = TTableName(ns="default".encode("utf8"), qualifier=tableNameInBytes) # 预分region的split key splitKeys=[] splitKeys.append("row3".encode("utf8")) splitKeys.append("row5".encode("utf8")) # 建表操作 client.createTable(TTableDescriptor(tableName=tableName, columns=[TColumnFamilyDescriptor(name="cf1".encode("utf8"))]), splitKeys) print("Create table %s success." % tableName) # Put单条数据 put = TPut(row="row1".encode("utf8"), columnValues=[TColumnValue(family="cf1".encode("utf8"), qualifier="q1".encode("utf8"), value="test_value1".encode("utf8"))]) client.put(tableNameInBytes, put) print("Put single row success.") # Put多条数据 puts = [] puts.append(TPut(row="row4".encode("utf8"), columnValues=[TColumnValue(family="cf1".encode("utf8"), qualifier="q1".encode("utf8"), value="test_value1".encode("utf8"))])) puts.append(TPut(row="row6".encode("utf8"), columnValues=[TColumnValue(family="cf1".encode("utf8"), qualifier="q1".encode("utf8"), value="test_value1".encode("utf8"))])) puts.append(TPut(row="row8".encode("utf8"), columnValues=[TColumnValue(family="cf1".encode("utf8"), qualifier="q1".encode("utf8"), value="test_value1".encode("utf8"))])) client.putMultiple(tableNameInBytes, puts) print("Put rows success.") # Get单条数据 get = TGet(row="row1".encode("utf8")) result = client.get(tableNameInBytes, get) print("Get Result: ", result) # Get多条数据 gets = [] gets.append(TGet(row="row4".encode("utf8"))) gets.append(TGet(row="row8".encode("utf8"))) results = client.getMultiple(tableNameInBytes, gets) print("Get multiple rows: ", results) # Scan数据 startRow, stopRow = "row4".encode("utf8"), "row9".encode("utf8") scan = TScan(startRow=startRow, stopRow=stopRow) caching=1 results = [] while True: scannerResult = client.getScannerResults(tableNameInBytes, scan, caching) lastOne = None for result in scannerResult: results.append(result) print("Scan Result: ", result) lastOne = result # 没有更多数据,退出 if lastOne is None: break else: # 重新生成下一次scan的startRow newStartRow = bytearray(lastOne.row) newStartRow.append(0x00) scan = TScan(startRow=newStartRow, stopRow=stopRow) # 禁用和删除表 client.disableTable(tableName) print("Disable table %s success." % tableName) client.deleteTable(tableName) print("Delete table %s success." % tableName) # 所有操作都结束后,关闭连接 transport.close()