前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oozie分布式任务的工作流——Sqoop篇

Oozie分布式任务的工作流——Sqoop篇

作者头像
用户1154259
发布2018-01-17 11:24:16
9700
发布2018-01-17 11:24:16
举报

Sqoop的使用应该是Oozie里面最常用的了,因为很多BI数据分析都是基于业务数据库来做的,因此需要把mysql或者oracle的数据导入到hdfs中再利用mapreduce或者spark进行ETL,生成报表信息。

因此本篇的Sqoop Action其实就是运行一个sqoop的任务而已。

同样action会等到sqoop执行成功后,才会执行下一个action。为了运行sqoop action,需要提供job-tracker,name-node,command或者arg元素。

sqoop action也可以在开启任务前去创建或者删除hdfs中的目录。

sqoop action的配置可以通过job-xml指定文件进行配置,也可以直接在configuration元素中配置。

语法规则

代码语言:javascript
复制
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    ...
    <action name="[NODE-NAME]">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <prepare>
               <delete path="[PATH]"/>
               ...
               <mkdir path="[PATH]"/>
               ...
            </prepare>
            <configuration>
                <property>
                    <name>[PROPERTY-NAME]</name>
                    <value>[PROPERTY-VALUE]</value>
                </property>
                ...
            </configuration>
            <command>[SQOOP-COMMAND]</command>
            <arg>[SQOOP-ARGUMENT]</arg>
            ...
            <file>[FILE-PATH]</file>
            ...
            <archive>[FILE-PATH]</archive>
            ...
        </sqoop>
        <ok to="[NODE-NAME]"/>
        <error to="[NODE-NAME]"/>
    </action>
    ...
</workflow-app>
  • prepare元素,用于创建或者删除指定的hdfs目录。
  • job-xml可以指定sqoop action的参数配置
  • confuguration用于配置sqoop任务

sqoop command

sqoop命令可以通过command和arg标签组成。

当使用command元素时,oozie将会按照空格切分命令,作为参数。因此当你使用query的时候,就不能用command了!

当使用arg的时候,每个arg都是一个参数。

所有的参数部分,都可以使用EL表达式。

例子

基于command的例子
代码语言:javascript
复制
<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <action name="myfirsthivejob">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <prepare>
                <delete path="${jobOutput}"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.compress.map.output</name>
                    <value>true</value>
                </property>
            </configuration>
            <command>import  --connect jdbc:hsqldb:file:db.hsqldb --table TT --target-dir hdfs://localhost:8020/user/tucu/foo -m 1</command>
        </sqoop>
        <ok to="myotherjob"/>
        <error to="errorcleanup"/>
    </action>
    ...
</workflow-app>
基于arg元素的例子
代码语言:javascript
复制
<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <action name="myfirsthivejob">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <prepare>
                <delete path="${jobOutput}"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.compress.map.output</name>
                    <value>true</value>
                </property>
            </configuration>
            <arg>import</arg>
            <arg>--connect</arg>
            <arg>jdbc:hsqldb:file:db.hsqldb</arg>
            <arg>--table</arg>
            <arg>TT</arg>
            <arg>--target-dir</arg>
            <arg>hdfs://localhost:8020/user/tucu/foo</arg>
            <arg>-m</arg>
            <arg>1</arg>
        </sqoop>
        <ok to="myotherjob"/>
        <error to="errorcleanup"/>
    </action>
    ...
</workflow-app>

遇到的问题

经常会遇到这种问题:直接使用sqoop可以执行,但是在oozie中就无法执行了。这个时候可以按照下面的思路进行排查:

  • 1 oozie中的lib是否与sqoop相同。对比sqoop/lib以及oozie/lib/xxx/sqoop就可以了
  • 2 oozie中如果是以arg这种方式启动。那么问题很有可能出在query的别名以及split-by参数上.... 因为在sqoop中可以自动推断,但是在oozie中就无法知道字段所属的表了。
举个例子
代码语言:javascript
复制
sqoop --import .... --query "select a.*,b.* from t1 a left join t2 b on a.id=b.id..." --split-by id ...

这个时候oozie里面,无法知道id到底是哪个表的。需要指定它的别名才可以

代码语言:javascript
复制
...
<arg>--split-by</arg>
<arg>a.id</arg>
...
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法规则
  • sqoop command
  • 例子
    • 基于command的例子
      • 基于arg元素的例子
      • 遇到的问题
        • 举个例子
        相关产品与服务
        腾讯云 BI
        腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档