更新时间:2024-11-29 GMT+08:00

提交Sqoop任务

操作场景

该任务指导用户使用Oozie客户端提交Sqoop任务。

  • Oozie使用Sqoop导入数据时不支持使用Sqoop的--create-hcatalog-table--drop-and-create-hcatalog-table等Hcatalog的自动创建表和删除表的参数,需要提前在Oozie中创建好需要的表;如需使用自动创建表功能,请使用--hive-import方式导入数据。
  • 如果集群已启用Kerberos认证(安全模式),则不支持在Oozie客户端提交Sqoop任务将数据直接导入到HBase中;如需使用,请直接使用Sqoop命令行进行数据导入或在未开启Kerberos认证的集群中进行操作。

前提条件

  • Sqoop和Oozie组件及客户端已安装,并且正常运行。
  • 获取Oozie服务的URL和Yarn ResourceManager的主节点IP地址和端口号:
    • Oozie服务的URL为“https://oozie实例的主机IP:端口号/oozie”,用于指定运行Sqoop任务的Oozie服务器,例如:https://10.1.130.11:21003/oozie

      可登录FusionInsight Manager,选择“集群 > 服务 > Oozie > 实例”,即可获取任一oozie实例的IP地址;单击“配置”,在搜索框中搜索“OOZIE_HTTPS_PORT”,即可查看使用的端口号。

    • Yarn ResourceManager的主节点IP和端口用于修改“job.properties”文件的“resourceManager”参数,格式为“主ResourceManagerIP地址:端口号”,例如:10.1.130.11:8032。

      可登录FusionInsight Manager,选择“集群 > 服务 > Yarn > 实例”,即可获取主ResourceManager实例的IP地址;单击“配置”,在搜索框中搜索“yarn.resourcemanager.port”,即可查看使用的端口号。

  • 上传关系型数据库对应版本的JDBC驱动Jar包(例如MySQL驱动包“mysql-connector-java-5.1.47.jar”)到HDFS的“/user/oozie/share/lib/sqoopclient/”目录中,并修改权限、用户组与该目录中其他Jar包保持一致,再执行以下两种操作的任意一种刷新Jar包依赖即可:
    • 在Oozie客户端刷新依赖:

      oozie admin -oozie https://oozie实例的主机IP:端口号/oozie -sharelibupdate

    • 重启Oozie服务刷新依赖:

      登录FusionInsight Manager界面,选择“集群 > 服务 > Oozie > 更多 > 重启服务”,重启Oozie服务。

  • 已获取关系型数据库对应版本的JDBC驱动Jar包,例如MySQL驱动包“mysql-connector-java-5.1.47.jar”。
  • 已准备好相应的Sqoop命令,具体操作请参见相关章节。

