Sqoop数据抽取-待续

来源:互联网 发布:广州站西钟表城淘宝店 编辑:程序博客网 时间:2024/05/13 10:26

Sqoop主要用于在HDFS、关系型数据库之间传递数据,可以将关系型数据库数据导入到HDFS,也可以将HDFS数据导出到关系数据库。本文主要讲解一下使用sqoop进行单库单表以及分库分表数据的抽取方法。

  • 直接抽取hdfs数据并实现增量
    在实际开发项目中有时候需要直接使用hdfs上已有的数据而且是需要增量抽取,本文例子均是在oozie中调用相关的hadoop组件实现不同的功能,举例代码如下:
<action name="sqoop_import_orders">        <map-reduce>            <job-tracker>${jobTracker}</job-tracker>            <name-node>${nameNode}</name-node>            <prepare>                <delete path=""/>            </prepare>            <job-xml>${commonPath}/mr-job.xml</job-xml>            <configuration>                <property>                    <name>mapred.job.queue.name</name>                    <value>${queueName}</value>                </property>                <property>                    <name>com.jd.ebsdi.mapreduce.workflow.name</name>                    <value>${wf:name()}</value>                </property>                <property>                    <name>com.jd.ebsdi.mapreduce.batchnum</name>                    <value></value>                </property>                <property>                    <name>mapreduce.map.class</name>                    <value>map class</value>                </property>                <property>                    <name>mapred.reduce.tasks</name>                    <value>0</value>                </property>                <property>                    <name>mapred.output.value.class</name>                    <value>org.apache.hadoop.io.Text</value>                </property>                <property>                    <name>mapreduce.outputformat.class</name>                    <value>org.apache.hadoop.mapreduce.lib.output.TextOutputFormat</value>                </property>                <property>                    <name>mapred.input.dir</name>                    <value>需要增量抽取的hdfs目录</value>                </property>                <property>                    <name>mapred.output.dir</name>                    <value>输出目录</value>                </property>                <property>                    <name>com.jd.ebsdi.import.data.rows</name>                    <value>解析数据用的datarow</value>                </property>                <property>                    <name>mapred.input.pathFilter.class</name>                    <value>InputPathFilter--目录文件过滤器</value>                </property>                <property>                    <name>com.jd.ebsdi.core.mapreduce.input.starttime</name>                    <value>抽取的开始时间startTime</value>                </property>                <property>                    <name>com.jd.ebsdi.core.mapreduce.input.endtime</name>                    <value>抽取的截止时间,一般是最新的更新时间</value>                </property>             </configuration>        </map-reduce>        <ok to="end"/>        <error to="kill"/>    </action>

说一下InputPathFilter用来实现根据开始、结束时间过滤本次需要抽取的文件,其实很简单,主要实现accept方法,然后根据文件的更新时间判断即可,主要代码如下:

@Overridepublic boolean accept(Path path) {    FileSystem fs = path.getFileSystem(conf);    long modifiedTime = fs.getFileStatus(path).getModificationTime();    if (modifiedTime > startTime && modifiedTime <= endTime) {        return true;    }}
  • 单库单表数据抽取
    主要使用oozie调用sqoop然后传入数据库连接信息及查询sql即可。
<action name="sqoop_import_subdepot">        <sqoop xmlns="uri:oozie:sqoop-action:0.2">            <job-tracker>${jobTracker}</job-tracker>            <name-node>${nameNode}</name-node>            <prepare>                <delete path="" />            </prepare>            <configuration>                <property>                    <name>mapred.job.queue.name</name>                    <value>${queueName}</value>                </property>            </configuration>            <arg>import</arg>            <arg>--connect</arg>            <arg>数据库连接url</arg>            <arg>--username</arg>            <arg>用户名</arg>            <arg>--password</arg>            <arg>密码</arg>            <arg>--query</arg>            <arg><![CDATA[查询sql]]></arg>            <arg>--split-by</arg>            <arg>一般为主键ID,主要用来划分多个map任务</arg>            <arg>--fields-terminated-by</arg>            <arg>\001</arg>--列分隔符            <arg>--lines-terminated-by</arg>            <arg>\002</arg>--行分隔符            <arg>--null-string</arg>            <arg></arg>            <arg>--null-non-string</arg>            <arg></arg>            <arg>-m</arg>            <arg>4</arg>--抽取数据划分的map任务个数            <arg>--target-dir</arg>            <arg>输出的hdfs目录</arg>        </sqoop>
  • 分库分表数据抽取
0 0
原创粉丝点击