ByteHouse 广泛应用于实时推荐系统、广告投放、A/B 测试等数据分析场景。
当前 ByteHouse 在火山引擎支持的地域请参考 地域及可用区,您可以根据业务情况选择合适的地域和可用区来部署 ByteHouse。
如您对于其他地域和可用区的服务有需求,请提交工单联系我们。
当前 ByteHouse 云数仓版支持如下数据源的导入
类型 | 数据源 | 备注 |
|---|---|---|
离线导入 | 文件传输 | 文件小于 200 MB 时适用 |
离线导入 | 火山引擎对象存储 TOS | 适用于大文件离线导入 |
离线导入 | 阿里云对象存储 OSS | 适用于跨云大文件离线导入 |
离线导入 | AWS 对象存储 S3 | 适用于跨云大文件离线导入 |
实时导入 | Apache Kafka | 适用于实时流数据导入 |
数据源 | 支持的数据格式 | 备注 |
|---|---|---|
文件上传 | 支持 .csv, .json, .xls, .avro, .parquet, .csv.gz 等格式 | 上传文件需小于 200 MB |
火山 TOS, AWS S3, 阿里云 OSS 等 | 支持 .csv, .json, .xls, .avro, .parquet, .csv.gz 等格式 | 最多选中 100 个文件批量上传 |
Apache Kafka | 支持 JSON 和 Parquet 格式 |
当前 ByteHouse 支持 DataWind 、 Power BI 、Superset、 Tableau BI 等工具的对接,更多 BI 工具的集成还在开发中。
当前 ByteHouse 支持 ANSI SQL 2011 和 Clickhouse SQL 两种语义,用户可以在控制台或客户端指定。
当前 ByteHouse 兼容 ClickHouse 23.3 语法。
推荐指定到一个大的计算组查询效率更高。
您可以在 ByteHouse 控制台的租户管理>基本信息页面查看您当前的引擎版本。
不同地域的默认时区不同,您可通过执行以下 SQL 语句查看您所在地域的默认时区。
SELECT timezone();
示例:
计算组的节点数与您购买的规格直接相关,且当前在控制台暂未直接展示,具体规则如下:
可参考设置网络信息文档,通过绑定客户的私有网络VPC后生成一个私网域名,客户可以从绑定的VPC的任何资源内通过私网域名进行连接ByteHouse CDW。
因为在做私有网络VPC打通时,客户的VPC网段和ByteHouse自身服务的VPC网段不能有冲突,所以ByteHouse服务会将有冲突的网段进行过滤,以下是不同的Region会进行过滤的网段:
若此时没有可选的VPC,解决办法为创建一个与以上网段不冲突的VPC,比如:192.168.128.0/24。
unknown host;IP和端口可telnet通,但是配在jdbc url中无法连接等。https://tenant-{TENANT_ID}-{REGION}-public.bytehouse.volces.com:8123 。jdbc:bytehouse://tenant-{TENANT_ID}-{REGION}-public.bytehouse.volces.com:19000/${your_database}?secure=true ,需要确保已配置 **secure=true **。bytehouse-vpc 网段存在冲突。若网段重叠,会导致 VPC 内路由规则紊乱,无法建立正常连接,因此系统会屏蔽冲突的子网,使其不可选。bytehouse-vpc 网段无冲突的子网。目前API_KEY 只能支持两个,每个子账号都有独立的两个API_KEY, 如果需要更多API_KEY的需求,可以通过不同的子账号来进行生成多个API_KEY。
不可以,ByteHouse cdw 不支持此种方式,ByteHouse cdw 当前仅支持支持用api token的方式连接ByteHouse数据库,
具体的规范操作请参见调用方式。
AccountAdmin / SystemAdmin 为特殊的admin角色,角色权限范围映射到火山IAM里的策略里等同于:
如需给用户配置以上角色,可在火山引擎的访问控制(IAM)里给用户配上对应的权限策略,或把用户加到有对应策略的用户组里,等3~5分钟即可。
system admin 是映射的 火山的bytehouse full access 策略,如果火山子账号配置了该策略,ByteHouse会自动映射继承该权限。在ByteHouse内部无法给子账号授予Account Admin / System Admin。在火山IAM里给用户配上对应的策略 / 把用户加到有对应策略的用户组里,等3~5分钟即可生效。
登录 ByteHouse 云数仓版控制台,单击顶部租户管理,单击连接信息,在 API Key 模块,单击 API Key 所在行的编辑按钮,在弹出的编辑窗口中,修改 API Key 有效期。您可将其延长至指定时间或将其调整为永久有效:
如使用JDBC连接bytehouse,可以参考 ByteHouse JDBC Driver文档,其中username统一都为bytehouse,密码为API_KEY,API_KEY可以在租户管理的连接信息中进行生成获取。
不支持,当前仅支持1.8java 编译的jdbc。
使用JDBC连接ByteHouse后,您可以使用 ((ByteHouseConnection) connection).setQueryId(queryId)来自定义query id。以下是自定义 query id 的示例:
try { statement.execute(String.format("CREATE DATABASE IF NOT EXISTS %s", databaseName)); statement.execute(String.format("CREATE TABLE IF NOT EXISTS %s (id INT) " + "ENGINE=CnchMergeTree() order by tuple()", tableName)); for (String queryId: queryIds) { // While constructing the prepared statement object, JDBC already sends the query to server. So we // need to set the queryId before constructing the prepared statement object. // While sending query, JDBC driver will use the queryId set in the connection object, or random UUID number if not set. // After sending the query, JDBC driver will reset the queryId. ((ByteHouseConnection) connection).setQueryId(queryId); ByteHousePreparedInsertStatement pstmt = (ByteHousePreparedInsertStatement) statement. getConnection().prepareStatement(String.format("INSERT INTO %s VALUES(?)", tableName)); pstmt.setObject(1, 1); pstmt.addBatch(); pstmt.executeBatch(); } } finally { statement.execute(String.format("DROP DATABASE IF EXISTS %s", databaseName)); }
目前在连接方式上无法配置 vw ,只能在SQL命令后面加 SETTINGS virtual_warehouse = 'vw-名字',或者先在全局设置set virtual_warehouse = 'vw-名字', 再执行SQL命令。
from bytehouse_driver import Client import uuid def BH_driver_client(host, port, api_key): client = Client.from_url('bytehouse://bytehouse:{}@{}:{}/?secure=true&connect_timeout=20&send_timeout=3600&receive_timeout=3600'.format(api_key, host, port)) return client if __name__ == '__main__': PORT = 19000 HOST_AWS_AP = 'gateway.aws-{REGION}.bytehouse.cloud' API_KEY = "xxxxxxxxxx" client = BH_driver_client(HOST_AWS_AP, PORT, API_KEY) query_id = str(uuid.uuid4()) print("query_id:"+query_id) result_set = client.execute("select version()", query_id=query_id) for result in result_set: print(result)
no virtual warehouse was selected说明
使用以下两种解决方案时,均需保障设置的计算组是启动状态, 或者是暂停状态但是计算组设置了允许自启动,否则即使设置完成计算组SQL执行依旧会报错。
解决方案1:在租户管理里面去配置一个默认计算组。
解决方案2:在执行SQL时候指定计算组,如:SELECT column FROM database.table WHERE your_condition SETTINGS virtual_warehouse='vw-uuid'
以原命令为以下示例命令为例:bytehouse-cli --host http://bytehouse-{REGION}.volces.com --port 19000 --secure --token xxxxxx -q "INSERT INTO xxx.xxxx (xxxx) format CSVWithNames" < 'xxxx.csv'
解决方案为:建议加上参数——连接超时配置 。连接超时时间默认是3s, i/o timeout会受网络的影响,或者server端一些变化会导致偶发断开连接等等,建议将连接超时时间稍微调大一点。
以配置连接超时时间为10s为例-ct 10 :bytehouse-cli --host http://bytehouse-{REGION}.volces.com --port 19000 --secure --token xxxxxx -ct 10 -q "INSERT INTO xxx.xxxx (xxxx) format CSVWithNames" < 'xxxx.csv'
Code : "AccessDenied" CodeN : 100013 Message : "User is not authorized to perform: Volc_Observe:GetMetricsData on resource:set max_execution_time = 60,再执行SQL。sql setting max_execution_time = 60在执行长时间运行SQL语句之前,使用set语句设置一下session级别的超时参数,例如:set receive_timeout = 10800000, send_timeout = 10800000;
Unique表和非Unique表的update/delete 语法不同。
说明
判断是否为Unique表的方法是建表语句中有无配置 :UNIQUE KEY 。
Unique表语法
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] DELETE FROM <表名> [WHERE 子句]
非Unique表语法
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] [IN PARTITION partition_expr] WHERE filter_expr ALTER TABLE [db.]table DELETE [IN PARTITION partition_expr] WHERE filter_expr
left join 中左表存在但右表不存在的数据,默认情况下以null补充右表不存在的数据,您也可以可以通过settings join_use_nulls=0配置以空值来补充补充,示例如下。
SELECT a.id, a.name, b.address FROM users AS a LEFT JOIN user_details AS b ON a.id = b.user_id settings join_use_nulls=0;
unique 表
删除分区命令 | 功能说明 |
|---|---|
alter drop partition语句(推荐) | 删除分区,支持所有表,底层直接删除目录,性能好,建议优先使用。
|
delete 语句(不推荐) | 删除数据为同步删除,底层是先查再删除,是追加文件的方式删除,消耗性能,并且只支持unique表。
|
非unique表
删除分区命令 | 功能说明 |
|---|---|
alter drop partition语句(推荐) | 删除分区,支持所有表,底层直接删除目录,性能好,建议优先使用。
|
alter delete(不推荐) | 删除数据为异步删除,不支持unique表。
|
DML
操作 | 执行方式 |
|---|---|
INSERT | 同步 |
ALTER TABLE ... DELETE WHERE | 异步 |
ALTER TABLE ... UPDATE WHERE | 异步 |
OPTIMIZE TABLE | 异步,mutaitons_sync = 1 会尽量同步 |
TRUNCATE TABLE | 同步 |
delete where | 同步 |
DDL
DDL 语句类型 | 示例 | 执行方式 |
|---|---|---|
CREATE | CREATE DATABASE,CREATE TABLE | 同步 |
DROP | DROP DATABASE,DROP TABLE | 同步 |
ALTER | ALTER TABLE ... ADD COLUMN(同步) | 同步 |
RENAME | RENAME TABLE | 同步 |
TRUNCATE | TRUNCATE TABLE | 同步 |
ATTACH / DETACH | ATTACH TABLE,DETACH TABLE | 同步 |
SHOW / DESCRIBE | SHOW TABLES,DESCRIBE TABLE | 同步 |
EXISTS | EXISTS TABLE,EXISTS DATABASE | 同步 |
SYSTEM | SYSTEM DROP PARTITION(异步),RELOAD TABLES(同步) | 混合 |
如果您使用 DROP TABLE 误删了表,可通过 UNDROP TABLE 恢复。该方式仅限于恢复 DROP TABLE 的删除操作,且有效期有限,当前最多支持恢复两天内删除的表,可用于临时误操作止损。强烈推荐您使用备份恢复功能,详情请参见备份恢复。
使用示例如下:
# 删除表,但发现误删该表 DROP TABLE db_name.table_name; # 使用 UNDROP TABLE 恢复表 UNDROP TABLW db_name.table_name; # 查询数据,校验是否恢复成功 SELECT count() FROM db_name.table_name;
此类(for query)满的报错,是单个 Query 的内存限制超限导致的,可以检查并确认下 SQL 是否有优化空间,例如:
相关配置参数为 max_memory_usage,如果实际 SQL 运行的内存很大,可以提交工单或联系 ByteHouse 官方同学调大该值。
此类(total)满的报错,是节点整体的内存超限,可以检查一下,计算组的内存监控,确认是否符合预期(默认这个限制是计算组内存的90%)。
解决方案:
max_concurrent_queries(最大并发查询数)的值;解决办法:
ALTER TABLE your_dabase.your_table MODIFY SETTING cnch_vw_write = 'vw_id' 加快后台的数据merge速度。完整报错:Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting. Large number of partitions is a common misconception. It will lead to severe negative performance impact, including slow server startup, slow INSERT queries and slow SELECT queries. Recommended total number of partitions for a table is under 1000..10000. Please note, that partitioning is not intended to speed up SELECT queries (ORDER BY key is sufficient to make range queries fast).
可能原因:说明当前单次攒批INSERT写入了多个分区(默认100)。分区文件过多,可能会严重影响导入效果和查询速度。
解决方案:
PARTITION BY (toDate(`event_time`))
insert into tabla_name values('1') settings max_partitions_per_insert_block = xxx说明
delete命令不支持setting , 可以临时设置 session级别的 如: set max_partitions_per_insert_block = xxx;,再执行sql
查询超时,需要添加以下参数来增大超时时间(单位为秒)
以JDBC为例:
jdbc:bytehouse://gateway-qa.volc-boe-new.offline.bytehouse.cn:19000?api_key=xxx&send_timeout=10000&receive_timeout=10000&max_execution_time=10000
或者session级别设置,在执行sql前先执行
set receive_timeout = 10800000, send_timeout = 10800000;
报错信息示例如下:
Code: 2010, e.displayText() = DB::Exception: Query [6xxxxx-fxxx-4xxx-axxx-dxxxxxxxxxx3] failed with RootCause: SegmentId: 0, ErrorCode:2010, Message: Fail to call DB.Protos.RegistryService.registry, error code: 1011, msg: [E1011][192.168.
解答:
RPC 通信的 socket 队列里的 buffer 超出限制,可先增大该 buffer 的大小。
需要在 server 和计算组两个层面同时配置 socket_max_unwritten_bytes 参数。
有函数名从 vvcfunnelOpt 变成了 finderGroupFunnel,这个 函数 不支持 不配置 mode ,如果没有填 mode 值,直接填后面的 chekc_envent 参数校验时会不通过,或者通过了但结果不符合预期,比如把传入的第一个事件字段当作分组字段,第二个事件字段当作第一个事件字段。
不支持内网访问,这个功能还不开放,需求在评估排期中,预计在2025年会排期。
当前不支持内网访问,需要配置公网访问,只需要开放bytehouse cdw 的公网访问就可以了,公网信息详情请参见地域及可用区。
端口:随机,请开放所有端口。
IP地址:不同region 的公网访问地址如下。
区域 Regions | 公网出口 IP |
|---|---|
华北2(北京) | 111.62.122.179 |
华东2(上海) | 180.184.161.45 |
华南1(广州) | 118.145.156.236 |
Kafka场景 | 配置要点 |
|---|---|
kafka集群配置了公网访问地址。 | 直接页面配置,地址用kafka公网地址 |
Kafka无公网访问地址,且与ByteHouse在同一地域。 | 可使用私网地址对接ByteHouse,参考文档:ByteHouse Kafka Import with Private IP address |
Kafka无公网访问地址,且与ByteHouse不在同一地域。 | 建议使用datasail 链路是 : 客户kafka -> sail -> cdw |
第一个列用相同名,后面的都用 col01,cil02 。。。,中间表达式来引用,例如,kafka字段数据是 :"ds_http_uri_query": "a=1&b=2", 取出字段 a,和b 的值到ByteHouse的两个字段
extractURLParameter(concat('http://?',ds_http_uri_query), 'a')extractURLParameter(concat('http://?',ds_http_uri_query), 'b')嵌套解析的详情请参见Kafka 流式数据导入实践:JSON 嵌套解析。
ByteHouse 数据导入默认支持自动解析的日期格式为:yyyy-MM-dd'T'HH:mm:ss ( Java 默认的时间格式),注意年月日和十份秒中间用常量 T 隔开。如果您的数据使用其他格式,则需要手动配置,配置步骤如下:
在使用本地小文件导入或其他导入方式导入文件时,通常会遇到时区导入异常(比如时区被 +8,或者时区被 -8)等问题。本节将介绍一些导入方式的最佳实践,避免类似问题。
建议用以下两种方式在文件中存储时间,可以避免导入时转换日期的时区问题。
建议存储日期时添加时区信息。
带时区的信息(推荐) | 不带时区信息的日期(不推荐) | |
|---|---|---|
样例值 | 2025-01-02 12:13:14+0800 | 2025-01-02 12:13:14 |
对应格式 | yyyy-MM-dd HH:mm:ssZ | yyyy-MM-dd HH:mm:ss |
对于时间精度较高的日期,建议使用 Int 类型存储日期。
精度为秒 | 精度为毫秒 | |
|---|---|---|
样例值 | 1735791194 | 1735791194000 |
对应格式 | seconds | milliseconds |
建表时,如果时间类型的列在分区中,建议明确指定时间分区,示例如下: