
# 在DataArts Studio开发DLI SQL作业
#### 操作场景
华为云数据治理中心DataArts Studio提供了一站式数据治理平台，可以实现与DLI服务的对接，从而提供统一的数据集成、数据开发服务，方便企业对全部数据进行管控。
本节操作介绍在DataArts Studio开发DLI SQL作业的操作步骤。
#### 开发流程
图1在DataArts Studio开发DLI SQL作业的流程图   
![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190578565.png)
1. 环境准备：准备执行作业所需的DLI资源和DataArts Studio资源。请参考[环境准备]。
2. 创建数据库和表：提交SQL脚本创建数据库和表。请参考[步骤1：创建数据库和表]。
3. 导入业务数据：提交SQL脚本导入业务数据。请参考[步骤2：业务数据的计算与处理]。
4. 数据查询与分析：提交SQL脚本分析业务数据，例如查询单日销售情况。请参考[步骤3：销售情况的查询与分析]。
5. 作业编排：将数据处理和数据分析脚本编排成一个pipeline。DataArts会按照编排好的pipeline顺序执行各个节点。请参考[步骤4：作业编排]。
6. 测试作业运行：测试作业运行。请参考[步骤5：测试作业运行]。
7. 设置作业调度与监控：设置作业调度属性与监控规则。请参考[步骤6：设置作业周期调度]和[相关操作]。
 
 #### 环境准备
- **DLI资源环境准备**
  - **配置DLI作业桶**
    使用DLI服务前需配置DLI作业桶，该桶用于存储DLI作业运行过程中产生的临时数据，例如：作业日志、作业结果。
    具体操作请参考：[配置DLI作业桶](https://support.huaweicloud.com/usermanual-dli/dli_01_0536.html)。
    
  
  - **创建弹性资源池并添加SQL队列**
    弹性资源池为DLI作业运行提供所需的计算资源（CPU和内存），用于灵活应对业务对计算资源变化的需求。
    创建弹性资源池后，您可以在弹性资源池中创建多个队列，队列关联到具体的作业和数据处理任务，是资源池中资源被实际使用和分配的基本单元，即队列是执行作业所需的具体的计算资源。
    同一弹性资源池中，队列之间的计算资源支持共享。 通过合理设置队列的计算资源分配策略，可以提高计算资源利用率。
    具体操作请参考：[创建弹性资源池并添加队列](https://support.huaweicloud.com/usermanual-dli/dli_01_0505.html)。
    
   
- **DataArts Studio资源环境准备**
  - **购买** **DataArts Studio实例**
    在使用DataArts Studio提交DLI作业前，需要先购买DataArts Studio实例。
    具体操作请参考[购买DataArts Studio基础包](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0115.html)。
    
  
  - **进入** **DataArts Studio实例** **空间**
    1. 购买完成DataArts Studio实例后，单击"进入控制台"。
       图2进入DataArts Studio实例控制台   
       ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190464221.png "点击放大") 
    
    2. 单击"空间管理"，进入数据开发页面。 购买DataArts Studio实例的用户，系统将默认为其创建一个默认的工作空间"default"，并赋予该用户为管理员角色。您可以使用默认的工作空间，也可以参考本章节的内容创建一个新的工作空间。
       如需创建新的空间请参考[创建并管理工作空间](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0116.html)。
       图3进入DataArts Studio实例空间   
       ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155217350.png "点击放大")
       图4进入DataArts Studio数据开发页面   
       ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155057590.png "点击放大") 
     
   
 
 #### 步骤1：创建数据库和表
