云服务器内容精选
-
列存表存储机制 在 GaussDB (DWS)中,列存表以压缩单元(CU)为最小存储单位,每列默认以60000行当做一个CU进行存储。由于CU采用追加写模式,更新和删除操作不会修改原有CU。CU一旦生成,其数据便不可更改,无论插入1条还是60,000条数据,都会生成一个新的完整CU。 因此使用过程中会产生如下问题: 删除操作:仅在字典中将旧数据标记为作废,并未释放空间。 更新操作:标记旧数据删除后,将新记录写入新的CU。 空间问题:频繁更新/删除会导致表空间膨胀和大量存储空间无法有效利用。
-
HStore表的优势 HStore表采用附加delta表的形式,可以实现高效的存储与更新平衡,具体表现在以下几个方面: 批量数据处理: 批量插入数据直接写入CU 保持与传统列存一致的压缩效率 增量数据处理: 更新的列数据和小批量插入先序列化压缩 通过后台定期MERGE操作整合到主表CU 存储效率: 最大程度降低磁盘占用空间 保持列存格式的高压缩率特性 性能表现: 支持高并发更新操作入库 提供卓越的查询响应速度 适用场景 需要实时数据入库和实时查询 要求具备传统TP事务处理能力 高并发更新与查询并重的混合负载
-
使用建议 参数设置 为确保HStore表的查询性能与存储效率,推荐参数设置: 1 2 3 4 autovacuum_max_workers_hstore=3 # 专用于HStore的MERGE线程数 autovacuum_max_workers=6 # 系统总autovacuum线程数 autovacuum=true # 启用自动清理 enable_col_index_vacuum=on # 启用列索引清理 入库建议(推荐使用HStore_opt表) 更新操作: 避免直接使用UPDATE,改用UPSERT方式。 删除操作: 确保执行计划走索引扫描。 采用JDBC batch方式入库效率最佳。 批量入库: 单次入库量超过100W/DN且数据无重复时,考虑使用MERGE INTO。 常规场景推荐使用UPSERT。 点查建议(推荐使用HStore_opt表) 在等值过滤条件使用最多且distinct值分布相对均匀的一个列上创建二级分区(distinct值的分布过于倾斜或者个数太少的列不要创建二级分区); 除了二级分区之外的等值过滤列,如果过滤条件涉及的列在查询中基本固定,使用cbtree索引,创建索引的列数不要超过5列; 除了二级分区之外的等值过滤列,如果过滤条件涉及的列在不同查询中变化,使用gin索引,创建索引的列数不要超过5列; 所有涉及等值过滤的字符串列,都可以建表时指定bitmap索引,不限列数,后续不可修改; 时间范围过滤的列,指定为分区列; 点查返回数据量超过10W/dn的场景,索引扫描很可能不如非索引扫描,建议使用guc参数enable_seqscan对比测试下性能,灵活选择。 索引相关 索引会占用额外存储空间 对性能提升有要求时创建索引 需要执行UPSERT操作时使用索引 有唯一性或接近唯一的点查需求使用索引。 MERGE相关 入库速度控制: 入库速度不得超过MERGE处理能力 通过控制入库并发防止Delta表膨胀 空间复用问题: Delta表空间复用受oldestXmin影响 长时间运行的事务可能导致空间复用延迟和膨胀
-
快捷代码操作 目前除了“SQL生成”功能,其他均可直接与开发脚本直接交互。 示例一:以“SQL解释”功能为例,选中脚本编辑器里的代码,单击“SQL解释”,可以直接开始对话,大模型会解释选中的代码。 图1 选中SQL代码 图2 SQL解释 示例二:选中脚本编辑器里代码,在对话侧输入相关指令,也能对选中代码进行操作,以“注释代码”为例,大模型生成注释的代码。 图3 注释代码 图4 SQL查询代码注释 选中代码之后,开启对话(除了SQL生成)均会带上所选代码片段。如果不希望选中代码干扰正常对话,请先手动取消代码片段的选择,再进行对话。 父主题: 盘古助手和数据开发交互
-
数据开发的主要功能 表1 数据开发的主要功能 支持的功能 说明 数据管理 支持管理DWS、 DLI 、 MRS Hive等多种 数据仓库 。 支持可视化和DDL方式管理数据库表。 脚本开发 提供在线脚本编辑器,支持多人协作进行SQL、Shell、Python脚本在线代码开发和调测。 支持使用变量和函数。 作业开发 提供图形化设计器,支持拖拉拽方式快速构建数据处理工作流。 预设数据集成、SQL、Shell等多种任务类型,通过任务间依赖完成复杂数据分析处理。 支持导入和导出作业。 资源管理 支持统一管理在脚本开发和作业开发使用到的file、jar、archive类型的资源。 作业调度 支持单次调度、周期调度和事件驱动调度,周期调度支持分钟、小时、天、周、月多种调度周期。调度周期配置为小时,系统支持按间隔小时和离散小时配置调度周期。 运维监控 支持对作业进行运行、暂停、恢复、终止等多种操作。 支持查看作业和其内各任务节点的运行详情。 支持配置多种方式报警,作业和任务发生错误时可及时通知相关人,保证业务正常运行。
-
数据开发中的对象 数据连接:定义访问数据实体存储(计算)空间所需信息的集合,包括连接类型、名称和登录信息等。 解决方案:解决方案为用户提供便捷的、系统的方式管理作业,更好地实现业务需求和目标。每个解决方案可以包含一个或多个业务相关的作业,一个作业可以被多个解决方案复用。 作业:作业由一个或多个节点组成,执行作业可以完成对数据的一系列操作。 脚本:脚本(Script)是一种批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。 节点:定义对数据执行的操作。 资源:用户可以上传自定义的代码或文本文件作为资源,以便在节点运行时调用。 表达式:数据开发作业中的节点参数可以使用表达式语言(Expression Language,简称EL),根据运行环境动态生成参数值。数据开发EL表达式包含简单的算术和逻辑计算,引用内嵌对象,包括作业对象和一些工具类对象。 环境变量:环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所使用到的信息。 补数据:手工触发周期方式调度的作业任务,生成某时间段内的实例。
-
使用案例 案例场景 因数据规整要求,需要周期性地将多组DLI源数据表数据导入到对应的DLI目的表,如表1所示。 表1 需要导入的列表情况 源数据表名 目的表名 a_new a b_2 b c_3 c d_1 d c_5 e b_1 f 如果通过SQL节点分别执行导入脚本,需要开发大量脚本和节点,导致重复性工作。在这种情况下,我们可以使用For Each节点进行循环作业,节省开发工作量。 配置方法 准备源表和目的表。为了便于后续作业运行验证,需要先创建DLI源数据表和目的表,并给源数据表插入数据。 创建DLI表。您可以在 DataArts Studio 数据开发中,新建DLI SQL脚本执行以下SQL命令,也可以在 数据湖探索 (DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 创建数据表 */ CREATE TABLE a_new (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b_2 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c_3 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE d_1 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c_5 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b_1 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE a (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c (name STRING, score INT) STORED AS PARQUET; CREATE TABLE d (name STRING, score INT) STORED AS PARQUET; CREATE TABLE e (name STRING, score INT) STORED AS PARQUET; CREATE TABLE f (name STRING, score INT) STORED AS PARQUET; 给源数据表插入数据。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令,也可以在 数据湖 探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 源数据表插入数据 */ INSERT INTO a_new VALUES ('ZHAO','90'),('QIAN','88'),('SUN','93'); INSERT INTO b_2 VALUES ('LI','94'),('ZHOU','85'); INSERT INTO c_3 VALUES ('WU','79'); INSERT INTO d_1 VALUES ('ZHENG','87'),('WANG','97'); INSERT INTO c_5 VALUES ('FENG','83'); INSERT INTO b_1 VALUES ('CEHN','99'); 准备数据集数据。您可以通过以下方式之一获取数据集: 您可以将表1数据导入到DLI表中,然后将SQL脚本读取的结果作为数据集。 您可以将表1数据保存在OBS的 CS V文件中,然后通过DLI SQL或DWS SQL创建OBS外表关联这个CSV文件,然后将OBS外表查询的结果作为数据集。DLI创建外表请参见OBS输入流,DWS创建外表请参见创建外表。 您可以将表1数据保存在HDFS的CSV文件中,然后通过HIVE SQL创建Hive外表关联这个CSV文件,然后将HIVE外表查询的结果作为数据集。MRS创建外表请参见创建表。 本例以方式1进行说明,将表1中的数据导入到DLI表(Table_List)中。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令导入数据,也可以在数据湖探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 创建数据表TABLE_LIST,然后插入表1数据,最后查看生成的表数据 */ CREATE TABLE Table_List (Source STRING, Destination STRING) STORED AS PARQUET; INSERT INTO Table_List VALUES ('a_new','a'),('b_2','b'),('c_3','c'),('d_1','d'),('c_5','e'),('b_1','f'); SELECT * FROM Table_List; 生成的Table_List表数据如下: 图2 Table_List表数据 创建要循环运行的子作业ForeachDemo。在本次操作中,定义循环执行的是一个包含了DLI SQL节点的任务。 进入DataArts Studio数据开发模块选择“作业开发”页面,新建作业ForeachDemo,然后选择DLI SQL节点,编排图3所示的作业。 DLI SQL的语句中把要替换的变量配成${}这种参数的形式。在下面的SQL语句中,所做的操作是把${Source}表中的数据全部导入${Destination}中,${fromTable}、${toTable} 就是要替换的变量参数。SQL语句为: INSERT INTO ${Destination} select * from ${Source}; 此处不能使用EL表达式#{Job.getParam("job_param_name")} ,因为此表达式只能直接获取当前作业里配置的参数的value,并不能获取到父作业传递过来的参数值,也不能获取到工作空间里面配置的全局变量,作用域仅为本作业。 而表达式${job_param_name},既可以获取到父作业传递过来的参数值,也可以获取到全局配置的变量。 图3 循环执行子作业 配置完成SQL语句后,在子作业中配置作业参数。此处仅需要配置参数名,用于主作业ForeachDemo_master中的For Each节点识别子作业参数;参数值无需填写。 图4 配置子作业参数 配置完成后保存作业。 创建For Each节点所在的主作业ForeachDemo_master。 进入DataArts Studio数据开发模块选择“作业开发”页面,新建数据开发主作业ForeachDemo_master。选择DLI SQL节点和For Each节点,选中连线图标并拖动,编排图5所示的作业。 图5 编排作业 配置DLI SQL节点属性,此处配置为SQL语句,语句内容如下所示。DLI SQL节点负责读取DLI表Table_List中的内容作为数据集。 SELECT * FROM Table_List; 图6 DLI SQL节点配置 配置For Each节点属性。 子作业:子作业选择步骤2已经开发完成的子作业“ForeachDemo”。 数据集:数据集就是DLI SQL节点的Select语句的执行结果。使用EL表达式#{Job.getNodeOutput('preDLI')},其中preDLI为前一个节点的名称。 子作业参数:用于将数据集中的数据传递到子作业以供使用。Source对应的是数据集Table_List表的第一列,Destination是第二列,所以配置的EL表达式分别为#{Loop.current[0]}、#{Loop.current[1]}。 图7 配置For Each节点 配置完成后保存作业。 测试运行主作业。 单击主作业画布上方的“测试运行”按钮,测试作业运行情况。主作业运行后,会通过For Each节点自动调用运行子作业。 单击左侧导航栏中的“实例监控”,进入实例监控中查看作业运行情况。等待作业运行成功后,就能查看For Each节点生成的子作业实例,由于数据集中有6行数据,所以这里就对应产生了6个子作业实例。 图8 查看作业实例 查看对应的6个DLI目的表中是否已被插入预期的数据。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令导入数据,也可以在数据湖探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: /* 查看表a数据,其他表数据请修改命令后运行 */ SELECT * FROM a; 将查询到的表数据与给源数据表插入数据步骤中的数据进行对比,可以发现数据插入符合预期。 图9 目的表数据
-
For Each节点与EL表达式 要想使用好For Each节点,您必须对EL表达式有所了解。EL表达式用法请参考EL表达式。 下面为您展示For Each节点常用的一些EL表达式。 #{Loop.dataArray} :For循环节点输入的数据集,是一个二维数组。 #{Loop.current}:由于For循环节点在处理数据集的时候,是一行一行进行处理的,那Loop.current就表示当前处理到的某行数据,Loop.current是一个一维数组,一般定义格式为#{Loop.current[0]}、#{Loop.current[1]}或其他,0表示遍历到当前行的第一个值。 #{Loop.offset}:For循环节点在处理数据集时当前的偏移量,从0开始。 #{Job.getNodeOutput('preNodeName')}:获取前面节点的输出。
-
适用场景 当您进行作业开发时,如果某些任务的参数有差异、但处理逻辑全部一致,在这种情况下您可以通过For Each节点避免重复开发作业。 For Each节点可指定一个子作业循环执行,并通过数据集对子作业中的参数进行循环替换。关键参数如下: 子作业:选择需要循环执行的作业。 数据集:即不同子任务的参数值的集合。可以是给定的数据集,如“[['1'],['3'],['2']]”;也可以是EL表达式如“#{Job.getNodeOutput('preNodeName')}”,即前一个节点的输出值。 子作业参数:参数名即子作业中定义的变量;参数值一般配置为数据集中的某组数据,每次运行中会将参数值传递到子作业以供使用。例如参数值填写为:#{Loop.current[0]},即将数据集中每行数据的第一个数值遍历传递给子作业。 For Each节点举例如图1所示 。从图中可以看出,子作业“foreach”中的参数名为“result”,参数值为一维数组数据集“[['1'],['3'],['2']] ”的遍历(即第一次循环为1,第二次循环为3,第三次循环为2)。 图1 for each节点
-
时序表转HStore表最佳实践 由于新的列存HStore表在入库性能,压缩比和查询性能都优于时序表(TimeSeries表),所以推荐使用HStore表替代TimeSeries表。 TimeSeries表一般包含三种列:TSTime列,TSTag列和TSField列。 TSTime时序列,有且仅有一个,且按它进行自动分区。 TSTag表示维度列。 TSField表示事实列,维度与事实信息混存。 例如:创建时序表CPU 1 2 3 4 5 6 7 8 CREATE TABLE CPU( scope_name text TSTag, server_ip text TSTag, group_path text TSTag, time timestamptz TSTime, idle numeric TSField, users numeric TSField) with (TTL='30 days', PERIOD = '1 hour', orientation=TIMESERIES); 将时序表改造为HStore表,除了直接创建HStore表,还需要做二级分区,bitmap索引的设置,才能发挥HStore表的最佳能力。 推荐将TSTime列作为分区键 推荐将第一个TSTag列作为二级分区列 推荐将所有TSTag列做为bitmap索引列 改造后的建表语句如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 CREATE TABLE CPU( scope_name text, server_ip text, group_path text, time timestamptz, idle numeric, users numeric) WITH(TTL='30 days', PERIOD = '1 hour', ORIENTATION=column, ENABLE_HSTORE_OPT=true, --使用列存hstore_opt类型 SECONDARY_PART_COLUMN='scope_name', --将第一个TSTag列作为二级分区列 BITMAP_COLUMNS='scope_name,server_ip,group_path' --将所有TSTag列做为bitmap索引列 ) PARTITION BY RANGE(time) --time为TIMESERIES中的TSTime列 ( PARTITION p1 VALUES LESS THAN('2023-02-13 12:00:00'), PARTITION p2 VALUES LESS THAN('2023-02-13 13:00:00') ... ); --根据查询性能,在其它TSTag列上,自行选择创建一个或多个btree索引 父主题: 数据开发
-
背景信息 随着业务数量增多,业务的数据开发需求也逐渐增多, 数据开发人员不能快速支撑业务的开发需求,了解业务的人员设计和开发业务的数据资产可以使数据发挥最大价值,因此需要业务人员来主导业务的 数据治理 开发工作。 数据治理的核心就是管理好业务的数据资产,随着业务特性和业务复杂度快速增长,面临的不再是无数据的时代,面临的问题是如何在数据世界中获取到准确且有价值的信息,例如同一个指标在不同的应用场景,哪个才是准确的?这么多数据我的业务监控是否都覆盖了?以及是否有无价值和未合理使用的数据等,因此如何有效管理数据资产成了当前重点关注的问题。
-
解决方案 本章节介绍如何通过AppStage运维中心完成对业务实时数据的接入、处理、开发与应用。 图1 数据开发与应用流程 数据接入 AppStage运维中心支持接入虚拟机日志和容器日志,您可以根据日志类型选择日志接入方式。 虚拟机日志接入:通过日志配置下发任务部署filebeat,并根据日志采集配置设置,通过filebeat采集虚拟机上的业务日志。 容器日志接入:安装daemonset插件,通过daemonset实现容器日志接入。 (可选)如果需要将原始日志转化为JSON格式,可以在日志接入时选择算子清洗方式对日志数据做清洗,数据清洗如数据清洗说明所示。 数据导流 接入的日志数据存在于对应的Topic中,需要创建导流任务,将数据存储在对应的数据库中才能进行日志检索、日志数据的管理和后续开发。 (可选)数据汇聚:当日志量较大且不需要关注原始日志时可以对实时日志进行日志汇聚。 数据开发 可以使用存入数据库中的数据进行报表开发、实时监控或者异常告警等应用,可以直接写SQL,但是不同数据源写SQL的方式有差异,且有一定难度,AppStage支持使用运维数仓的方式,会自动根据不同数据源生成对应的SQL。 创建逻辑主体:使用运维数仓时首先需要创建逻辑主体。 创建指标:逻辑主体创建成功后,需要创建数据指标。 (可选)创建视图:为需要计算的指标创建查询视图,也可以在查询视图的基础上创建持久化视图或长期存储视图。 数据应用 使用报表对业务进行实时监控:使用运维数仓中的指标或视图创建业务报表,实时监控业务数据。 通过日志检索进行问题定位:日志接入并创建导流任务后,可以对已接入的日志进行检索,定位业务异常问题。 数据异常告警:支持通过异常检测上报告警和配置虚拟机异常告警,根据业务需要进行配置。
-
数据清洗说明 在做日志接入创建日志空间时可以配置算子清洗策略完成日志数据清洗,如图2所示,算子清洗功能及使用样例请参见算子清洗功能介绍。 图2 算子清洗 清洗规则:选择“算子清洗”。 日志样例:使用典型日志,用来做清洗验证。 解析脚本:配置解析脚本,将日志样例清洗为字段显示。解析脚本中不支持使用中划线,支持使用下划线。 清洗字段:配置解析脚本后单击“配置解析脚本”,自动生成清洗自动,查看字段是否符合预期。
-
运行作业后查看日志时系统提示“OBS日志文件不存在,请检查文件是否被删除或者没有OBS写入权限”的处理方法 使用管理员用户登录IAM控制台。 在统一身份认证服务的左侧导航窗格中,选择“用户”,单击用户名进入用户信息界面。 单击“访问方式”后面的,修改访问方式。 勾选“编程访问”和“管理控制台访问”。 图4 配置访问方式 单击“确定”。 在管理控制台创建工作空间时,作业日志OBS路径只支持OBS对象桶,不支持并行文件系统。如果不配置作业日志OBS路径,DataArts Studio数据开发默认会把日志写到dlf-log-{projectId}桶中,DataArts Studio数据服务默认会把日志写到dlm-log-{projectId}桶中。 如果“作业日志OBS路径”没有选择已有的OBS桶,首次运行作业时,默认的DLF桶创建不出来,无法写入日志。为了确保作业日志正常写入OBS桶中,当创建工作空间时,请选择已有的OBS路径。