操作步骤

  1. 创建用于访问Oozie服务的人机用户(若已存在具有相关权限的用户则跳过该操作)。

    1. 登录FusionInsight Manager,选择“系统 > 权限”。
    2. 选择“角色 > 添加角色”,配置以下参数并单击“确定”,创建具有Oozie管理员权限的角色。
      • 角色名称:输入角色名称,例如:oozieadmin。
      • 配置资源权限:在“配置资源权限”列表选择“待操作的集群名称 > Oozie”,勾选“管理员权限”。
    3. 选择“用户 > 添加用户”,配置以下参数并单击“确定”,创建一个人机用户:
      • 用户名:输入用户名称,例如:oozieuser。
      • 用户类型:选择“人机”用户。
      • “密码”和“确认新密码”输入该用户的密码。
      • 用户组:加入“hadoop”、“supergroup”和“hive”用户组。
      • 角色:单击“添加”,绑定“manager_viewer”和1.b新增的具有Oozie管理员权限的角色(例如:oozieadmin)。
    4. 使用新建的人机用户重新登录FusionInsight Manager,并修改该用户的初始密码。

  2. 以客户端安装用户,登录安装了户端的节点。
  3. 执行以下命令,配置环境变量。其中“/opt/client”为客户端安装路径,该操作的客户端目录只是举例,请根据实际安装目录修改。

    source /opt/client/bigdata_env

  4. 判断集群认证模式。

    • 集群已开启Kerberos认证,执行kinit命令进行用户认证。

      例如,使用oozieuser用户进行认证:

      kinit oozieuser

    • 集群未开启Kerberos认证,执行5

  5. 执行以下命令,进入Sqoop样例目录:

    cd /opt/client/Oozie/oozie-client-*/examples/apps/sqoopclient/

    • Sqoop包含sqoopclientsqoopclient-freeform两种方式编写Workflow,区别只是“workflow.xml”里填入Sqoop命令参数的形式不同。
    • 本章节使用sqoopclient作为举例,sqoopclient-freeform的操作步骤一致。
    • 如果Sqoop命令中的实参中有空格,请使用“/opt/client/Oozie/oozie-client-*/examples/apps/sqoopclient-freeform”样例,详细说明请参见该路径下的“workflow.xml”。

      例如,Sqoop命令中包含参数:--query 'select TT.I, TT.S from TT where $CONDITIONS' ,该命令的select语句中包含空格。

  6. 执行以下命令修改“job.properties”文件:

    vim job.properties

    修改如下内容:

    • 修改“resourceManager”的参数值为Yarn主ResourceManager节点的IP地址和端口,例如“resourceManager=10.1.130.11:8032”
    • 修改“userName”的参数值为提交任务的人机用户名,即为1创建的用户名,例如“userName=oozieuser”。该参数将用于拼接Oozie Job使用的HDFS用户路径。
    • 修改“user.name”,参数值为提交任务的人机用户名,即为1创建的用户名,例如“user.name=oozieuser”。该参数用于指定提交任务的用户。
    • 如果是多集群环境,执行时需要修改“nameNode”的参数值为对应集群Oozie服务“fs.defaultFS”参数的值,否则保持不变。

    示例如下,主要修改了“resourceManager”、“userName”和“user.name”参数,其他保持默认即可:

    nameNode=hdfs://hacluster
    resourceManager=10.1.130.11:8032
    queueName=default
    examplesRoot=examples
    userName=oozieuser
    user.name=oozieuser
    oozie.use.system.libpath=true
    oozie.wf.application.path=${nameNode}/user/${userName}/${examplesRoot}/apps/sqoop

  7. 修改“workflow.xml”文件。

    • 集群未启用Kerberos认证(普通模式)

      vim workflow.xml

      以MySQL导入Hive举例,需修改的内容示例如下(主要修改了加粗部分):

      <workflow-app xmlns="uri:oozie:workflow:1.0" name="sqoopclient-wf">
          <start to="sqoopclient-node"/>
      
          <action name="sqoopclient-node">
              <sqoopclient xmlns="uri:oozie:sqoopclient-action:1.0">
                  <resource-manager>${resourceManager}</resource-manager>
                  <name-node>${nameNode}</name-node>
                  <prepare>
                      <delete path="${nameNode}/user/${userName}/${examplesRoot}/output-data/sqoopclient"/>
                      <mkdir path="${nameNode}/user/${userName}/${examplesRoot}/output-data"/>
                  </prepare>
                  <configuration>
                      <property>
                          <name>mapred.job.queue.name</name>
                          <value>${queueName}</value>
                      </property>
                  </configuration>
                  <!--   指定具体的Sqoop命令。注意命令最前面不加“sqoop”,不能写为“sqoop import”,数据库密码不能使用单引号或双引号引用 -->
                  <command>import --connect jdbc:mysql://mysql_host_ip:3306/database --username xxx --password xxx --table xxx --hive-import --hive-table xxx --delete-target-dir --fields-terminated-by "," -m 1 --as-textfile</command>
                  <!--   指定使用的HDFS上的配置文件。无特殊情况的话默认可不指定-->
                  <file>/user/oozie/share/lib/sqoopclient/hive-site.xml#hive-site.xml</file> 
              </sqoopclient>
              <ok to="end"/>
              <error to="fail"/>
          </action>
      
          <kill name="fail">
              <message>Sqoop client failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
          </kill>
          <end name="end"/>
      </workflow-app>
    • 集群已启用Kerberos认证(安全模式)

      cp workflow.xml.security workflow.xml

      vim workflow.xml

      以MySQL导入Hive举例,需修改的内容示例如下(主要修改了加粗部分):
      <workflow-app xmlns="uri:oozie:workflow:1.0" name="sqoopclient-wf">
          <credentials>
            <credential name='hcat_auth' type='hcat'>
               <property>
                  <name>hcat.metastore.uri</name>
                  <!--  该配置的值可通过hive-site.xml的配置hive.metastore.uris获取。例如可在“客户端安装目录/Hive/config/hive-site.xml”中获取-->
                  <value>thrift://172.19.xxx.xxx:9083,thrift://172.xxx.xxx.xxx:9083</value>
               </property>
               <property>
                  <name>hcat.metastore.principal</name>
                  <!--  该配置的值可通过hive-site.xml的配置hive.metastore.kerberos.principal获取。例如可在“客户端安装目录/Hive/config/hive-site.xml”中获取-->
                  <value>hive/hadoop.xxx.com@XXX_XXX_XXX_XXX_XXX.COM</value>
               </property>
            </credential>
          </credentials>
      
          <start to="sqoopclient-node"/>
      
          <action name="sqoopclient-node" cred='hcat_auth'>
              <sqoopclient xmlns="uri:oozie:sqoopclient-action:1.0">
                  <resource-manager>${resourceManager}</resource-manager>
                  <name-node>${nameNode}</name-node>
                  <prepare>
                      <delete path="${nameNode}/user/${userName}/${examplesRoot}/output-data/sqoopclient"/>
                      <mkdir path="${nameNode}/user/${userName}/${examplesRoot}/output-data"/>
                  </prepare>
                  <configuration>
                      <property>
                          <name>mapred.job.queue.name</name>
                          <value>${queueName}</value>
                      </property>
                  </configuration>
                  <!--   指定具体的Sqoop命令。注意命令最前面不加“sqoop”,不能写为“sqoop import”,数据库密码不能使用单引号或双引号引用 -->
                  <command>import --connect jdbc:mysql://mysql_host_ip:3306/database --username xxx --password xxx --table xxx --hive-import --hive-table xxx --delete-target-dir --fields-terminated-by "," -m 1 --as-textfile</command>
                  <!--   指定使用的HDFS上的配置文件。无特殊情况的话默认可不指定-->
                  <file>/user/oozie/share/lib/sqoopclient/hive-site.xml#hive-site.xml</file> 
              </sqoopclient>
              <ok to="end"/>
              <error to="fail"/>
          </action>
      
          <kill name="fail">
              <message>Sqoop client failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
          </kill>
          <end name="end"/>
      </workflow-app>

  8. 将“workflow.xml”文件上传至“job.properties” 文件中“oozie.wf.application.path”参数配置的HDFS路径下,例如:

    hadoop fs -put -f workflow.xml /user/oozieuser/examples/apps/sqoopclient

    • 如果路径不存在,需执行以下命令先创建路径:

      hadoop fs -mkdir -p /user/oozieuser/examples/apps/sqoopclient

    • 后续每次在客户端本地修改“workflow.xml”后,执行oozie job命令前,都需要先将“workflow.xml”重新上传到HDFS中。

  9. 执行oozie job命令,运行工作流文件。

    oozie job -oozie https://oozie实例的主机IP:端口号/oozie/ -config job.properties -run

    • 命令参数解释如下:
      • -oozie:实际执行Sqoop任务的Oozie服务器的URL。
      • -config:工作流属性文件。
      • -run:运行工作流。
    • 执行完工作流文件,显示job id表示提交成功,例如:
      job: 0000021-140222101051722-oozie-omm-W

      可登录Oozie管理页面,查看运行情况:

      使用oozieuser用户,登录Oozie WebUI页面:https://oozie角色的ip地址:21003/oozie 。

      Oozie的WebUI界面中,可在页面表格根据job id查看已提交的工作流信息。