1. **开发创建数据库和表的SQL脚本**
   
   数据库和表是SQL作业开发的基础，在执行作业前您需要根据业务场景定义数据库和表。
   本节操作介绍提交SQL脚本创建数据库和表的操作步骤。
   1. 在DataArts Studio数据开发页面，选择左侧导航栏的"数据开发 \> 脚本开发"。
   
   2. 单击"新建DLI SQL脚本"。
      图5新建DLI SQL脚本   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190578569.png "点击放大") 
   
   3. 在脚本编辑页面输入创建数据库和表的示例代码。
      ```
      ```SQL -- 创建数据库
      CREATE DATABASE IF not EXISTS supermarket_db;-- 创建商品维表
      CREATE TABLE IF not EXISTS supermarketdb.products ( productid INT,  productname STRING, category STRING,  price DECIMAL(10,2) ) using parquet;
      -- 创建交易表，( productid INT, -- 商品编号 productname STRING, -- 商品名称 category STRING, -- 商品类别 price DECIMAL(10,2) -- 单价 ) 
      CREATE TABLE IF not EXISTS supermarketdb.transactions (transactionid INT,  productid INT,  quantity INT,  dt STRING  ) using parquet partitioned by (dt);
      -- 创建销售分析表，(transactionid INT, -- 交易编号 productid INT, -- 商品编号 quantity INT, -- 数量 dt STRING -- 日期 )
      CREATE TABLE IF not EXISTS supermarketdb.analyze (transactionid INT, productid INT, productname STRING,  quantity INT, dt STRING ) using parquet partitioned by (dt); 
      -- (transactionid INT, -- 交易编号 productid INT, -- 商品编号 productname STRING, -- 商品名称 quantity INT, -- 数量 dt STRING -- 日期 )
      ```
      ```
      
   
   4. 单击"保存"，保存SQL脚本，本例定义脚本名称为 create_tables。
   
   5. 单击"提交"按钮执行脚本创建数据库和表。
   
   
   
   
2. **创建SQL作业运行脚本**
   
   1. 在DataArts Studio数据开发页面，选择左侧导航栏的"数据开发 \> 作业开发"。
      图6新建作业   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190464225.png "点击放大") 
   
   2. 编辑作业信息，本例定义SQL作业名称为 "job_create_tables"。
      图7编辑作业信息   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155217354.png "点击放大") 
   
   3. 在作业开发页面，拖动DLI SQL节点到画布中，并单击节点编辑属性。
      - SQL或脚本：本例选择"SQL脚本"。并选择[2.b]中创建的脚本。
      
      - 数据库名称：选择SQL脚本中设置的数据库。
      
      - 队列名称：选择步骤[▪创建弹性资源池并添加SQL队列]中创建的SQL队列。
      
      
      更多属性参数配置请参考[DLI SQL属性参数说明](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0450.html)。
      图8编辑DLI SQL节点属性   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155057594.png "点击放大") 
   
   4. 属性编辑完成后，单击"保存"，保存属性配置信息。
   
   
   
   
3. **配置作业调度**
   
   由于创建库表只需要执行一次，所以本示例只设置为单次调度。
   1. 鼠标左键单击作业画布空白处。
   
   2. 单击 "调度配置" ，选择 "单次调度"（该作业只会被调度一次，后续不会再被自动调度）。
      图9配置作业调度   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190578573.png "点击放大") 
   
   3. 完成调度配置后单击"执行调度"。 单击"前往运维中心"可以查看作业运行状况。
      
   
   
   
   
 
 #### 步骤2：业务数据的计算与处理
