文档章节

Sqoop源代码笔记

强子大叔的码田
 强子大叔的码田
发布于 2015/12/25 11:04
字数 862
阅读 286
收藏 1

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

Sqoop分1和2之分,其实本质都差不多,无非就是MR运算。 命令行可参考文章: http://my.oschina.net/zhangliMyOne/blog/97236

为了节省时间,直接上了sqoop1的源码,这样可快速抽取其代码本质,作为后续开发指导之用。

=============================================================

中间比较重要的几个类是:

SqoopTool --- 工具类

SqoopOptions---运行的选项

Sqoop---整合类,也是重点

===最关键的还是Sqoop类,当然是一些具体实现类

先看ToolRunner 源码

package org.apache.hadoop.util;

 

import java.io.PrintStream;

 

import org.apache.hadoop.conf.Configuration;

 

/**

 * A utility to help run {@link Tool}s.

 * 

 * <p><code>ToolRunner</code> can be used to run classes implementing 

 * <code>Tool</code> interface. It works in conjunction with 

 * {@link GenericOptionsParser} to parse the 

 * <a href="{@docRoot}/org/apache/hadoop/util/GenericOptionsParser.html#GenericOptions">

 * generic hadoop command line arguments</a> and modifies the 

 * <code>Configuration</code> of the <code>Tool</code>. The 

 * application-specific options are passed along without being modified.

 * </p>

 * 

 * @see Tool

 * @see GenericOptionsParser

 */

public class ToolRunner {

 

  /**

   * Runs the given <code>Tool</code> by {@link Tool#run(String[])}, after 

   * parsing with the given generic arguments. Uses the given 

   * <code>Configuration</code>, or builds one if null.

   * 

   * Sets the <code>Tool</code>'s configuration with the possibly modified 

   * version of the <code>conf</code>.  

   * 

   * @param conf <code>Configuration</code> for the <code>Tool</code>.

   * @param tool <code>Tool</code> to run.

   * @param args command-line arguments to the tool.

   * @return exit code of the {@link Tool#run(String[])} method.

   */

  public static int run(Configuration conf, Tool tool, String[] args) 

    throws Exception{

    if(conf == null) {

      conf = new Configuration();

    }

    GenericOptionsParser parser = new GenericOptionsParser(conf, args);

    //set the configuration back, so that Tool can configure itself

    tool.setConf(conf);

    

    //get the args w/o generic hadoop args

    String[] toolArgs = parser.getRemainingArgs();

    return tool.run(toolArgs);

  }

  

  /**

   * Runs the <code>Tool</code> with its <code>Configuration</code>.

   * 

   * Equivalent to <code>run(tool.getConf(), tool, args)</code>.

   * 

   * @param tool <code>Tool</code> to run.

   * @param args command-line arguments to the tool.

   * @return exit code of the {@link Tool#run(String[])} method.

   */

  public static int run(Tool tool, String[] args) 

    throws Exception{

    return run(tool.getConf(), tool, args);

  }

  

  /**

   * Prints generic command-line argurments and usage information.

   * 

   *  @param out stream to write usage information to.

   */

  public static void printGenericCommandUsage(PrintStream out) {

    GenericOptionsParser.printGenericCommandUsage(out);

  }

  

}

所以具体就看实现类的run方法

==============================================================================

 

@Override

  /**

   * Actual main entry-point for the program  表明是具体入口点

   */

  public int run(String [] args) {

    if (options.getConf() == null) {

      // Configuration wasn't initialized until after the ToolRunner

      // got us to this point. ToolRunner gave Sqoop itself a Conf

      // though.

      options.setConf(getConf());

    }

 

    try {

      options = tool.parseArguments(argsnulloptionsfalse);

      tool.appendArgs(this.childPrgmArgs);

      tool.validateOptions(options);

    } catch (Exception e) {

      // Couldn't parse arguments.

      // Log the stack trace for this exception

      LOG.debug(e.getMessage(), e);

      // Print exception message.

      System.err.println(e.getMessage());

      // Print the tool usage message and exit.

      ToolOptions toolOpts = new ToolOptions();

      tool.configureOptions(toolOpts);

      tool.printHelp(toolOpts);

      return 1; // Exit on exception here.

    }

 

    return tool.run(options);

  }

 所以最后还是落到tool.run执行。

------------------------------------------------核心代码如下:org.apache.sqoop.mapreduce.ImportJobBase

