华为云用户手册

  • 约束限制 仅Spark 3.3.x及以上版本引擎、HetuEngine引擎的队列支持查看SQL执行计划。 SQL执行计划需在SQL作业执行完毕才可以查看。 仅状态为“已成功”的SQL作业支持查看SQL执行计划。 请确保已授权OBS桶的操作权限给 DLI 服务,用于保存用户作业的SQL执行计划。 SQL执行计划保存在DLI作业桶中付费存储,系统不会主动删除,建议您配置桶生命周期,通过配置指定规则来实现定时删除或迁移桶中不再使用的SQL执行计划。了解配置DLI作业桶。
  • DLI计算资源模式 DLI提供了三种计算资源的管理模式,每一种模式都有独特的优势和适用场景。 图2 DLI计算资源模式 弹性资源池模式:计算资源的池化管理模式,提供计算资源的动态扩缩容能力,同一弹性资源池中的队列共享计算资源。通过合理设置队列的计算资源分配策略,可以提高计算资源利用率,应对业务高峰期的资源需求。 适用场景:适合业务量有明显波动的场合,如周期性的数据批处理任务或实时数据处理需求。 支持的队列类型:SQL队列(Spark)、SQL队列(HetuEngine)、通用队列。了解DLI的队列类型请参考DLI队列类型。 弹性资源池模式的通用队列和SQL队列不支持跨可用区。 使用方法:先创建弹性资源池,然后在弹性资源池中创建队列并分配计算资源,队列关联到具体的作业和数据处理任务。 购买弹性资源池并在弹性资源池中添加队列的具体操作步骤请参考创建弹性资源池并添加队列。 全局共享模式: 全局共享模式是一种根据SQL查询中实际扫描的数据量来分配计算资源的模式,不支持指定或预留计算资源。 DLI服务预置的“default”队列即为全局共享模式的计算资源,资源的大小是按需分配的。在不确定数据量大小或偶尔需要进行数据处理的用户,可以使用default队列执行作业。 适用场景:适用于测试作业或资源消耗不高的情况。 支持的队列类型:仅DLI预置的default队列为全局共享模式的计算资源。 “default”队列只用于用户体验DLI,是所有人共享的公共资源,使用时可能会出现用户间抢占资源的情况,不能保证每次都可以得到资源执行相关操作。建议使用自建队列执行生产作业。 使用方法:default队列仅适用于提交SQL作业,在DLI管理控制台提交SQL作业时选择"default队列"即可。 非弹性资源池模式(废弃,不推荐使用): DLI的上一代计算资源管理方式,因缺乏灵活性,目前已不推荐使用。 非弹性资源池模式提供固定规格的计算资源,购买后独占资源,无法根据需求动态调整,可能会导致资源浪费或在需求高峰期资源不足。 表1 DLI计算资源模式与支持的队列类型 DLI计算资源模式 支持的队列类型 资源特点 适用场景 弹性资源池模式 SQL队列(Spark) SQL队列(HetuEngine) 通用队列 单用户多队列共享资源 资源动态分配,灵活调整 适合业务需求波动较大,需要灵活调整资源以应对波峰波谷的业务场景。 全局共享模式 default队列 多用户多队列共享资源 按量付费,不支持预留资源 适合不确定数据量大小或仅需要偶尔进行数据处理的临时或测试项目场景。 非弹性资源池模式 (废弃,不推荐使用) SQL队列 通用队列 单用户单队列独享资源 无法动态调整,资源可能会闲置 废弃,不推荐使用
  • DLI队列类型 DLI分为三种队列类型: default队列、SQL队列、通用队列,您可以根据业务场景和作业特性选择最合适的队列类型。 default队列: DLI服务预置的队列,所有用户共享。 不支持指定default队列资源大小,资源在执行作业时按需分配,并按实际扫描的数据量计费。 由于default队列是共享资源,在使用时可能会出现资源抢占的情况,不能保证每次都能获得资源来执行作业。 default队列适用小规模或临时的数据处理需求。对于重要的或需要保证资源的作业,建议购买弹性资源池并在弹性资源池中创建队列来执行作业。 SQL队列: SQL队列是用于执行SQL作业的队列,支持指定引擎类型包括Spark和HetuEngine。 SQL队列适用于需要快速数据查询和分析,以及需要定期清理缓存或重置环境的业务。 通用队列: 通用队列用于执行Spark作业、Flink OpenSource SQL作业和Flink Jar作业的队列。 适合适用于复杂数据处理、实时数据流处理或批量数据处理的场景。
  • 什么是弹性资源池和队列? 在了解DLI计算资源模式前首先了解弹性资源池和队列的基本概念。 弹性资源池是DLI计算资源的一种池化管理模式,可以看做DLI计算资源的集合。DLI支持在弹性资源池中创建多个队列,且这些队列可以共享弹性资源池中的资源。 图1 弹性资源池架构图 弹性资源池的优势主要体现在以下几个方面: 统一资源管理 统一管理内部多集群和调度作业,规模可以到百万核级别。 多AZ部署,支持跨AZ高可用。 租户资源隔离 不同队列之间资源隔离,减少队列之间的相互影响。 分时按需弹性 分钟级别扩缩容,从容应对流量洪峰和资源诉求。 支持分时设置队列优先级和配额,提高资源利用率。 作业级资源隔离(暂未实现,后续版本支持) 支持独立Spark实例运行SQL作业,减少作业间相互影响。 自动弹性(暂未实现,后续版本支持) 基于队列负载和优先级实时自动更新队列配额。 弹性资源池解决方案主要解决了以下问题和挑战。 维度 原有队列,无弹性资源池时 弹性资源池 扩容时长 手工扩容时间长,扩容时长在分钟级别 不需要手工干预,秒级动态扩容。 资源利用率 不同队列之间资源不能共享。 例如:队列1当前还剩余10CU资源,队列2当前负载高需要扩容时,队列2不能使用队列1中的资源,只能单独对队列1进行扩容。 添加到同一个弹性资源池的多个队列,CU资源可以共享,达到资源的合理利用。 配置跨源时,必须为每个队列分配不重合的网段,占用大量VPC网段。 多队列通过弹性资源池统一进行网段划分,减少跨源配置的复杂度。 资源调配 多个队列同时扩容时不能设置优先级,在资源不够时,会导致部分队列扩容申请失败。 您可以根据当前业务波峰和波谷时间段,设置各队列在弹性资源池中的优先级,保证资源的合理调配。 队列是DLI中被实际使用和分配的基本单元,即队列是执行作业所需的具体的计算资源。您可以为不同的作业或数据处理任务创建不同的队列,并按需对这些队列分配和调整资源。了解DLI的队列类型请参考DLI队列类型。
  • 弹性资源池使用场景 推荐使用弹性资源池队列,提高资源使用的灵活性和资源利用效率。本节介绍常见的弹性资源池的使用场景。 场景一:固定资源造成资源浪费和资源不足的场景 在每天的不同时段,作业任务对资源的请求量也会发生变化,如果采用固定资源规格则会导致资源浪费或者资源不足的问题。例如,如下图图3示例可以看出: 大约在凌晨4点到7点这个数据段,ETL作业任务结束后没有其他作业,因为资源固定一直占用,导致严重的资源浪费。 上午9点到12点以及下午14点16点的两个时段,ETL报表和作业查询的请求量很高,因为当前固定资源不够,导致作业任务排队,任务一直排队。 图3 固定资源场景 场景二:资源相互隔离,没有共享,造成资源浪费的场景 某公司下有两个部门,两个部门的不同作业运行在DLI的两个队列上。部门A在上午8点到12点业务比较空闲,资源有剩余,部门B在这个时间段业务请求量大,原有资源规格满足不了,需要扩容时,请求不了部门A的队列资源,造成资源浪费。 图4 资源隔离造成的资源浪费 弹性资源池通过“分时按需弹性”功能,支持按照不同时间段对资源进行动态的扩缩容,保证资源的利用率和应对资源洪峰等诉求。 弹性资源池对后端资源统一进行管理和调度,多个队列绑定弹性资源池后,资源池内资源共享,资源利用率高,解决了场景二的问题。
  • 弹性资源池扩缩容 当弹性资源池中添加队列、删除队列时,会触发弹性资源扩缩容。 而弹性资源池缩容可能会触发缩容含有shuffle数据的节点,会导致Spark Task重算,引起Spark作业和SQL作业内部自动重试,当作业重试超过限制会导致作业执行失败,需用户重新执行作业。 Spark2.3版本作业需要升级作业版本后才能支持运行中动态缩容功能。 Spark Streaming作业、Flink作业在运行过程中所在节点无法缩容,需要暂停作业或迁移作业至其他弹性资源池后才能完成缩容。
  • 什么是SQL防御 大数据领域的SQL引擎层出不穷,在带给解决方案多样性的同时,也暴露出一定的问题,例如SQL输入语句质量良莠不齐、SQL问题难定位、大SQL语句消耗资源过多等。 低质量的SQL会对数据分析平台系统带来不可预料的冲击,影响系统的性能或者平台稳定性。 DLI在Spark SQL引擎中增加SQL防御能力,基于用户可理解的SQL防御策略,实现对典型大SQL、低质量SQL的主动防御,包括事前提示、拦截和事中熔断,并不强制改变用户的SQL提交方式、SQL语法,对业务零改动且易实施。 DLI支持可视化配置SQL防御策略,同时可支持防御规则的查询和修改。 每个SQL引擎在进行SQL业务响应、执行过程中,基于SQL防御策略进行主动防御行为。 管理员可将SQL防御行为在“提示”、“拦截”、“熔断”选项之间进行灵活切换,系统会将发生的SQL防御事件实时写入到防御审计日志中。运维人员可进行 日志分析 ,评估现网SQL质量,提前感知潜在SQL风险,并做出有效预防措施。 本节操作介绍创建SQL防御规则以增加SQL防御能力的配置方法。
  • SQL作业参数设置 单击SQL编辑器页面右上方的“设置”按钮。可以设置SQL作业运行参数和作业标签。 参数设置:以“key/value”的形式设置提交SQL作业的配置项。 详细内容请参见《 数据湖探索 SQL语法参考》。 标签:以“key/value”的形式设置SQL作业的标签。 表2 SQL作业运行参数配置说明 参数名称 默认值 描述 spark.sql.files.maxRecordsPerFile 0 要写入单个文件的最大记录数。如果该值为零或为负,则没有限制。 spark.sql.autoBroadcastJoinThreshold 209715200 配置执行连接时显示所有工作节点的表的最大字节大小。通过将此值设置为“-1”,可以禁用显示。 说明: 当前仅支持运行命令ANALYZE TABLE COMPUTE statistics noscan的配置单元存储表,和直接根据数据文件计算统计信息的基于文件的数据源表。 spark.sql.shuffle.partitions 200 为连接或聚合过滤数据时使用的默认分区数。 spark.sql.dynamicPartitionOverwrite.enabled false 当前配置设置为“false”时,DLI在覆盖写之前,会删除所有符合条件的分区。例如,分区表中有一个“2021-01”的分区,当使用INSERT OVERWRITE语句向表中写入“2021-02”这个分区的数据时,会把“2021-01”的分区数据也覆盖掉。 当前配置设置为“true”时,DLI不会提前删除分区,而是在运行时覆盖那些有数据写入的分区。 spark.sql.files.maxPartitionBytes 134217728 读取文件时要打包到单个分区中的最大字节数。 spark.sql.badRecordsPath - Bad Records的路径。 dli.sql.sqlasync.enabled true DDL和DCL语句是否异步执行,值为“true”时启用异步执行。 dli.sql.job.timeout - 设置作业运行超时时间,超时取消。单位:秒。
  • 使用SQL编辑器创建并提交SQL作业 登录DLI管理控制台,选择“SQL编辑器”页面。 进入“SQL编辑器”页面后,系统会提示“创建DLI临时数据桶”,用于存储使用DLI服务产生的临时数据。在“设置DLI作业桶”对话框中,单击“去设置”。在现实页面上单击DLI作业桶卡片右上角单击编辑符号。在弹出的“设置DLI作业桶”对话框,输入作业桶路径,并单击“确定”。 在SQL作业编辑窗口右上方的依次选择执行SQL作业所需的队列、数据库等信息,详细参数说明请参考表1。 表1 配置SQL作业信息 按键&下拉列 描述 执行引擎 SQL作业支持Spark和HetuEngine两种引擎: Spark引擎适用于离线分析。 HetuEngine引擎适用于交互式分析。 队列 下拉选择需要使用的队列。如果没有可用队列,此处显示“default”队列,default队列为体验使用,建议重新创建队列。具体队列创建可以参考创建弹性资源池并添加队列。 SQL作业只能在队列类型为“SQL队列”下执行。 数据目录 数据目录(Catalog)是元数据管理对象,它可以包含多个数据库。 您可以在DLI中创建并管理多个Catalog,用于不同的元数据隔离。 数据库 下拉选择需要使用的数据库。如果没有可用数据库,此处显示“default”默认数据库。数据库创建操作详见在DLI控制台创建数据目录、数据库和表。 说明: 如果SQL语句中指定了表所在的数据库,则此处选择的数据库无效。 设置 包括设置“参数设置”和“标签”。 参数设置:以“key/value”的形式设置提交SQL作业的配置项。详细内容请参见《 数据湖 探索SQL语法参考》。 标签:以“key/value”的形式设置SQL作业的标签。 创建数据库和表。 您可以参考在DLI控制台创建数据目录、数据库和表提前创建数据库和表。例如本例创建表,表名为“qw”。 在SQL作业编辑窗口输入表“qw”的SQL查询语句: 1 SELECT * FROM qw.qw LIMIT 10; 或者双击左侧表名“qw”,上述查询语句会自动在作业编辑窗口中输入。 DLI还为您提供了丰富的SQL模板,每种模板都为您提供了使用场景、代码示例和使用指导。您也可以直接使用SQL作业模板快速实现您的业务逻辑。了解模板更多信息请参考创建SQL作业模板。 单击“更多”中的“语法校验”,确认SQL语句书写是否正确。 如果语法校验失败,请参考《数据湖探索SQL语法参考》检查SQL语句准确性。 如果语法校验通过,单击“执行”,阅读并同意隐私协议,单击“确定”后执行SQL语句。 SQL语句执行成功后,在SQL作业编辑窗口下方会显示执行结果。 查看作业执行结果。 在查看结果页签,单击以图形形式呈现查询结果。再单击切换回表格形式。 当前控制台界面查询结果最多显示1000条数据,如果需要查看更多或者全量数据,则可以单击将数据导出到OBS获取。 如果执行结果中无数值列,则无法进行图形化。 图形类型包括柱状图、折线图、扇形图。 柱状图和折线图的X轴可为任意一列,Y轴仅支持数值类型的列,扇形图对应图例和指标。
  • 使用须知 提交SQL作业前请先配置DLI作业桶,该桶用于存储使用DLI服务产生的临时数据,例如作业日志。如果不创建该桶,将无法查看作业日志。 作业桶配置操作可参考配置DLI作业桶。作业桶名称为系统默认。 在OBS管理控制台页面通过配置桶的生命周期规则,可以实现定时删除OBS桶中的对象或者定时转换对象的存储类别。具体操作请参考通过配置生命周期规则。 如果您的SQL队列已开启作业结果保存至DLI作业桶,请务必在提交SQL作业前配置DLI作业桶信息,否则SQL作业可能会提交失败。怎样查看SQL队列是否已开启作业结果保存至DLI作业桶?
  • DLI自定义策略样例 示例1:允许 授权用户拥有在所有区域中所有数据库的创建表权限。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "dli:database:createTable" ], "Resource": [ "dli:*:*:database:*" ] } ] } 授权用户拥有在所在区域中数据库db中表tb中列col的查询权限。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "dli:column:select" ], "Resource": [ "dli:xxx:*:column:databases.db.tables.tb.columns.col" ] } ] } 示例2:拒绝 拒绝策略需要同时配合其他策略使用,即用户需要先被授予部分操作权限策略后,才可以在权限内设置拒绝策略,否则用户无任何权限的情况下,拒绝策略无实际作用。 用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先。 授权用户不能创建数据库,删除数据库,提交作业(default队列除外),删除表。 { "Version": "1.1", "Statement": [ { "Effect": "Deny", "Action": [ "dli:database:createDatabase", "dli:database:dropDatabase", "dli:queue:submitJob", "dli:table:dropTable" ], "Resource": [ "dli:*:*:database:*", "dli:*:*:queue:*", "dli:*:*:table:*" ] } ] } 授权用户不能在队列名为demo的队列上提交作业。 { "Version": "1.1", "Statement": [ { "Effect": "Deny", "Action": [ "dli:queue:submitJob" ], "Resource": [ "dli:*:*:queue:queues.demo" ] } ] } 示例3:标签鉴权,指定action绑定Condition,指定g:ResourceTag的key和value。 Condition g:ResourceTag使用表示带有标签key=value的资源,并且资源操作在策略action中包含的可以鉴权通过。 key不区分大小写,并且目前不支持value的模糊匹配。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "dli:database:dropDatabase", "dli:table:select", "dli:database:createTable", "dli:table:dropTable" ], "Condition": { "StringEquals": { "g:ResourceTag/key": [ "value" ] } } } ] }
  • 策略字段介绍 以授权用户拥有在所有区域中所有数据库的创建表权限为例进行说明: { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "dli:database:createTable" ], "Resource": [ "dli:*:*:database:*" ] } ] } Version 版本信息,1.1: 策略。 IAM 最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。 Effect 作用。包含两类:允许(Allow)和拒绝(Deny),既有Allow又有Deny的授权语句时,遵循Deny优先的原则。 Action 授权项,指对资源的具体操作权限,不超过100个,如图1所示。 图1 DLI授权项 格式为:服务名:资源类型:操作,例:dli:queue:submit_job。 服务名为产品名称,例如dli、evs和vpc等,服务名仅支持小写。资源类型和操作没有大小写,要求支持通配符号*,无需罗列全部授权项。 资源类型可以参考表4中的资源类型。 操作:操作以IAM服务中已经注册的action为准。 Condition 限制条件:使策略生效的特定条件,包括条件键和运算符。 条件键表示策略语句的 Condition 元素中的键值,分为全局级条件键和服务级条件键。 全局级条件键(前缀为g:)适用于所有操作。详细请参考策略语法中的条件键说明。 服务级条件键,仅适用于对应服务的操作。 运算符与条件键一起使用,构成完整的条件判断语句。具体内容请参考表1。 DLI通过IAM预置了一组条件键。下表显示了适用于DLI服务特定的条件键。 表1 DLI请求条件 DLI条件键 类型 运算符 描述 g:CurrentTime 全局级 Date and time 接收到鉴权请求的时间。 说明: 以“ISO 8601”格式表示,例如:2012-11-11T23:59:59Z。 g:MFAPresent 全局级 Boolean 用户登录时是否使用了多因素认证。 g:UserId 全局级 String 当前登录的用户ID。 g:UserName 全局级 String 当前登录的用户名。 g:ProjectName 全局级 String 当前登录的Project。 g:DomainName 全局级 String 当前登录的Domain。 g:ResourceTag 全局级 StringEquals 资源标签键值。 Resource 格式为:服务名:region:domainId:资源类型:资源路径, 通配符号*表示所有,资源类型和资源路径可以参考表4。 示例: "dli:*:*:queue:*": 表示所有的队列。
  • 约束与限制 仅标准版弹性资源池的Spark引擎的SQL队列支持配置队列属性。 不支持批量设置队列属性。 不同队列属性的约束限制请参考表1 表1 不同队列属性的约束限制 属性 支持设置该属性的阶段 约束限制 相关操作链接 设置队列的Spark driver 仅支持队列创建完成后设置队列属性 弹性资源池中的队列,当队列的最小CUs小于16CUs时,在队列属性中设置的“最大spark driver实例数”和“最大预拉起spark driver实例数”不生效。 设置队列属性操作步骤 配置作业结果保存策略 仅支持队列创建完成后设置队列属性 开启“作业结果保存策略”,即配置作业结果保存至DLI作业桶后,请务必在提交SQL作业前配置DLI作业桶信息,否则SQL作业可能会提交失败。 设置队列属性操作步骤
  • 操作流程 创建弹性资源池并添加通用队列。 在DLI提交Notebook实例需要使用弹性资源池资源,并在弹性资源池中创建通用队列用于后续执行作业所需的计算资源。请参考步骤1:创建弹性资源池并添加通用队列。 创建Notebook实例所需的VPC和安全组。 配置弹性资源池开启Notebook后,弹性资源池会准备Notebook功能所需的组件。请参考步骤2:创建虚拟私有云和安全组。 创建增强型跨源连接用于打通DLI弹性弹性资源池和Notebook实例的网络。 请参考步骤3:创建增强型跨源连接。 准备创建Notebook实例所需的自定义镜像。 请参考步骤4:注册ModelArts自定义镜像。 创建自定义委托用于访问Notebook实例。 请参考步骤5:创建DLI自定义委托用于访问Notebook实例。 在DLI的弹性资源池中创建Notebook实例。 请参考步骤6:在DLI弹性资源池中创建Notebook实例。 配置Notebook访问DLI或LakeFormation元数据。 (可选)配置Notebook访问DLI元数据 (可选)配置Notebook访问LakeFormation元数据 在JupyterLab中编写和调试代码。 进入JupyterLab主页后,可在“Notebook”区域下编辑和调试代码。步骤8:使用Notebook实例编写和调试代码。
  • 步骤4:注册ModelArts自定义镜像 基于ModelArts提供的MindSpore预置镜像,并借助ModelArts命令行工具,通过加载镜像构建模板并修改Dockerfile,构建出一个新镜像,最后注册后在Notebook使用。 ModelArts命令行工具请参考ma-cli镜像构建命令介绍。 基础镜像地址:swr.{endpoint}/atelier/pyspark_3_1_1:develop-remote-pyspark_3.1.1-py_3.7-cpu-ubuntu_18.04-x86_64-uid1000-20230308194728-68791b4 请按需更换地址中的Region名称后使用 例如,新加坡区域的endpoint为ap-southeast-3.myhuaweicloud.com 拼接后的基础镜像地址为:swr.ap-southeast-3.myhuaweicloud.com/atelier/pyspark_3_1_1:develop-remote-pyspark_3.1.1-py_3.7-cpu-ubuntu_18.04-x86_64-uid1000-20230308194728-68791b4 在ModelArts创建并注册自定义镜像的详细操作请参考在Notebook中通过Dockerfile从0制作自定义镜像。
  • 约束限制 使用Notebook实例提交DLI作业必须使用弹性资源池下的通用队列。 每一个弹性资源池关联唯一的Notebook实例。 Notebook作业运行过程中产生的临时数据将会存储在DLI作业桶中,且必须使用并行文件系统。 请在ModelArts管理控制台管理Notebook实例。请参考管理Notebook实例。 Notebook实例用于代码编辑和开发,关联队列用于执行作业。 如需更换Notebook实例关联的队列请在ModelArts管理控制台进行相关操作。
  • 步骤5:创建DLI自定义委托用于访问Notebook实例 参考创建DLI自定义委托权限创建DLI自定义委托用于访问Notebook实例。 请确保委托中包含以下权限:ModelArts FullAccess、DLI FullAccess、OBS Administrator、IAM的授予向云服务传递委托的权限。 关于IAM的授予向云服务传递委托的权限,如果使用的是IAM角色或策略授权:请授予IAMiam:agencies:*权限。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "iam:agencies:*" ] }, { "Effect": "Deny", "Action": [ "iam:agencies:update*", "iam:agencies:delete*", "iam:agencies:create*" ] } ] }
  • 步骤2:创建虚拟私有云和安全组 创建虚拟私有云 登录VPC管理控制台,进入创建虚拟私有云页面。 在“创建虚拟私有云”页面,根据界面提示配置VPC和子网的参数。 具体参数说明请参考创建虚拟私有云。 其中配置IPv4网段时,请确保VPC的IPv4网段不要与下列网段重复。 172.18.0.0/16、172.16.0.0/16、10.247.0.0/16 创建安全组 登录VPC管理控制台,进入安全组列表页面。 在安全组列表右上方,单击“创建安全组”。 进入“创建安全组”页面。根据界面提示,设置安全组参数。 具体参数说明请参考创建安全组。 请确保安全组需要对DLI弹性资源池网段放通TCP的8998和30000-32767端口。
  • 步骤8:使用Notebook实例编写和调试代码 Notebook与DLI队列连接成功后,即可在“Notebook”区域下编辑和调试代码。 您可以选择使用Notebook提交作业,或在DLI管理控制台的Spark作业操作页面提交作业。 Notebook相关操作请参考JupyterLab简介及常用操作。 Notebook中的数据上传请参考上传文件至JupyterLab。 Notebook中的数据下载请参考下载JupyterLab文件到本地。
  • 环境准备 DLI资源环境准备 配置DLI作业桶 使用DLI服务前需配置DLI作业桶,该桶用于存储DLI作业运行过程中产生的临时数据,例如:作业日志、作业结果。 具体操作请参考:配置DLI作业桶。 准备Jar包并上传OBS桶 本示例使用的Spark作业代码来自maven库(下载地址:https://repo.maven.apache.org/maven2/org/apache/spark/spark-examples_2.10/1.1.1/spark-examples_2.10-1.1.1.jar),此Spark作业是计算π的近似值。 获取Spark作业代码JAR包后,将JAR包上传到OBS桶中,本例存储路径为“obs://dlfexample/spark-examples_2.10-1.1.1.jar”。 创建弹性资源池并添加通用队列 弹性资源池为DLI作业运行提供所需的计算资源(CPU和内存),用于灵活应对业务对计算资源变化的需求。 创建弹性资源池后,您可以在弹性资源池中创建通用队列用于提交Spark作业,队列关联到具体的作业和数据处理任务,是资源池中资源被实际使用和分配的基本单元,即队列是执行作业所需的具体的计算资源。 具体操作请参考:创建弹性资源池并添加队列。 DataArts Studio 资源环境准备 购买DataArts Studio实例 在使用DataArts Studio提交DLI作业前,需要先购买DataArts Studio实例。 具体操作请参考购买DataArts Studio基础包。 进入DataArts Studio实例空间 购买完成DataArts Studio实例后,单击“进入控制台”。 图1 进入DataArts Studio实例控制台 单击“空间管理”,进入数据开发页面。 购买DataArts Studio实例的用户,系统将默认为其创建一个默认的工作空间“default”,并赋予该用户为管理员角色。您可以使用默认的工作空间,也可以参考本章节的内容创建一个新的工作空间。 如需创建新的空间请参考创建并管理工作空间。 图2 进入DataArts Studio实例空间 图3 进入DataArts Studio数据开发页面
  • 步骤2:提交Spark作业 用户需要在数据开发模块中创建一个作业,通过作业的DLI Spark节点提交Spark作业。 创建一个数据开发批处理作业,右键单击目录,单击“新建作业”,作业名称为“job_DLI_Spark”。 图5 创建作业 然后进入作业开发页面,拖动DLI Spark节点到画布并单击,配置节点的属性。 图6 配置节点属性 关键属性说明: DLI队列:DLI中创建的DLI队列。 作业运行资源:DLI Spark节点运行时,限制最大可以使用的CPU、内存资源。 作业主类:DLI Spark节点的主类,本例的主类是“org.apache.spark.examples.SparkPi”。 Spark程序资源包:4中创建的资源。 作业编排完成后,单击,测试运行作业。 图7 作业日志(仅参考) 如果日志运行正常,保存作业并提交版本。
  • 修改DLI Livy工具配置文件 上传指定的DLI Livy工具jar资源包到OBS桶路径下。 登录OBS控制台,在指定的OBS桶下创建一个存放Livy工具jar包的资源目录。例如:“obs://bucket/livy/jars/”。 进入3.a中DLI Livy工具所在E CS 服务器的安装目录,获取以下jar包,将获取的jar包上传到1.a创建的OBS桶资源目录下。 例如,当前Livy工具安装路径为“/opt/livy”,则当前需要上传的jar包名称如下: /opt/livy/rsc-jars/livy-api-0.7.2.0107.jar /opt/livy/rsc-jars/livy-rsc-0.7.2.0107.jar /opt/livy/repl_2.11-jars/livy-core_2.11-0.7.2.0107.jar /opt/livy/repl_2.11-jars/livy-repl_2.11-0.7.2.0107.jar 修改DLI Livy工具配置文件。 编辑修改配置文件“ /opt/livy/conf/livy-client.conf”。 vi /opt/livy/conf/livy-client.conf 添加如下内容,并根据注释修改配置项。 #当前ECS的私有IP地址,也可以使用ifconfig命令查询。 livy.rsc.launcher.address = X.X.X.X #当前ECS服务器放通的端口号 livy.rsc.launcher.port.range = 30000~32767 编辑修改配置文件“ /opt/livy/conf/livy.conf”。 vi /opt/livy/conf/livy.conf 添加如下内容。根据注释说明修改具体的配置项。 livy.server.port = 8998 livy.spark.master = yarn livy.server.contextLauncher.custom.class=org.apache.livy.rsc.DliContextLauncher livy.server.batch.custom.class=org.apache.livy.server.batch.DliBatchSession livy.server.interactive.custom.class=org.apache.livy.server.interactive.DliInteractiveSession livy.server.sparkApp.custom.class=org.apache.livy.utils.SparkDliApp livy.server.recovery.mode = recovery livy.server.recovery.state-store = filesystem #以下文件路径请根据情况修改 livy.server.recovery.state-store.url = file:///opt/livy/store/ livy.server.session.timeout-check = true livy.server.session.timeout = 1800s livy.server.session.state-retain.sec = 1800s livy.dli.spark.version = 2.3.2 livy.dli.spark.scala-version = 2.11 # 填入存储livy jar包资源的OBS桶路径。 livy.repl.jars = obs://bucket/livy/jars/livy-core_2.11-0.7.2.0107.jar, obs://bucket/livy/jars/livy-repl_2.11-0.7.2.0107.jar livy.rsc.jars = obs://bucket/livy/jars/livy-api-0.7.2.0107.jar, obs://bucket/livy/jars/livy-rsc-0.7.2.0107.jar 编辑修改配置文件“/opt/livy/conf/spark-defaults.conf”。 vi /opt/livy/conf/spark-defaults.conf 添加如下必选参数内容。配置项参数填写说明,详见表1。 # 以下参数均支持在提交作业时覆盖。 spark.yarn.isPython=true spark.pyspark.python=python3 # 当前参数值为生产环境web地址 spark.dli.user.uiBaseAddress=https://console.huaweicloud.com/dli/web # 队列所在的region。 spark.dli.user.regionName=XXXX # dli endpoint 地址。 spark.dli.user.dliEndPoint=XXXX # 用于指定队列,填写已创建DLI的队列名。 spark.dli.user.queueName=XXXX # 提交作业使用的access key。 spark.dli.user.access.key=XXXX # 提交作业使用的secret key。 spark.dli.user.secret.key=XXXX # 提交作业使用的projectId。 spark.dli.user.projectId=XXXX 表1 spark-defaults.conf必选参数说明 参数名 参数填写说明 spark.dli.user.regionName DLI队列所在的区 域名 。 从地区和终端节点获取,对应“区域”列就是regionName。 spark.dli.user.dliEndPoint DLI队列所在的终端节点。 从地区和终端节点获取,对应的“终端节点(Endpoint)”就是该参数取值。 spark.dli.user.queueName DLI队列名称。 spark.dli.user.access.key 对应用户的访问密钥。该用户需要有Spark作业相关权限,权限说明详见权限管理。 密钥获取方式请参考获取AK/SK。 spark.dli.user.secret.key spark.dli.user.projectId 参考获取项目ID获取项目ID。 以下参数为可选参数,请根据参数说明和实际情况配置。详细参数说明请参考Spark Configuration。 表2 spark-defaults.conf可选参数说明 Spark作业参数 对应Spark批处理参数 备注 spark.dli.user.file file 如果是对接notebook工具场景时不需要设置。 spark.dli.user.className class_name 如果是对接notebook工具场景时不需要设置。 spark.dli.user.scType sc_type 推荐使用livy原生配置。 spark.dli.user.args args 推荐使用livy原生配置。 spark.submit.pyFiles python_files 推荐使用livy原生配置。 spark.files files 推荐使用livy原生配置。 spark.dli.user.modules modules - spark.dli.user.image image 提交作业使用的自定义镜像,仅容器集群支持该参数,默认不设置。 spark.dli.user.autoRecovery auto_recovery - spark.dli.user.maxRetryTimes max_retry_times - spark.dli.user.catalogName catalog_name 访问元数据时,需要将该参数配置为dli。
  • 通过DLI Livy工具提交Spark作业到DLI 本示例演示通过curl命令使用DLI Livy工具将Spark作业提交到DLI。 将开发好的Spark作业程序jar包上传到OBS路径下。 例如,本示例上传“spark-examples_2.11-XXXX.jar”到“obs://bucket/path”路径下。 以root用户登录到安装DLI Livy工具的ECS服务器。 执行curl命令通过DLI Livy工具提交Spark作业请求到DLI。 ECS_IP为当前安装DLI Livy工具所在的弹性云服务器的私有IP地址。 curl --location --request POST 'http://ECS_IP:8998/batches' \ --header 'Content-Type: application/json' \ --data '{ "driverMemory": "3G", "driverCores": 1, "executorMemory": "2G", "executorCores": 1, "numExecutors": 1, "args": [ "1000" ], "file": "obs://bucket/path/spark-examples_2.11-XXXX.jar", "className": "org.apache.spark.examples.SparkPi", "conf": { "spark.dynamicAllocation.minExecutors": 1, "spark.executor.instances": 1, "spark.dynamicAllocation.initialExecutors": 1, "spark.dynamicAllocation.maxExecutors": 2 } }'
  • 准备工作 创建DLI队列。在“队列类型”中选择“通用队列”,即Spark作业的计算资源。具体请参考创建队列。 准备一个linux弹性 云服务器ECS ,用于安装DLI Livy。 ECS需要放通30000至32767端口、8998端口。具体操作请参考添加安全组规则。 ECS需安装Java JDK,JDK版本建议为1.8。配置Java环境变量JAVA_HOME。 查询弹性云服务器ECS详细信息,获取ECS的“私有IP地址”。 使用增强型跨源连接打通DLI队列和Livy实例所在的VPC网络。具体操作可以参考增强型跨源连接。
  • DLI Livy工具下载及安装 本次操作下载的DLI Livy版本为apache-livy-0.7.2.0107-bin.tar.gz,后续版本变化请根据实际情况修改。 单击下载链接,获取DLI Livy工具压缩包。 使用WinSCP工具,将获取的工具压缩包上传到准备好的ECS服务器目录下。 使用root用户登录ECS服务器,执行以下命令安装DLI Livy工具。 执行以下命令创建工具安装路径。 mkdir livy安装路径 例如新建路径/opt/livy:mkdir /opt/livy。后续操作步骤均默认以/opt/livy安装路径演示,请根据实际情况修改。 解压工具压缩包到安装路径。 tar --extract --file apache-livy-0.7.2.0107-bin.tar.gz --directory /opt/livy --strip-components 1 --no-same-owner 执行以下命令修改配置文件名称。 cd /opt/livy/conf mv livy-client.conf.template livy-client.conf mv livy.conf.template livy.conf mv livy-env.sh.template livy-env.sh mv log4j.properties.template log4j.properties mv spark-blacklist.conf.template spark-blacklist.conf touch spark-defaults.conf
  • 常见问题 如果 DataArts 作业失败,且 DataArts 提供的日志不够详细,怎么办?还能从哪里找更具体的日志? 您可以可通过 DataArts 的日志找到DLI job id,然后根据DLI job id 在DLI控制台中找到具体的作业。 图19 监控日志 在DLI控制台中找到具体的作业,单击归档日志即可查看详细日志: 图20 输入作业ID 可以通过DataArts的nodename或jobname在DLI 控制台搜索作业: 图21 nodename或jobname 如果在运行复杂DLI作业时遇到权限类报错,应该怎么办? 使用DLI的过程中需要与其他云服务协同工作,因此需要您将部分服务的操作权限委托给DLI服务,确保DLI具备基本使用的权限,让DLI服务以您的身份使用其他云服务,代替您进行一些资源运维工作。 了解更多:配置DLI云服务委托权限。
  • 开发流程 图1 在DataArts Studio开发DLI SQL作业的流程图 环境准备:准备执行作业所需的DLI资源和DataArts Studio资源。请参考环境准备。 创建数据库和表:提交SQL脚本创建数据库和表。请参考步骤1:创建数据库和表。 导入业务数据:提交SQL脚本导入业务数据。请参考步骤2:业务数据的计算与处理。 数据查询与分析:提交SQL脚本分析业务数据,例如查询单日销售情况。请参考步骤3:销售情况的查询与分析。 作业编排:将数据处理和数据分析脚本编排成一个pipeline。DataArts会按照编排好的pipeline顺序执行各个节点。请参考步骤4:作业编排。 测试作业运行:测试作业运行。请参考步骤5:测试作业运行。 设置作业调度与监控:设置作业调度属性与监控规则。请参考步骤6:设置作业周期调度和相关操作。
  • 环境准备 DLI资源环境准备 配置DLI作业桶 使用DLI服务前需配置DLI作业桶,该桶用于存储DLI作业运行过程中产生的临时数据,例如:作业日志、作业结果。 具体操作请参考:配置DLI作业桶。 创建弹性资源池并添加SQL队列 弹性资源池为DLI作业运行提供所需的计算资源(CPU和内存),用于灵活应对业务对计算资源变化的需求。 创建弹性资源池后,您可以在弹性资源池中创建多个队列,队列关联到具体的作业和数据处理任务,是资源池中资源被实际使用和分配的基本单元,即队列是执行作业所需的具体的计算资源。 同一弹性资源池中,队列之间的计算资源支持共享。 通过合理设置队列的计算资源分配策略,可以提高计算资源利用率。 具体操作请参考:创建弹性资源池并添加队列。 DataArts Studio资源环境准备 购买DataArts Studio实例 在使用DataArts Studio提交DLI作业前,需要先购买DataArts Studio实例。 具体操作请参考购买DataArts Studio基础包。 进入DataArts Studio实例空间 购买完成DataArts Studio实例后,单击“进入控制台”。 图2 进入DataArts Studio实例控制台 单击“空间管理”,进入数据开发页面。 购买DataArts Studio实例的用户,系统将默认为其创建一个默认的工作空间“default”,并赋予该用户为管理员角色。您可以使用默认的工作空间,也可以参考本章节的内容创建一个新的工作空间。 如需创建新的空间请参考创建并管理工作空间。 图3 进入DataArts Studio实例空间 图4 进入DataArts Studio数据开发页面
  • 步骤4:作业编排 在作业 “job_process_data”中新建一个DLI SQL节点 "select_analyze_data"。并单击节点编辑属性。 SQL或脚本:本例选择“SQL脚本”。并选择1中创建的脚本。 数据库名称:选择SQL脚本中设置的数据库。 队列名称:选择步骤▪创建弹性资源池并添加SQL队列中创建的SQL队列。 更多属性参数配置请参考DLI SQL属性参数说明。 图15 编辑DLI SQL节点属性 属性编辑完成后,单击“保存”,保存属性配置信息。 将这两个节点编排成一个pipeline。DataArt会按照编排好的pipeline顺序执行各个节点。然后单击左上角 “保存” 和 “提交”。
  • 支持的API列表 DLI JDBC Driver支持的API列表如下,对可能与JDBC标准产生歧义的地方加以备注说明。 Connection API支持的常用方法签名: Statement createStatement() PreparedStatement prepareStatement(String sql) void close() boolean isClosed() DatabaseMetaData getMetaData() PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) Driver API支持的常用方法签名: Connection connect(String url, Properties info) boolean acceptsURL(String url) DriverPropertyInfo[] getPropertyInfo(String url, Properties info) ResultSetMetaData API支持的常用方法签名: String getColumnClassName(int column) int getColumnCount() int getColumnDisplaySize(int column) String getColumnLabel(int column) String getColumnName(int column) int getColumnType(int column) String getColumnTypeName(int column) int getPrecision(int column) int getScale(int column) boolean isCaseSensitive(int column) Statement API支持的常用方法签名: ResultSet executeQuery(String sql) int executeUpdate(String sql) boolean execute(String sql) void close() int getMaxRows() void setMaxRows(int max) int getQueryTimeout() void setQueryTimeout(int seconds) void cancel() ResultSet getResultSet() int getUpdateCount() boolean isClosed() PreparedStatement API支持的常用方法签名: void clearParameters() boolean execute() ResultSet executeQuery() int executeUpdate() PreparedStatement Set系列方法 ResultSet API支持的常用方法签名: int getRow() boolean isClosed() boolean next() void close() int findColumn(String columnLabel) boolean wasNull() get系列方法 DatabaseMetaData API支持的常用方法签名 ResultSet getCatalogs() 在DLI服务中没有Catalog的概念,返回空的ResultSet。 ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) Connection getConnection() getTables(String catalog, String schemaPattern,String tableNamePattern, String types[]) 该方法不采纳Catalog参数,schemaPattern对应DLI服务的database的概念。 ResultSet getTableTypes() ResultSet getSchemas() ResultSet getSchemas(String catalog, String schemaPattern)
共100000条
提示

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