云服务器内容精选

  • 使用案例 案例场景 因数据规整要求,需要周期性地将多组 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节点避免重复开发作业。 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节点
  • 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')}:获取前面节点的输出。
  • 文件格式问题解决方法 数据库的数据导出到CSV文件,由于数据中含有分隔符逗号,造成导出的CSV文件中数据混乱。 CDM 提供了以下几种解决方法: 指定字段分隔符 使用数据库中不存在的字符,或者是极少见的不可打印字符来作为字段分隔符。例如可以在目的端指定“字段分隔符”为“%01”,这样导出的字段分隔符就是“\u0001”,详情可见表1。 使用包围符 在目的端作业参数中开启“使用包围符”,这样数据库中如果字段包含了字段分隔符,在导出到CSV文件的时候,CDM会使用包围符将该字段括起来,使之作为一个字段的值写入CSV文件。 数据库的数据包含换行符 场景:使用CDM先将MySQL中的某张表(表的某个字段值中包含了换行符\n)导出到CSV格式的文件中,然后再使用CDM将导出的CSV文件导入到MRS HBase,发现导出的CSV文件中出现了数据被截断的情况。 解决方法:指定换行符。 在使用CDM将MySQL的表数据导出到CSV文件时,指定目的端的换行符为“%01”(确保这个值不会出现在字段值中),这样导出的CSV文件中换行符就是“%01”。然后再使用CDM将CSV文件导入到MRS HBase时,指定源端的换行符为“%01”,这样就避免了数据被截断的问题。
  • 二进制格式 如果想要在文件系统间按原样复制文件,则可以选择二进制格式。二进制格式传输文件到文件的速率高、性能稳定,且不需要在作业第二步进行字段匹配。 文件传输的目录结构 CDM的文件传输,支持单文件,也支持一次传输目录下所有的文件。传输到目的端后,目录结构会保持原样。 增量迁移文件 使用CDM进行二进制传输文件时,目的端有一个参数“重复文件处理方式”,可以用作文件的增量迁移,具体请参见文件增量迁移。 增量迁移文件的时候,选择“重复文件处理方式”为“跳过重复文件”,这样如果源端有新增的文件,或者是迁移过程中出现了失败,只需要再次运行任务,已经迁移过的文件就不会再次迁移。 写入到临时文件 二进制迁移文件时候,可以在目的端指定是否写入到临时文件。如果指定了该参数,在文件复制过程中,会将文件先写入到一个临时文件中,迁移成功后,再进行rename或move操作,在目的端恢复文件。 生成文件MD5值 对每个传输的文件都生成一个MD5值,并将该值记录在一个新文件中,新文件以“.md5”作为后缀,并且可以指定MD5值生成的目录。
  • 文件格式的公共参数 启动作业标识文件 这个主要用于自动化场景中,CDM配置了定时任务,周期去读取源端文件,但此时源端的文件正在生成中,CDM此时读取会造成重复写入或者是读取失败。所以,可以在源端作业参数中指定启动作业标识文件为“ok.txt”,在源端生成文件成功后,再在文件目录下生成“ok.txt”,这样CDM就能读取到完整的文件。 另外,可以设置超时时间,在超时时间内,CDM会周期去查询标识文件是否存在,超时后标识文件还不存在的话,则作业任务失败。 启动作业标识文件本身不会被迁移。 作业成功标识文件 文件系统为目的端的时候,当任务成功时,在目的端的目录下,生成一个空的文件,标识文件名由用户来指定。一般和“启动作业标识文件”搭配使用。 这里需要注意的是,不要和传输的文件混淆,例如传输文件为“finish.txt”,但如果作业成功标识文件也设置为“finish.txt”,这样会造成这两个文件相互覆盖。 过滤器 使用CDM迁移文件的时候,可以使用过滤器来过滤文件。支持通过通配符或时间过滤器来过滤文件。 选择通配符时,CDM只迁移满足过滤条件的目录或文件。 选择时间过滤器时,只有文件的修改时间晚于输入的时间才会被传输。 例如用户的“/table/”目录下存储了很多数据表的目录,并且按天进行了划分DRIVING_BEHAVIOR_20180101~DRIVING_BEHAVIOR_20180630,保存了DRIVING_BEHAVIOR从1月到6月的所有数据。如果只想迁移DRIVING_BEHAVIOR的3月份的表数据,那么需要在作业第一步指定源目录为“/table”,过滤类型选择“通配符”,然后指定“路径过滤器”为“DRIVING_BEHAVIOR_201803*”。
  • JSON格式 这里主要介绍JSON文件格式的以下内容: CDM支持解析的JSON类型 记录节点 从JSON文件复制数据 CDM支持解析的JSON类型:JSON对象、JSON数组。 JSON对象:JSON文件包含单个对象,或者以行分隔/串连的多个对象。 单一对象JSON { "took" : 190, "timed_out" : false, "total" : 1000001, "max_score" : 1.0 } 行分隔的JSON对象 {"took" : 188, "timed_out" : false, "total" : 1000003, "max_score" : 1.0 } {"took" : 189, "timed_out" : false, "total" : 1000004, "max_score" : 1.0 } 串连的JSON对象 { "took": 190, "timed_out": false, "total": 1000001, "max_score": 1.0 } { "took": 191, "timed_out": false, "total": 1000002, "max_score": 1.0 } JSON数组:JSON文件是包含多个JSON对象的数组。 [{ "took" : 190, "timed_out" : false, "total" : 1000001, "max_score" : 1.0 }, { "took" : 191, "timed_out" : false, "total" : 1000001, "max_score" : 1.0 }] 记录节点 记录数据的根节点。该节点对应的数据为JSON数组,CDM会以同一模式从该数组中提取数据。多层嵌套的JSON节点以字符“.”分割。 从JSON文件复制数据 示例一 从行分隔/串连的多个对象中提取数据。JSON文件包含了多个JSON对象,例如: { "took": 190, "timed_out": false, "total": 1000001, "max_score": 1.0 } { "took": 191, "timed_out": false, "total": 1000002, "max_score": 1.0 } { "took": 192, "timed_out": false, "total": 1000003, "max_score": 1.0 } 如果您想要从该JSON对象中提取数据,使用以下格式写入到数据库,只需要在作业第一步指定文件格式为“JSON格式”,指定JSON类型为“JSON对象”,然后在作业第二步进行字段匹配即可。 表2 示例 took timedOut total maxScore 190 false 1000001 1.0 191 false 1000002 1.0 192 false 1000003 1.0 示例二 从记录节点中提取数据。JSON文件包含了单个的JSON对象,但是其中有效的数据在一个数据节点下,例如: { "took": 190, "timed_out": false, "hits": { "total": 1000001, "max_score": 1.0, "hits": [{ "_id": "650612", "_source": { "name": "tom", "books": ["book1","book2","book3"] } }, { "_id": "650616", "_source": { "name": "tom", "books": ["book1","book2","book3"] } }, { "_id": "650618", "_source": { "name": "tom", "books": ["book1","book2","book3"] } }] } } 如果想以如下格式写入到数据库,则需要在作业第一步指定文件格式为“JSON格式”,指定JSON类型为“JSON对象”,并且指定记录节点为“hits.hits”,然后在作业第二步进行字段匹配。 表3 示例 ID SourceName SourceBooks 650612 tom ["book1","book2","book3"] 650616 tom ["book1","book2","book3"] 650618 tom ["book1","book2","book3"] 示例三 从JSON数组中提取数据。JSON文件是包含了多个JSON对象的JSON数组,例如: [{ "took" : 190, "timed_out" : false, "total" : 1000001, "max_score" : 1.0 }, { "took" : 191, "timed_out" : false, "total" : 1000002, "max_score" : 1.0 }] 如果想以如下格式写入到数据库,需要在作业第一步指定文件格式为“JSON格式”,指定JSON类型为“JSON数组”,然后在作业第二步进行字段匹配。 表4 示例 took timedOut total maxScore 190 false 1000001 1.0 191 false 1000002 1.0 示例四 在解析JSON文件的时候搭配转换器。在示例二前提下,想要把hits.max_score字段附加到所有记录中,即以如下格式写入到数据库中: 表5 示例 ID SourceName SourceBooks MaxScore 650612 tom ["book1","book2","book3"] 1.0 650616 tom ["book1","book2","book3"] 1.0 650618 tom ["book1","book2","book3"] 1.0 则需要在作业第一步指定文件格式为“JSON格式”,指定JSON类型为“JSON对象”,并且指定记录节点为“hits.hits”,然后在作业第二步添加转换器,操作步骤如下: 单击添加字段,新增一个字段。 图2 添加字段 在添加的新字段后面,单击添加字段转换器。 图3 添加字段转换器 创建“表达式转换”的转换器,表达式输入“1.0”,然后保存。 图4 配置字段转换器
  • 配置Hive目的端参数 作业中目的连接为Hive连接时,目的端作业参数如表1所示。 表1 Hive作为目的端时的作业参数 参数名 说明 取值样例 数据库名称 输入或选择写入数据的数据库名称。单击输入框后面的按钮可进入数据库选择界面。 default 表名 输入或选择写入数据的目标表名。单击输入框后面的按钮可进入表的选择界面。 该参数支持配置为时间宏变量,且一个路径名中可以有多个宏定义变量。使用时间宏变量和定时任务配合,可以实现定期同步新增数据,详细说明请参见使用时间宏变量完成增量同步。 说明: 如果配置了时间宏变量,通过DataArts Studio数据开发调度CDM迁移作业时,系统会将时间宏变量替换为“数据开发作业计划启动时间-偏移量”,而不是“CDM作业实际启动时间-偏移量”。 TBL_X 自动创表 只有当源端为关系数据库时,才有该参数。表示写入表数据时,用户选择的操作: 不自动创建:不自动建表。 不存在时创建:当目的端的数据库没有“表名”参数中指定的表时,CDM会自动创建该表。如果“表名”参数配置的表已存在,则不创建,数据写入到已存在的表中。 先删除后创建:CDM先删除“表名”参数中指定的表,然后再重新创建该表。 说明: 自动建表只同步列注释,表注释不会被同步。 自动建表不支持同步主键。 不自动创建 源端null值转换值 将源端null值转换为其他值。 TO_NULL TO_EMPTY_STRRING TO_NULL_STRING TO_NULL 导入前清空数据 选择目的端表中数据的处理方式。 是:任务启动前会清除目标表中数据。 否:导入前不清空目标表中的数据,如果选“否”且表中有数据,则数据会追加到已有的表中。 是 换行符处理方式 对于写入Hive textfile格式表的数据中存在换行符的场景,指定对换行符的处理策略。 删除 替换为其他字符串 不处理 删除 Hive表分区字段 “自动创建”设置为“不自动创建”时,无该此参数。 对Hive建表设置分区字段,多个值以逗号隔开。 A,B 表路径 “自动创建”设置为“不自动创建”时,无该此参数。 表路径。 - 存储格式 “自动创建”设置为“不自动创建”时,无该此参数。 选择存储格式。 行式存储格式:TEXTFILE。 列式存储格式:ORC、RCFILE、PARQUET。 TEXTFILE使用明文存储,当数据存在特殊字符的场景下可能会导致数据写入错乱,请谨慎使用。建议优先使用ORC存储格式。 ORC hive表清理数据模式 “导入前清空数据”设置为“是”时,呈现此参数。 选择Hive表清理数据模式。 LOAD_OVERWRITE模式:将生成一个临时数据文件目录,使用Hive的load overwrite语法将临时目录加载到Hive表中。 TRUCATE模式:只清理分区下的数据文件,不删除分区。 说明: 目的端为分区表时,Hive表清理数据模式建议设置为LOAD_OVERWRITE模式,否则可能会有集群内存过载/磁盘过载的风险。 TRUCATE 分区信息 “导入前清空数据”设置为“是”时,呈现此参数。目的端为分区表时,必须指定分区。 当使用TRUCATE模式:只清理分区下的数据文件。 当使用LOAD_OVERWRITE模式:覆盖写入到指定分区,仅支持指定单分区。 单分区:year=2020,location=sun; 多分区:['year=2020,location=sun', 'year=2021,location=earth']. 删除前一日分区: day='${dateformat(yyyy-MM-dd HH:mm:ss, -1, DAY)}', 执行Analyze语句 数据全部写入完成后会异步执行ANALYZE TABLE语句,用于优化Hive表查询速度。 执行的SQL如下: 非分区表:ANALYZE TABLE tablename COMPUTE STATIS TICS 分区表:ANALYZE TABLE tablename PARTITION(partcol1[=val1], partcol2[=val2], ...) COMPUTE STATISTICS 说明: “执行Analyze语句”参数配置仅用于单表迁移场景。 执行Analyze语句可能会对Hive造成压力。 是 内部写队列内存最大值 当出现内存不足场景时,请酌情修改该参数,当参数过小时,会影响迁移速率。 取值范围是1-128,默认为空,不做限制,单位为MB,超出范围会设置为不限制。 16 内部转换队列内存最大值 当出现内存不足场景时,请酌情修改该参数,当参数过小时,会影响迁移速率。 取值范围是1-128,默认为空,不做限制,单位为MB,超出范围会设置为不限制。 16 源端Hive包含array和map类型时,目的端表格式只支持ORC和parquet复杂类型。若目的端表格式为RC和TEXT时,会对源数据进行处理,支持成功写入。 因map类型为无序的数据结构,迁移到目的端的数据类型可能跟源端顺序不一致。 Hive作为迁移的目的时,如果存储格式为Textfile,在Hive创建表的语句中需要显式指定分隔符。例如: CREATE TABLE csv_tbl( smallint_value smallint, tinyint_value tinyint, int_value int, bigint_value bigint, float_value float, double_value double, decimal_value decimal(9, 7), timestmamp_value timestamp, date_value date, varchar_value varchar(100), string_value string, char_value char(20), boolean_value boolean, binary_value binary, varchar_null varchar(100), string_null string, char_null char(20), int_null int ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = "\t", "quoteChar" = "'", "escapeChar" = "\\" ) STORED AS TEXTFILE; 父主题: 配置CDM作业目的端参数
  • 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节点
  • 使用案例 案例场景 因数据规整要求,需要周期性地将多组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的CSV文件中,然后通过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 目的表数据
  • 背景说明 购买DataArts Studio实例的用户,系统将默认为其创建一个默认的工作空间“default”,并赋予该用户为管理员角色。 在主账号创建的DataArts Studio实例中,该账号下的 IAM 用户如需创建工作空间,需要由主账号给IAM用户赋予DAYU Administrator或Tenant Administrator权限。在子用户创建的DataArts Studio实例中,主账号默认具有该DataArts Studio实例的所有执行权限。 具备DAYU User账号权限的用户,只有当其被添加为工作空间的成员后,才可以访问该工作空间。
  • 约束与限制 静态脱敏时,请根据待脱敏数据的字段类型正确选择脱敏算法,否则可能会导致数据库数据异常。例如对date字段使用数值随机算法脱敏,会导致data类型将被强制脱敏为数值类型(Hive和DLI脱敏),或者写入失败报错(DWS脱敏);对数值字段使用哈希算法脱敏,会导致数值类型被强制脱敏为哈希值字符串(Hive和DLI脱敏),或者写入失败报错(DWS脱敏)。 运行需要解析样本文件的静态脱敏任务时,样本文件大小建议不超过10MB,否则静态脱敏任务可能会失败。另外,OBS样本文件只能用于DLI引擎的静态脱敏任务,HDFS样本文件只能用于MRS引擎的静态脱敏任务。静态脱敏场景与引擎之间的对应关系请参考参考:静态脱敏场景介绍。 运行使用自定义哈希类型脱敏算法的静态脱敏任务时,如果使用了dws-SM3密码杂凑算法,则必须选择DWS引擎运行,要求DWS集群版本不低于8.1.3;如果使用了通用-SM3密码杂凑算法,则必须选择DLI或MRS引擎运行。 DLI引擎的静态脱敏任务,运行参数需要存储在OBS桶中,任务运行完成或失败后会删除任务运行参数文件。 DLI引擎的同源静态脱敏任务,运行参数存储在工作空间日志桶中,默认以dlf-log-{Project id}命名。 DLI引擎的跨源静态脱敏任务,运行参数存储在自动创建的加密用户桶dls-dli-{projectId}中。 因此DLI引擎静态脱敏前,还需要为dlg_agency委托授予如下OBS权限策略,授权方法可参考授权dlg_agency委托章节。 obs:bucket:HeadBucket obs:bucket:CreateBucket obs:object:PutObject obs:object:DeleteObject obs:bucket:ListBucket obs:object:GetObject obs:bucket:GetEncryptionConfiguration obs:bucket:PutEncryptionConfiguration DLI引擎的静态脱敏任务,当源端或目的端为DWS时,请参考配置DLI队列与内网数据源的网络联通或配置DLI队列与公网网络联通打通DLI Spark通用队列与DWS的网络连接,否则会导致静态脱敏任务失败。 源端或目的端为DLI的静态脱敏任务,不支持对DLI中default数据库的数据表进行脱敏。 MapReduce服务 (MRS Hive)所在的MRS集群必须开启Kerberos认证,且必须安装Spark组件。 MRS引擎的静态脱敏任务,当源端或目的端为DWS时,请参考参考:授权并绑定委托为MRS集群配置委托,并确保MRS集群安全组出方向规则满足如下要求,否则会导致静态脱敏任务失败。 协议:TCP 端口范围:80 远端地址:169.254.0.0/16 MRS引擎的静态脱敏任务,当源端或目的端仅一端为DWS时,支持的数据类型如下。如果有其他不支持的数据类型,将导致静态脱敏任务失败。 tinyint smallint int bigint decimal double float boolean string timestamp DWS引擎的同源静态脱敏任务,不支持跨数据库脱敏,即DWS源端和目的端数据表所在的数据库必须相同。 静态脱敏任务的数据集范围选择为增量时,需选择时间字段类型Timestamp、Date字段类型来确定增量范围。
  • 参考:静态脱敏场景介绍 隐私保护管理目前支持的静态脱敏场景如表3所示。 表3 静态脱敏场景 源端数据源类型 目的端数据源类型 计算引擎 说明 数据湖探索(DLI) 数据湖探索(DLI) 使用DLI Spark通用队列 - 数据仓库 服务(DWS) 使用DLI Spark通用队列 DLI引擎的静态脱敏任务,当源端或目的端为DWS时,请参考配置DLI队列与内网数据源的网络联通或配置DLI队列与公网网络联通打通DLI Spark通用队列与DWS的网络连接,否则会导致静态脱敏任务失败。 数据仓库服务(DWS) 数据仓库服务(DWS) 使用DWS集群 使用MRS集群 使用DLI Spark通用队列 DWS引擎: DWS引擎的同源静态脱敏任务,不支持跨数据库脱敏,即DWS源端和目的端数据表所在的数据库必须相同。 MRS引擎: MapReduce服务(MRS Hive)所在的MRS集群必须开启Kerberos认证,且必须安装Spark组件。 MRS引擎的静态脱敏任务,当源端或目的端为DWS时,请参考参考:授权并绑定委托为MRS集群配置委托,并确保MRS集群安全组出方向规则满足如下要求,否则会导致静态脱敏任务失败。 协议:TCP 端口范围:80 远端地址:169.254.0.0/16 DLI引擎: DLI引擎的静态脱敏任务,当源端或目的端为DWS时,请参考配置DLI队列与内网数据源的网络联通或配置DLI队列与公网网络联通打通DLI Spark通用队列与DWS的网络连接,否则会导致静态脱敏任务失败。 MapReduce服务(MRS Hive) 使用MRS Hive所在的MRS集群 MapReduce服务(MRS Hive)所在的MRS集群必须开启Kerberos认证,且必须安装Spark组件。 MRS引擎的静态脱敏任务,当源端或目的端为DWS时,请参考参考:授权并绑定委托为MRS集群配置委托,并确保MRS集群安全组出方向规则满足如下要求,否则会导致静态脱敏任务失败。 协议:TCP 端口范围:80 远端地址:169.254.0.0/16 MRS引擎的静态脱敏任务,当源端或目的端仅一端为DWS时,支持的数据类型如下。如果有其他不支持的数据类型,将导致静态脱敏任务失败。 tinyint smallint int bigint decimal double float boolean string timestamp 数据湖探索(DLI) 使用DLI Spark通用队列 DLI引擎的静态脱敏任务,当源端或目的端为DWS时,请参考配置DLI队列与内网数据源的网络联通或配置DLI队列与公网网络联通打通DLI Spark通用队列与DWS的网络连接,否则会导致静态脱敏任务失败。 MapReduce服务(MRS Hive) MapReduce服务(MRS Hive) 使用源端MRS Hive所在的MRS集群 MapReduce服务(MRS Hive)所在的MRS集群必须开启Kerberos认证,且必须安装Spark组件。 数据仓库服务(DWS) 使用MRS Hive所在的MRS集群 MapReduce服务(MRS Hive)所在的MRS集群必须开启Kerberos认证,且必须安装Spark组件。 MRS引擎的静态脱敏任务,当源端或目的端为DWS时,请参考参考:授权并绑定委托为MRS集群配置委托,并确保MRS集群安全组出方向规则满足如下要求,否则会导致静态脱敏任务失败。 协议:TCP 端口范围:80 远端地址:169.254.0.0/16 MRS引擎的静态脱敏任务,当源端或目的端仅一端为DWS时,支持的数据类型如下。如果有其他不支持的数据类型,将导致静态脱敏任务失败。 tinyint smallint int bigint decimal double float boolean string timestamp
  • 前提条件 静态脱敏任务需要根据脱敏策略来进行脱敏,相关前提条件如下: 已配置内置脱敏算法或者已自定义脱敏算法,请参考管理脱敏算法进行配置和定义。 已完成脱敏策略的创建,请参考新建脱敏策略。 待脱敏的数据表已完成敏感数据发现任务,请参考创建敏感数据发现任务。 已通过“敏感数据分布”,修正敏感数据字段的数据状态为“有效”,请参考查看敏感数据分布。 DLI引擎静态脱敏任务,需要为dlg_agency委托授予如下OBS权限策略,授权方法可参考授权dlg_agency委托章节。 obs:bucket:HeadBucket obs:bucket:CreateBucket obs:object:PutObject obs:object:DeleteObject obs:bucket:ListBucket obs:object:GetObject obs:bucket:GetEncryptionConfiguration obs:bucket:PutEncryptionConfiguration