华为云用户手册

  • 基本语法 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 数据表名;
  • CREATE DATABASE CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER ClickHouse集群名]; 表1 参数说明 参数 说明 db_name 数据库 IF NOT EXISTS 如果CREATE语句中存在IF NOT EXISTS关键字,则当数据库已经存在时,该语句不会创建数据库,且不会返回任何错误。 ON CLUSTER ClickHouse集群名 用于指定集群名称。 集群名信息可以使用以下语句的cluster字段获取: select cluster,shard_num,replica_num,host_name from system.clusters;
  • 使用示例 创建数据库demo。 create database demo ON CLUSTER default_cluster; 查看新建的数据库。 host-172-16-30-9 :) show databases; SHOW DATABASES Query id: ced1af23-0286-40cc-9c7a-ccbca41178d8 ┌─name───────────────┐ │ INFORMATION_SCHEMA │ │ default │ │ demo │ │ information_schema │ │ system │ └────────────────────┘ 5 rows in set. Elapsed: 0.002 sec.
  • 操作步骤 导出Jar包。 右击样例工程,选择导出。 图1 导出Jar包 选择JAR file,单击“Next”。 图2 选择JAR file 勾选“src”目录,导出Jar包到指定位置。单击两次“Next”。 图3 选择导出路径 单击“Finish”,完成导出Jar包。 准备依赖的Jar包和配置文件。 在Linux环境新建目录,例如“/opt/test”,并创建子目录“lib”和“conf”。将样例工程中“lib”的Jar包,以及1导出的Jar包,上传到Linux的“lib”目录。将样例工程中“conf”的配置文件上传到Linux中“conf”目录。 在“/opt/test”根目录新建脚本“run.sh”,修改内容如下并保存: #!/bin/sh BASEDIR=`pwd` SECURE="" if [ $# -eq 1 ]; then SECURE="-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.client.secure=true" fi cd ${BASEDIR} for file in ${BASEDIR}/lib/*.jar do i_cp=$i_cp:$file echo "$file" done for file in ${BASEDIR}/conf/* do i_cp=$i_cp:$file done java -cp .${i_cp} ${SECURE} com.huawei.cloudtable.hbase.examples.TestMain 切换到“/opt/test”,执行以下命令,运行Jar包。 未开启加密通道的HBase集群 sh run.sh 开启加密通道的HBase集群 sh run.sh secure 如果使用其他方式运行应用访问开启了加密通道的HBase集群,需要自行添加JVM参数:"-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.client.secure=true
  • 基本语法 标准格式插入数据。 INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ... 对于存在于表结构中但不存在于插入列表中的列,它们将会按照如下方式填充数据: 如果存在DEFAULT表达式,根据DEFAULT表达式计算被填充的值。 如果没有定义DEFAULT表达式,则填充零或空字符串。 接复制表结构创建表示例,插入数据: insert into demo_t values(1,'Candy','23','M'),(2,'cici','33','F'); 使用SELECT的结果写入。 INSERT INTO [db.]table [(c1, c2, c3)] SELECT ... 写入的列与SELECT的列的对应关系是使用位置来进行对应的,它们在SELECT表达式与INSERT中的名称可以是不同的。需要对它们进行对应的类型转换。 除了VALUES格式之外,其他格式中的数据都不允许出现诸如now(),1+2等表达式。VALUES格式允许您有限度的使用这些表达式,但是不建议您这么做,因为执行这些表达式很低效。
  • 复合分区与单分区 复合分区。 第一级称为Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间类型的列),并指定每个分区的取值范围。 第二级称为Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行HASH分布或者不指定分桶列设置成Random Distribution对数据进行随机分布。 此场景推荐使用复合分区。 有时间维度或类似带有序值的维度,可以以这类维度列作为分区列。分区粒度可以根据导入频次、分区数据量等进行评估。 历史数据删除需求:如有删除历史数据的需求(比如仅保留最近N天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送DELET语句进行数据删除。 解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列。 单分区。 用户也可以不使用复合分区,即使用单分区。则数据只做Hash分布。
  • 关于Random Distribution的设置以及使用场景 如果OLAP表没有更新类型的字段,将表的数据分桶模式设置为RANDOM,则可以避免严重的数据倾斜(数据在导入表对应的分区的时候,单次导入作业每个batch的数据将随机选择一个tablet进行写入)。 当表的分桶模式被设置为RANDOM时,因为没有分桶列,无法根据分桶列的值仅对几个分桶查询,对表进行查询的时候将对命中分区的全部分桶同时扫描,该设置适合对表数据整体的聚合查询分析而不适合高并发的点查询。 如果OLAP表的是Random Distribution的数据分布,那么在数据导入的时候可以设置单分片导入模式(将load_to_single_tablet设置为true),那么在大数据量的导入的时候,一个任务在将数据写入对应的分区时将只写入一个分片,这样将能提高数据导入的并发度和吞吐量,减少数据导入和Compaction导致的写放大问题,保障集群的稳定性。
  • 关于Partition和Bucket的数量和数据量的建议 一个表的Tablet总数量等于 (Partition num*Bucket num)。 一个表的Tablet数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。 单个Tablet的数据量理论上没有上下界,但建议在1G-10G的范围内。如果单个Tablet数据量过小,则数据的聚合效果不佳,且元数据管理压力大。如果数据量过大,则不利于副本的迁移、补齐,且会增加Schema Change或者Rollup操作失败重试的代价(这些操作失败重试的粒度是Tablet)。 当Tablet的数据量原则和数量原则冲突时,建议优先考虑数据量原则。 在建表时,每个分区的Bucket数量统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的Bucket数量。可以利用这个功能方便的应对数据缩小或膨胀。 一个Partition的Bucket数量一旦指定,不可更改。所以在确定Bucket数量时,需要预先考虑集群扩容的情况。比如当前只有3台host,每台host有1块盘。如果Bucket的数量只设置为3或更小,那么后期即使再增加机器,也不能提高并发度。 举一些例子:假设在有10台BE,每台BE一块磁盘的情况下。如果一个表总大小为500MB,则可以考虑4-8个分片。5GB:8-16个分片。50GB:32个分片。500GB:建议分区,每个分区大小在50GB左右,每个分区16-32个分片。5TB:建议分区,每个分区大小在50GB 左右,每个分区16-32个分片。
  • 创建物化视图 CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]Materialized_name [TO[db.]name] [ON CLUSTERClickHouse集群名] ENGINE = engine_name() ORDER BY expr [POPULATE] AS SELECT ... 表1 参数说明 参数 说明 db 数据库的名称,默认为当前选择的数据库。 Materialized_name 物化视图名。 TO[db.]name 将物化视图的数据写入到新表中。 [ON CLUSTERClickHouse集群名] 在每一个节点上都创建一个物化视图,固定为ON CLUSTER ClickHouse集群名。 ENGINE = engine_name() 表引擎类型。 [POPULATE] POPULATE关键字。如果创建物化视图时指定了POPULATE关键字,则在创建时将SELECT子句所指定的源表数据插入到物化视图中。不指定POPULATE关键字时,物化视图只会包含在物化视图创建后新写入源表的数据。 说明: 一般不推荐使用POPULATE关键字,因为在物化视图创建期间写入源表的数据将不会写入物化视图中。 SELECT ... SELECT子句。当数据写入物化视图中SELECT子句所指定的源表时,插入的数据会通过SELECT子句查询进行转换并将最终结果插入到物化视图中。 说明: SELECT查询可以包含DISTINCT、GROUP BY、ORDER BY和LIMIT等,但是相应的转换是在每个插入数据块上独立执行的。 示例: 创建源表。 create table DB.table1 ON CLUSTER default_cluster (id Int16,name String) ENGINE = MergeTree() ORDER BY (id); 插入数据。 insert into DB.table1 values(1,'X'),(2,'Y'),(3,'Z'); 创建基于源表的物化视图。 CREATE MATERIALIZED VIEW demo_view ON CLUSTER default_cluster ENGINE = MergeTree() ORDER BY (id) AS SELECT * FROM DB.table1; 查询物化视图。 SELECT * FROM demo_view; 查询数据为空,说明未指定POPULATE关键字时,查询不到物化视图创建前写入源表的数据。 DB.table1表中插入数据。 insert into demo_view values(4,'x'),(5,'y'),(6,'z'); 查询物化视图。 SELECT * FROM demo_view; 查询结果。 ┌─id─┬─name─┐ │ 4 │ x │ │ 5 │ y │ │ 6 │ z │ └────┴──────┘
  • 操作步骤 导出Jar包。 右击样例工程,选择导出。 图1 导出Jar包 选择JAR file,单击“Next”。 图2 选择JAR file 勾选“src”和“conf”目录,导出Jar包到指定位置。单击两次“Next”。 图3 选择导出路径 单击“Finish”,完成导出Jar包。 执行Jar包。 在Linux客户端下执行Jar包的时候,先将应用开发环境中生成的Jar包拷贝上传至客户端安装目录的“lib”目录中,并确保Jar包的文件权限与其它文件相同。 用安装用户切换到客户端目录的“bin”目录下,然后运行如下命令使Jar包执行: [Ruby@cloudtable-08261700-hmaster-1-1 bin]# ./hbase com.huawei.cloudtable.hbase.examples.TestMain 其中,com.huawei.cloudtable.hbase.examples.TestMain为举例,具体以实际样例代码为准。
  • 基本语法 ALTER TABLE [database_name].name [ON CLUSTER ClickHouse集群名] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ... ALTER仅支持 *MergeTree ,Merge以及Distributed等引擎表。 示例: 创建表DB_table1。 CREATE TABLE DB_table1 ON CLUSTER default_cluster(Year UInt16,Quarter UInt8,Month UInt8,DayofMonth UInt8,DayOfWeek UInt8,FlightDate Date,FlightNum String,Div5WheelsOff String,Div5TailNum String)ENGINE = MergeTree() PARTITION BY toYYYYMM(FlightDate) PRIMARY KEY (intHash32(FlightDate)) ORDER BY (intHash32(FlightDate),FlightNum) SAMPLE BY intHash32(FlightDate) SETTINGS index_granularity= 8192; 给DB_table1增加列test。 ALTER TABLE DB_table1 ADD COLUMN test String DEFAULT 'defaultvalue'; 查表。 desc DB_tables; 修改表DB_table1列Year类型为UInt8。 ALTER TABLE DB_table1 MODIFY COLUMN Year UInt8; 查表结构。 desc DB_tables; 删除表DB_table1列test。 ALTER TABLE DB_table1 DROP COLUMN test; 查表。 desc DB_tables; 修改表DB_table1列Month为Month_test。 ALTER TABLE DB_table1 RENAME COLUMN Month to Month_test; 查表。 desc DB_tables;
  • 样例代码 创建ClickHouse冷热分离表test_table。 CREATE TABLE IF NOT EXISTS test_table ( `timestamp` DATETIME NOT NULL COMMENT '日志时间', `type` INT NOT NULL COMMENT '日志类型', `error_code` INT COMMENT '错误码', `error_msg` VARCHAR(1024) COMMENT '错误详细信息', `op_id` BIGINT COMMENT '负责人id', `op_time` DATETIME COMMENT '处理时间' ) ENGINE = MergeTree() PARTITION BY timestamp ORDER BY timestamp TTL timestamp + INTERVAL 1 DAY TO DISK 'cold_disk' SETTINGS storage_policy = 'hot_to_cold'; 执行以下命令插入验证数据: insert into test_table values('2024-06-04 10:36:00','1','404','Resource Not Found','998756','2024-06-04 11:36:00'); -- hot data insert into test_table values('2024-06-04 10:35:00','1','404','Resource Not Found','998756','2024-06-04 11:35:00'); -- hot data insert into test_table values('2024-06-03 10:33:00','1','404','Resource Not Found','998756','2024-06-03 11:33:00'); -- cold data insert into test_table values('2024-03-27 09:10:00','1','200','ok','998756','2024-03-27 10:10:00'); -- cold data insert into test_table values('2024-03-25 11:08:00','1','404','Resource Not Found','998756','2024-03-25 12:08:00'); -- cold data 查询插入的数据。 查询数据。 select * from test_table FORMAT CS V; 查询数据表分区存储的分区字段名、分区和存储路径。 SELECT name,partition,active,path FROM system.parts WHERE database = 'default' and table = 'test_table' and active = 1; 图1 查询数据 当前系统时间为2024年6月4日22点,test_table表timestamp列超过一天的数据存储到了名为cold_disk的OBS下。
  • 开始导入 下面我们通过几个实际的场景示例来看Broker Load的使用。 数据样例: '100','101','102','103','104','105',100.00,100.01,100.02,'100',200,100.08,2022-04-01 '101','102','103','104','105','105',100.00,100.01,100.02,'100',200,100.08,2022-04-02 '102','103','104','105','106','105',100.00,100.01,100.02,'100',200,100.08,2022-04-03 准备工作: 在本地创建示例数据文件source_text.txt,并上传至hdfs的/tmp/。 在hive中创建ods_source表。 CREATE TABLE `ods_source`( `id` string, `store_id` string, `company_id` string, `tower_id` string, `commodity_id` string, `commodity_name` string, `commodity_price` double, `member_price` double, `cost_price` double, `unit` string, `quantity` string, `actual_price` double, `day ` string ) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile; 将hdfs创建的txt文件导入到ods_source表。 load data inpath '/tmp/source_text.txt' into table ods_source;
  • 相关系统配置 FE配置。 下面几个配置属于Broker load的系统级别配置,也就是作用于所有Broker load导入任务的配置。主要通过修改FE配置项来调整配置值。 max_bytes_per_broker_scanner/max_broker_concurrency max_bytes_per_broker_scanner配置限制了单个BE处理的数据量的最大值。max_broker_concurrency配置限制了一个作业的最大的导入并发数。最小处理的数据量(默认64M),最大并发数,源文件的大小和当前集群BE的个数 共同决定了本次导入的并发数。 本次导入并发数=Math.min(源文件大小/最小处理量(默认64M),最大并发数,当前BE节点个数)。 本次导入单个BE的处理量=源文件大小/本次导入的并发数。 通常一个导入作业支持的最大数据量为max_bytes_per_broker_scanner*BE节点数。如果需要导入更大数据量,则需要适当调整max_bytes_per_broker_scanner参数的大小。 默认配置: 参数名:max_broker_concurrency, 默认10。 参数名:max_bytes_per_broker_scanner,默认3G,单位bytes。
  • 作业调度 系统会限制一个集群内正在运行的Broker Load作业数量,以防止同时运行过多的Load作业。 首先,FE的配置参数:desired_max_waiting_jobs会限制一个集群内未开始或正在运行(作业状态为PENDING或LOADING)的Broker Load作业数量。默认为100。如果超过这个阈值,新提交的作业将会被直接拒绝。 一个Broker Load作业会被分为pending task和loading task阶段。其中pending task负责获取导入文件的信息,而loading task会发送给BE执行具体的导入任务。 FE的配置参数async_pending_load_task_pool_size用于限制同时运行的pending task的任务数量。也相当于控制了实际正在运行的导入任务数量。该参数默认为10。也就是说,假设用户提交了100个Load作业,同时只会有10个作业会进入LOADING状态开始执行,而其他作业处于PENDING等待状态。 FE的配置参数async_loading_load_task_pool_size用于限制同时运行的loading task的任务数量。一个Broker Load作业会有1 pending task和多个loading task(等于LOAD语句中DATA INFILE子句的个数)。所以async_loading_load_task_pool_size应该大于等于async_pending_load_task_pool_size。
  • 基本原理 用户在提交导入任务后,FE会生成对应的Plan并根据目前BE的个数和文件的大小,将Plan分给多个BE执行,每个BE执行一部分导入数据。 BE在执行的过程中会从Broker拉取数据,在对数据transform之后将数据导入系统。所有BE均完成导入,由FE最终决定导入是否成功。 + | 1. user create broker load v +----+----+ | | | FE | | | +----+----+ | | 2. BE etl and load the data +--------------------------+ | | | +---v---+ +--v----+ +---v---+ | | | | | | | BE | | BE | | BE | | | | | | | +---+-^-+ +---+-^-+ +--+-^--+ | | | | | | | | | | | | 3. pull data from broker +---v-+-+ +---v-+-+ +--v-+--+ | | | | | | |Broker | |Broker | |Broker | | | | | | | +---+-^-+ +---+-^-+ +---+-^-+ | | | | | | +---v-+-----------v-+----------v-+-+ | HDFS/BOS/AFS cluster | | | +----------------------------------+
  • 数据模型选择 Doris数据模型上目前分为三类:AGGREGATE KEY,UNIQUE KEY,DUPLICATE KEY。三种模型中数据都是按KEY进行排序。 Aggregate模型。 Aggregate模型可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景。但是该模型对count( * ) 查询很不友好。同时因为固定了Value列上的聚合方式,在进行其他类型的聚合查询时,需要考虑语意正确性。 Aggregate Key相同时,新旧记录进行聚合,目前支持的聚合函数有SUM,MIN,MAX,REPLACE。 CREATE TABLE site_visit ( siteid INT, city SMALLINT, username VARCHAR(32), pv BIGINT SUM DEFAULT '0' ) AGGREGATE KEY(siteid, city, username) DISTRIBUTED BY HASH(siteid) BUCKETS 10; Unique模型。 Unique模型针对需要唯一主键约束的场景,Unique key相同时,新记录覆盖旧记录,可以保证主键唯一性约束。适用于有更新需求的分析业务。目前Unique key实现上和Aggregate key的REPLACE聚合方法一样,二者本质上相同。但是无法利用ROLLUP等预聚合带来的查询优势(因为本质是REPLACE,没有SUM这种聚合方式)。 CREATE TABLE sales_order ( orderid BIGINT, status TINYINT, username VARCHAR(32), amount BIGINT DEFAULT '0' ) UNIQUE KEY(orderid) DISTRIBUTED BY HASH(orderid) BUCKETS 10; Duplicate模型。 Duplicate模型相同的行不会合并,适合任意维度的Ad-hoc查询。虽然无法利用预聚合的特性,但是不受聚合模型的约束,可以发挥列存模型的优势(列裁剪、向量执行等)。 CREATE TABLE session_data ( visitorid SMALLINT, sessionid BIGINT, visittime DATETIME, city CHAR(20), province CHAR(20), ip varchar(32), brower CHAR(20), url VARCHAR(1024) ) DUPLICATE KEY(visitorid, sessionid) DISTRIBUTED BY HASH(sessionid, visitorid) BUCKETS 10;
  • 大宽表与Star Schema 业务方建表时, 为了和前端业务适配, 往往不对维度信息和指标信息加以区分, 而将Schema定义成大宽表,这种操作对于数据库其实不是那么友好,我们更建议用户采用星型模型。 Schema中字段数比较多, 聚合模型中可能key列比较多, 导入过程中需要排序的列会增加。 维度信息更新会反应到整张表中,而更新的频率直接影响查询的效率。 使用过程中,建议用户尽量使用Star Schema区分维度表和指标表。频繁更新的维度表也可以放在MySQL外部表中。而如果只有少量更新, 可以直接放在Doris中。在Doris中存储维度表时,可对维度表设置更多的副本,提升Join的性能。
  • 复制表结构创建表 可以通过复制表结构创建与源表具有相同结构的表。语法: CREATE TABLE [IF NOT EXISTS] [db.]table_name2 ON CLUSTER ClickHouse集群名 AS [db.]table_name1 [ENGINE = engine_name]; 表2 参数说明 参数 说明 db 数据库的名称,默认为当前选择的数据库。 table_name1 被复制表结构的源表。 table_name2 新创建的表。 ON CLUSTER ClickHouse集群名 在每一个节点上都创建一个表,固定为ON CLUSTER ClickHouse集群名。 [ENGINE = engine_name] 表引擎类型。如果没有指定表引擎,默认与被复制表结构的表相同。 示例: 创建数据库。 create database demo; 使用数据库。 use demo; 创建数据表。 create table demo_t(uid Int32,name String,age UInt32,gender String)engine = TinyLog; 复制表结构。 create table demo_t2 as demo_t; 查看表结构。
  • SELECT语句创建 使用指定的表引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果进行填充。 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name ENGINE = engine_name AS SELECT ... 表3 参数说明 参数 说明 database_name 数据库的名称,默认为当前选择的数据库。 table_name 通过SELECT语句创建的表。 ENGINE = engine_name() 表的引擎类型。 SELECT ... SELECT子句。 示例: 创建表。 CREATE TABLE default.demo1 ON CLUSTER default_cluster( `EventDate` DateTime, `id` UInt64)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/demo1', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id; 通过SELECT语句创建表。 create table t3 ON CLUSTER default_cluster ENGINE =MergeTree() order by EventDate as select * from default.demo1; 查询demo1和t3表结构。 desc demo1; 查询结果显示,两张表结构一样。 cloudtable-wlr-click-20230730-06-server-1-1 :) desc demo1; DESCRIBE TABLE demo1 Query id: 712f6b91-668d-4f70-b160-aac8e52f63a4 ┌─name──────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ │ EventDate │ DateTime │ │ │ │ │ │ │ id │ UInt64 │ │ │ │ │ │ └───────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ 2 rows in set. Elapsed: 0.001 sec. cloudtable-wlr-click-20230730-06-server-1-1 :) desc t3; DESCRIBE TABLE t3 Query id: 11b67532-26f0-49c5-b36d-439d45c279bf ┌─name──────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ │ EventDate │ DateTime │ │ │ │ │ │ │ id │ UInt64 │ │ │ │ │ │ └───────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ 2 rows in set. Elapsed: 0.001 sec.
  • 创建本地表 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2[type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = engine_name() [PARTITION BY expr_list] [ORDER BY expr_list] 表1 参数说明 参数 说明 database_name 数据库的名称,默认为当前选择的数据库。 table_name 本地表名。 ON CLUSTERClickHouse集群名 在每一个节点上都创建一个本地表,固定为ON CLUSTER ClickHouse集群名。 name1,name2 列名。 ENGINE = engine_name() 表引擎类型。 双副本版集群建表时,需要使用MergeTree系列引擎中支持数据复制的Replicated*引擎,否则副本之间不进行数据复制,导致数据查询结果不一致。使用该引擎建表时,参数填写方式如下。 ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}'),固定配置,无需修改。 ReplicatedMergeTree(),等同于ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')。 ORDER BY expr_list 排序键,必填项,可以是一组列的元组或任意表达式。 [PARTITION BY expr_list] 分区键。一般按照日期分区,也可以使用其他字段或字段表达式。 示例: 创建数据库。请参见CREATE DATABASE。 使用数据库。 use demo; 创建名为demo.test表。 CREATE TABLE demo.test ON CLUSTER default_cluster(`EventDate` DateTime, `id` UInt64)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id;
  • 元数据缓存设置 创建Catalog时可以采用参数file.meta.cache.ttl-second来设置Hive分区文件缓存自动失效时间,也可以将该值设置为0来禁用分区文件缓存,时间单位为:秒。示例如下: CREATE CATA LOG hive_catalog PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://127.x.x.x:port', 'AWS_AC CES S_KEY' = 'ak', 'AWS_SECRET_KEY' = 'sk', 'AWS_ENDPOINT' = 'obs.cn-north-4.myhuaweicloud.com', 'AWS_REGION' = 'cn-north-4', 'file.meta.cache.ttl-second' = '60', 'yarn.resourcemanager.address' = '192.X.X.X:port', 'yarn.resourcemanager.principal' = 'mapred/hadoop.hadoop.com@HADOOP.COM' );
  • Hive版本 Doris可以正确访问不同Hive版本中的Hive Metastore。在默认情况下,Doris会以Hive2.3版本的兼容接口访问Hive Metastore。你也可以在创建Catalog时指定hive的版本。如访问Hive1.1.0版本: CREATE CATALOG hive_catalog PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://127.x.x.x:port', 'AWS_ACCESS_KEY' = 'ak', 'AWS_SECRET_KEY' = 'sk', 'AWS_ENDPOINT' = 'obs.cn-north-4.myhuaweicloud.com', 'AWS_REGION' = 'cn-north-4', 'hive.version' = '1.1.0', 'yarn.resourcemanager.address' = '192.X.X.X:port', 'yarn.resourcemanager.principal' = 'mapred/hadoop.hadoop.com@HADOOP.COM' );
  • 创建hive catalog 通过连接Hive Metastore,或者兼容Hive Metastore的元数据服务,Doris可以自动获取Hive的库表信息,并进行数据查询。 除了Hive外,很多其他系统也会使用Hive Metastore存储元数据。所以通过Hive Catalog,我们不仅能访问Hive,也能访问使用Hive Metastore作为元数据存储的系统。 创建。 Hive On OBS CREATE CATALOG hive_catalog PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://127.x.x.x:port', 'AWS_ACCESS_KEY' = 'ak', 'AWS_SECRET_KEY' = 'sk', 'AWS_ENDPOINT' = 'obs.cn-north-4.myhuaweicloud.com', 'AWS_REGION' = 'cn-north-4', 'yarn.resourcemanager.address' = '192.X.X.X:port', 'yarn.resourcemanager.principal' = 'mapred/hadoop.hadoop.com@HADOOP.COM' ); Hive On HDFS CREATE CATALOG hive_catalog PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://127.x.x.x:port', 'dfs.nameservices'='hacluster', 'dfs.ha.namenodes.hacluster'='3,4', 'dfs.namenode.rpc-address.hacluster.3'='192.x.x.x:port', 'dfs.namenode.rpc-address.hacluster.4'='192.x.x.x:port', 'dfs.client.failover.proxy.provider.hacluster'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider', 'yarn.resourcemanager.address' = '192.X.X.X:port', 'yarn.resourcemanager.principal' = 'mapred/hadoop.hadoop.com@HADOOP.COM' ); 创建后查询: select * from hive_catalog.DB.test_table;
  • 客户端下载RPM 以发布私有组件到RPM私有依赖库中发布的Rpm私有组件为例,介绍如何从Rpm私有依赖库中获取依赖包。 参考发布Rpm私有组件的2、3,下载Rpm私有依赖库配置文件。 打开配置文件,将文件中所有“{{component}}”替换为上传Rpm文件时使用的“{{component}}”值(本文档中该值为“hello”),并删除“rpm上传命令”部分,保存文件。 将修改后的配置文件保存到Linux主机的“/etc/yum.repos.d/”目录中。 执行以下命令,下载Rpm组件。其中,hello为组件的“component”值,请根据实际情况修改。 yum install hello
  • 客户端下载Generic组件 使用以下命令进行客户端下载: curl -o {{localFileName}} -k -u "{{username}}:{{password}}" -X GET {{repo_url}}/{{filePath}} localFileName:下载Generic组件到本地的路径(包含名称)。 filePath:Generic仓库中组件的路径(包含名称)。 username、password、repo_url的值从2下载的“generic.txt”文件获取,如下图所示。
  • 客户端下载Maven组件 使用客户端工具为Maven,请确保已安装JDK和Maven。 1. 从私有依赖库页面下载settings.xml文件,将下载的配置文件直接替换或按提示修改maven的settings.xml文件。 2. 使用以下命令进行客户端下载: mvn dependency:get -DremoteRepositories={repo_url} -DgroupId={groupId} -DartifactId={artifactId} -Dversion={version} -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true
  • 客户端上传RPM组件 使用linux系统和yum工具,请确保使用linux系统,且已安装yum。 检查linux下是否安装yum工具。 在linux主机中输入 rpm -qa yum 如出现如下内容 则证明机器已安装yum 登录制品仓库,进入Rpm私有依赖库。单击页面右侧“操作指导”。 在弹框中单击“下载配置文件”。 在Linux主机中执行以下命令,上传Rpm组件 curl -k -u {{user}}:{{password}} -X PUT https://{{repoUrl}}/{{component}}/{{version}}/ -T {{localFile}} 其中,“user”、“password”、“repoUrl”来源于上一步下载的配置文件中“rpm上传命令”部分。 user:位于curl -u与-X之间、“:”之前的字符串。 password:位于curl -u与-X之间、“:”之后的字符串。 repoUrl:“https://”与“/{{component}}”之间的字符串。 “component”、“version”、“localFile”来源于待上传的Rpm组件。以组件“hello-0.17.2-54.x86_64.rpm”为例。 component:软件名称,即“hello”。 version:软件版本,即“0.17.2”。 localFile:Rpm组件,即“hello-0.17.2-54.x86_64.rpm”。 完整的命令行如下图所示: 命令执行成功,进入私有依赖库,可找到已上传的Rpm私有组件。
  • 客户端上传Docker组件 前提条件: 已安装Docker客户端。 私有依赖库中已创建 Docker仓库 。 操作步骤: 从私有库页面选择对应的Docker仓库,单击“操作指导”。 单击“下载配置文件”,下载配置文件“config.json”。 获取已下线的配置文件中的{username}、{password}。 在本地客户端执行以下命令,登录Docker私有依赖库。 docker login {url} -u ${username} -p ${password} url:仓库地址。 username:3中获取的{username}。 password:3中获取的{password}。 在本地客户端执行以下命令,打包镜像。 docker tag ${image_name1}:${image_version1} {url}/${image_name2}:${image_version2} image_name1:本地镜像名称。 image_version1:本地镜像版本号。 url:仓库地址。如下图所示。 image_name2:用户可以设置上传后的镜像名称,组件名称将显示在Docker私有依赖库组件列表中。 image_version2:用户可以设置上传后的镜像版本。 在本地客户端执行以下命令,上传Docker组件至私有依赖库。 docker push {url}/${image_name}:${image_version} url:仓库地址。如下图所示。 image_name:输入5中的“image_name2”。 image_version:输入5中的“image_version2”。 在Docker私有依赖库中查看已上传的组件。
  • 客户端上传Generic组件 前提条件: 登录CodeArts首页。 操作步骤: 从私有依赖库页面选择对应的Generic仓库,单击“操作指导”。 在“操作指导”对话框下载配置文件“generic.txt”文件。 执行以下命令将Generic制品包上传到仓库。 curl -k -u "{{username}}:{{password}}" -X PUT {{repo_url}}/{{filePath}} -T {{localFile}} file path:待上传的Generic仓库路径(包含名称)。 localFile:本地Generic制品包的路径(包含名称)。 username、password、repo_url的值从2下载的“generic.txt”文件获取,如下图所示。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全