1. **开发导入业务数据的SQL脚本**
   
   本节操作介绍提交SQL脚本导入业务数据的操作步骤。
   1. 在DataArts Studio数据开发页面，选择左侧导航栏的"数据开发 \> 脚本开发"。
   
   2. 单击"新建DLI SQL脚本"。
      图10新建DLI SQL脚本   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190464229.png "点击放大") 
   
   3. 在脚本编辑页面输入分析数据的示例代码。
      ```
      SQL -- 实际业务中数据一般来自其他数据源，本示例简化了数据入库逻辑，模拟插入商品数据。 
       INSERT INTO supermarketdb.products (productid, productname, category, price) VALUES
      (1001, '洗发水', '日用品', 39.90),
      (1002, '牙膏', '日用品', 15.90),
      (1003, '方便面', '食品', 4.50),
      (1004, '可乐', '饮料', 3.50);
      -- 实际业务中数据一般来自其他数据源，本示例简化了数据入库逻辑，模拟插入交易记录。 
      INSERT INTO supermarketdb.transactions (transactionid, productid, quantity, dt) VALUES (1, 1001, 50, '2024-11-01'), -- 销售50瓶洗发水
      (2, 1002, 100, '2024-11-01'), -- 销售100支牙膏
      (3, 1003, 30, '2024-11-02'), -- 销售30包方便面
      (4, 1004, 24, '2024-11-02'); -- 销售24瓶可乐
      -- 模拟超市业务分析，查询某个商品的交易记录
      INSERT INTO supermarketdb.analyze SELECT t.transactionid, t.productid, p.productname, t.quantity, t.dt
      FROM supermarketdb.transactions t 
      JOIN supermarketdb.products p ON t.productid = p.productid 
      WHERE t.dt = '2024-11-01';
      ```
      
   
   4. 单击"保存"，保存SQL脚本，本例定义脚本名称为 job_process_data。
   
   5. 单击"提交"执行脚本。
   
   
   
   
2. **创建SQL作业**
   
   1. 在DataArts Studio数据开发页面，选择左侧导航栏的"数据开发 \> 作业开发"。
      图11新建作业   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155217358.png "点击放大") 
   
   2. 编辑作业信息，本例定义SQL作业名称为 "job_process_data"。
      图12编辑作业信息   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155057598.png "点击放大") 
   
   3. 在作业开发页面，拖动DLI SQL节点到画布中，并单击节点编辑属性。
      - SQL或脚本：本例选择"SQL脚本"。并选择[1]中创建的脚本。
      
      - 数据库名称：选择SQL脚本中设置的数据库。
      
      - 队列名称：选择步骤[▪创建弹性资源池并添加SQL队列]中创建的SQL队列。
      
      - 环境变量："DLI环境变量" 为可选项。 本例中添加的参数含义如下：
        spark.sql.optimizer.dynamicPartitionPruning.enabled = true
        - 该配置项用于启用或禁用动态分区修剪。在执行SQL查询时，动态分区修剪可以帮助减少需要扫描的数据量，提高查询性能。
        
        - 配置为true时，代表启用动态分区修剪，SQL会在查询中自动检测并删除那些不满足WHERE子句条件的分区，适用于在处理具有大量分区的表时。
        
        - 如果SQL查询中包含大量的嵌套left join操作，并且表有大量的动态分区时，这可能会导致在数据解析时消耗大量的内存资源，导致Driver节点的内存不足，并触发频繁的Full GC。
        
        - 在这种情况下，可以配置该参数为false即禁用动态分区修剪优化，有助于减少内存使用，避免内存溢出和频繁的Full GC。
        
        
        但禁用此优化可能会降低查询性能，禁用后Spark将不会自动修剪掉那些不满足条件的分区。
        
      
      
      更多属性参数配置请参考[DLI SQL属性参数说明](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0450.html)。
      图13编辑DLI SQL节点属性   
      ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190578577.png "点击放大") 
   
   4. 属性编辑完成后，单击"保存"，保存属性配置信息。
   
   
   
   
 
 #### 步骤3：销售情况的查询与分析
**开发数据分析与处理的SQL脚本**
本节操作介绍提交SQL脚本分析数据的操作步骤。
1. 在DataArts Studio数据开发页面，选择左侧导航栏的"数据开发 \> 脚本开发"。
2. 单击"新建DLI SQL脚本"。
   图14新建DLI SQL脚本   
   ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190464233.png "点击放大") 
3. 在脚本编辑页面输入分析数据的示例代码。
   ```
   -- 查询单日销售情况 
   SELECT transaction_id, productid, productname, quantity, dt FROM supermarket_db.analyze WHERE dt = '2024-11-01';
   ```
   
4. 单击"保存"，保存SQL脚本，本例定义脚本名称为 select*_* analyze*_*data。
5. 单击"提交"执行脚本。
 
 #### 步骤4：作业编排