/**

   * Run an import job to read a table in to HDFS.

   *

   * @param tableName  the database table to read; may be null if a free-form

   * query is specified in the SqoopOptions, and the ImportJobBase subclass

   * supports free-form queries.

   * @param ormJarFile the Jar file to insert into the dcache classpath.

   * (may be null)

   * @param splitByCol the column of the database table to use to split

   * the import

   * @param conf A fresh Hadoop Configuration to use to build an MR job.

   * @throws IOException if the job encountered an IO problem

   * @throws ImportException if the job failed unexpectedly or was

   * misconfigured.

   */

  public void runImport(String tableName, String ormJarFile, String splitByCol,

      Configuration confthrows IOException, ImportException {

 

    if (null != tableName) {

      LOG.info("Beginning import of " + tableName);

    } else {

      LOG.info("Beginning query import.");

    }

 

    String tableClassName =

        new TableClassName(options).getClassForTable(tableName);

    loadJars(conformJarFiletableClassName);

 

    try {

      Job job = new Job(conf);

 

      // Set the external jar to use for the job.

      job.getConfiguration().set("mapred.jar"ormJarFile);

 

      configureInputFormat(jobtableNametableClassNamesplitByCol);

      configureOutputFormat(jobtableNametableClassName);

      configureMapper(jobtableNametableClassName);

      configureNumTasks(job);

      cacheJars(job, getContext().getConnManager());

 

      jobSetup(job);

      setJob(job);

      boolean success = runJob(job);//提交运行

      if (!success) {

        throw new ImportException("Import job failed!");

      }

    } catch (InterruptedException ie) {

      throw new IOException(ie);

    } catch (ClassNotFoundException cnfe) {

      throw new IOException(cnfe);

    } finally {

      unloadJars();

    }

  }

 

=========运行前,抽取了job的一些重要属性如下:

后续重点分析这几个类就可以了。


 


© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 923
博文 1630
码字总数 1283214
作品 9
南京
架构师
私信 提问
加载中

评论(0)

Sqoop-1.4.6 Merge源码分析与改造使其支持多个merge-key

  Sqoop中提供了一个用于合并数据集的工具。官方文档中的描述可以参考我的另一篇博客Sqoop-1.4.5用户手册。   Merge的基本原理是,需要指定新数据集和老数据集的路径,根据某个merge-key...

dabokele
03/31
0
0
Flume+Sqoop+Azkaban笔记

大纲(辅助系统) 离线辅助系统 数据接入 Flume介绍 Flume组件 Flume实战案例 任务调度 调度器基础 市面上调度工具 Oozie的使用 Oozie的流程定义详解 数据导出 sqoop基础知识 sqoop实战及原理...

osc_k6lb5e4x
2019/04/09
5
0
学习笔记:从0开始学习大数据-40.sqoop1的安装

前面安装的是sqoop2(sqoop1.99.5),可以正常使用,但还是问题多多,因下一节的综合实训要用到sqoop1,就同时安装了一个。 其实,sqoop1的安装特别简单 yum install sqoop ================...

领尚
03/31
0
0
059 使用脚本做一次案例分析(不包括数据的收集)

1.日志样本 27.19.74.143 - - [30/May/2013:17:38:20 +0800] "GET /static/image/common/faq.gif HTTP/1.1" 200 1127110.52.250.126 - - [30/May/2013:17:38:20 +0800] "GET /data/cache/sty......

osc_9ajwkns1
2018/04/21
4
0
Sqoop1和Sqoop2简介

主要来源: http://www.linuxidc.com/Linux/2014-10/108337.htm 1.什么是Sqoop Sqoop即 SQL to Hadoop ,是一款方便的在传统型数据库与Hadoop之间进行数据迁移的工具,充分利用MapReduce并行特...

强子大叔的码田
2015/12/23
1.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

【视频】工业互联网在线交流现状、发展、怎么建和规划

PPT介绍目录: 工业互联网的现状 平台介绍 技术路线 人力资源 现实问题 成本中心 工业互联网的发展 两大推动引擎 用户需求的改变 片面与极端 由点到面,点面结合 突破点 现实路径 落脚点 工业...

osc_3ubrwgtm
11分钟前
15
0
单臂-Etrunk-三层交换-路由-DHCP中继-NAT-HTTP服务 实验题

单臂-Etrunk-三层交换-路由-DHCP中继-NAT-HTTP服务 实验题 实验环境 需求描述 pc1、pc2、pc3、pc4可以ping通 虚拟机可以打开网页 了解dhcp中继 了解网络地址转换技术NAT 了解access口跟trunk...

osc_h7zc4umy
12分钟前
24
0
医院防勒索病毒灾备解决方案

医院成勒索病毒重灾区 上述某妇幼保健院并非是个例。近年来,针对医院等医疗系统的网络安全风险一直处于活跃状态且呈现持续上升的态势。医院的业务系统及医学记录、病患资料、预约信息等大量...

osc_gh0ost1g
13分钟前
18
0
2招带你快速获取响应头与发送头

今天带大家用两招快速获取响应头以及发送头。 1、获取请求头 想要获取请求头,就需要会用抓包工具,目前比较普遍的就是fiddler。大家可以在百度搜索下载。首先我们打开fiddler 你会发现左侧这...

osc_3g4j2ghj
15分钟前
9
0
Python Django 数据库基础

对数据库的操作可以直接使用SQL语句,也可以使用图形界面工具。这些一般是DBA(数据库管理人员)做的。开发人员是使用代码链接数据库,对数据库进行操作。 下面进行Python Django框架ORM创建...

osc_itgved4p
17分钟前
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部