1. 在作业 "job_process_data"中新建一个DLI SQL节点 "select*_* analyze*_* data"。并单击节点编辑属性。
   - SQL或脚本：本例选择"SQL脚本"。并选择[1]中创建的脚本。
   
   - 数据库名称：选择SQL脚本中设置的数据库。
   
   - 队列名称：选择步骤[▪创建弹性资源池并添加SQL队列]中创建的SQL队列。
   
   
   更多属性参数配置请参考[DLI SQL属性参数说明](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0450.html)。
   图15编辑DLI SQL节点属性   
   ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155217362.png "点击放大") 
2. 属性编辑完成后，单击"保存"，保存属性配置信息。
3. 将这两个节点编排成一个pipeline。DataArt会按照编排好的pipeline顺序执行各个节点。然后单击左上角 "保存" 和 "提交"。
 
 #### 步骤5：测试作业运行
作业编排完成后，单击"测试运行"，测试运行作业。
运行结束后，可打开"select*_* analyze*_*data"SQL脚本，单击"运行"，查询分析销售明细。
如果查询结果符合预期，可以继续执行[步骤6：设置作业周期调度]设置作业周期调度。
图16执行select*_* analyze*_* data脚本   
![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155057602.png "点击放大")
 #### 步骤6：设置作业周期调度
1. 在DataArts Studio数据开发页面，选择左侧导航栏的"数据开发 \> 作业开发"。
2. 双击"job_process_data"。
3. 单击右侧导航栏中的 "调度配置"。
4. 选择周期调度，并设置调度属性。 本例中，该作业的调度策略从2024/11/22 10:15:00开始生效，且首次执行调度的时间是2024/11/22 10:20:00，调度周期间隔1天，即后续每天10:20:00 AM会自动调度这些这个作业，会按照编排好的pipeline顺序执行作业中的每个节点。
   图17配置作业调度   
   ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190578581.png "点击放大") 
5. 依次单击 "保存" 、"提交" 和 "执行调度" 按钮，即可完成作业周期调度配置。
了解更多作业调度设置请参考[调度作业](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0470.html)。
 #### 相关操作
- **设置作业监控**
  DataArts Studio提供了对批处理作业的状态进行监控的能力。
  批作业是由一个或多个节点组成的流水线，以流水线作为一个整体被调度。
  您可以在 DataArts 左侧导航栏 "作业监控 \> 批作业监控" 页面查看批处理作业的调度状态、调度周期、调度开始时间等信息。
  了解更多[DataArts运维调度作业监控](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0508.html)。
  图18设置作业监控   
  ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155059218.png "点击放大") 
- **设置实例监控**
  作业每次运行，都会对应产生一次作业实例记录。
  在数据开发模块控制台的左侧导航栏，选择 "运维调度"，进入实例监控列表页面，您可以在该页面中查看作业的实例信息，并根据需要对实例进行更多操作。
  了解更多[实例监控](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0511.html)。
  
 
#### 常见问题
- **如果 DataArts 作业失败，且 DataArts 提供的日志不够详细，怎么办？还能从哪里找更具体的日志？**
  您可以可通过 DataArts 的日志找到DLI job id，然后根据DLI job id 在DLI控制台中找到具体的作业。
  图19监控日志   
  ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002190578585.png "点击放大")
  在DLI控制台中找到具体的作业，单击归档日志即可查看详细日志：
  图20输入作业ID   
  ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002171449932.png "点击放大")
  可以通过DataArts的node*name或job*name在DLI 控制台搜索作业：
  图21nodename或jobname   
  ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002155217370.png "点击放大") 
- **如果在运行复杂DLI作业时遇到权限类报错，应该怎么办？**
  使用DLI的过程中需要与其他云服务协同工作，因此需要您将部分服务的操作权限委托给DLI服务，确保DLI具备基本使用的权限，让DLI服务以您的身份使用其他云服务，代替您进行一些资源运维工作。
  了解更多：[配置DLI云服务委托权限](https://support.huaweicloud.com/usermanual-dli/dli_01_0618.html)。
  
 
