• Sqoop快速入门


    1 Sqoop概述

    传统的应用程序管理系统,即应用程序与使用RDBMS的关系数据库的交互,是产生大数据的来源之一。由RDBMS生成的这种大数据存储在关系数据库结构中的关系数据库服务器中。

    当大数据存储和Hadoop生态系统的MapReduce,Hive,HBase,Cassandra,Pig等分析器出现时,他们需要一种工具来与关系数据库服务器进行交互,以导入和导出驻留在其中的大数据。在这里,Sqoop在Hadoop生态系统中占据一席之地,以便在关系数据库服务器和Hadoop的HDFS之间提供可行的交互。

    Sqoop - “SQL到Hadoop和Hadoop到SQL”

    Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。它由Apache软件基金会提供。

    Sqoop如何工作?

    下图描述了Sqoop的工作流程。

    Sqoop导入

    导入工具从RDBMS向HDFS导入单独的表。表中的每一行都被视为HDFS中的记录。所有记录都以文本文件的形式存储在文本文件中或作为Avro和Sequence文件中的二进制数据存储。

    Sqoop导出

    导出工具将一组文件从HDFS导出回RDBMS。给Sqoop输入的文件包含记录,这些记录在表中被称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。

    2 Sqoop安装

    由于Sqoop是Hadoop的子项目,因此它只能在Linux操作系统上运行。按照以下步骤在您的系统上安装Sqoop。

    1 安装java

    2 安装Hadoop

    3 下载Sqoop

    我们可以从以下链接下载最新版本的Sqoop 对于本教程,我们使用1.4.5版本,即sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar.gz。

    4 安装Sqoop

    以下命令用于提取Sqoop tar球并将其移至“/ usr / lib / sqoop”目录。

    $tar -xvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz
    $ su
    password:
    # mv sqoop-1.4.4.bin__hadoop-2.0.4-alpha /usr/lib/sqoop
    #exit

    5  配置bashrc

    您必须通过在〜/ .bashrc文件中添加以下行来设置Sqoop环境-

    1.  
      #Sqoop
    2.  
      export SQOOP_HOME=/usr/lib/sqoop export PATH=$PATH:$SQOOP_HOME/bin

    以下命令用于执行〜/ .bashrc文件。

    $ source ~/.bashrc

    6  配置Sqoop

    为了用Hadoop配置Sqoop,你需要编辑sqoop-env.sh文件,该文件被放置在$ SQOOP_HOME / conf目录目录。首先,重定向到Sqoop config目录并使用以下命令复制模板文件 -

    1.  
      $ cd $SQOOP_HOME/conf
    2.  
      $ mv sqoop-env-template.sh sqoop-env.sh

    打开sqoop-env.sh并编辑以下行 -

    1.  
      export HADOOP_COMMON_HOME=/usr/local/hadoop
    2.  
      export HADOOP_MAPRED_HOME=/usr/local/hadoop

    7 下载并配置mysql-connector-java

    我们可以从以下链接下载mysql-connector-java-5.1.30.tar.gz文件。

    以下命令用于提取mysql-connector-java tarball并将mysql-connector-java-5.1.30-bin.jar移动到/ usr / lib / sqoop / lib目录。 

    1.  
      $ tar -zxf mysql-connector-java-5.1.30.tar.gz
    2.  
      $ su
    3.  
      password:
    4.  
       
    5.  
      # cd mysql-connector-java-5.1.30
    6.  
      # mv mysql-connector-java-5.1.30-bin.jar /usr/lib/sqoop/lib

    8  验证Sqoop

    以下命令用于验证Sqoop版本。

    1.  
      $ cd $SQOOP_HOME/bin
    2.  
      $ sqoop-version

    输出 -

    1.  
      14/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
    2.  
      Sqoop 1.4.5 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
    3.  
      Compiled by abe on Fri Aug 1 11:19:26 PDT 2014

    Sqoop安装完成。

    3 Sqoop Import

    本章介绍如何将数据从MySQL数据库导入到Hadoop HDFS。“导入工具”从RDBMS将单个表导入HDFS。表中的每一行都被视为HDFS中的记录。所有记录均以文本数据的形式存储在文本文件中,或作为Avro和Sequence文件中的二进制数据存储。

    语法

    以下语法用于将数据导入HDFS。

    1.  
      $ sqoop import (generic-args) (import-args)
    2.  
      $ sqoop-import (generic-args) (import-args)

    让我们举一个名为emp,emp_add和emp_contact的三个表的示例,这些表位于MySQL数据库服务器中名为userdb的数据库中。

    这三张表格及其数据如下。

    EMP:

    idnamedegsalarydept
    1201 gopal manager 50,000 TP
    1202 manisha Proof reader 50,000 TP
    1203 khalil php dev 30,000 AC
    1204 prasanth php dev 30,000 AC
    1204 kranthi admin 20,000 TP

    emp_add:

    idhnostreetcity
    1201 288A vgiri jublee
    1202 108I aoc sec-bad
    1203 144Z pgutta hyd
    1204 78B old city sec-bad
    1205 720X hitec sec-bad

    emp_contact:

    idphnoemail
    1201 2356742 gopal@tp.com
    1202 1661663 manisha@tp.com
    1203 8887776 khalil@ac.com
    1204 9988774 prasanth@ac.com
    1205 1231231 kranthi@tp.com

    导入表格

    Sqoop工具“导入”用于将表格数据从表格导入到Hadoop文件系统,作为文本文件或二进制文件。

    以下命令用于将emp表从MySQL数据库服务器导入到HDFS。

    $ sqoop import 
    --connect jdbc:mysql://localhost/userdb 
    --username root 
    --table emp --m 1

    如果它成功执行,则会得到以下输出。

    14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
    14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
    14/12/22 15:24:56 INFO tool.CodeGenTool: Beginning code generation
    14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: 
       SELECT t.* FROM `emp` AS t LIMIT 1
    14/12/22 15:24:58 INFO manager.SqlManager: Executing SQL statement: 
       SELECT t.* FROM `emp` AS t LIMIT 1
    14/12/22 15:24:58 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
    14/12/22 15:25:11 INFO orm.CompilationManager: Writing jar file: 
       /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
    -----------------------------------------------------
    -----------------------------------------------------
    14/12/22 15:25:40 INFO mapreduce.Job: The url to track the job: 
       http://localhost:8088/proxy/application_1419242001831_0001/
    14/12/22 15:26:45 INFO mapreduce.Job: Job job_1419242001831_0001 running in uber mode : 
       false
    14/12/22 15:26:45 INFO mapreduce.Job: map 0% reduce 0%
    14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%
    14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully
    -----------------------------------------------------
    -----------------------------------------------------
    14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds 
       (0.8165 bytes/sec)
    14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.
    

    要在HDFS中验证导入的数据,请使用以下命令。

    $ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*

    它向您显示emp表数据和字段用逗号(,)分隔。

    1201, gopal,    manager, 50000, TP
    1202, manisha,  preader, 50000, TP
    1203, kalil,    php dev, 30000, AC
    1204, prasanth, php dev, 30000, AC
    1205, kranthi,  admin,   20000, TP

    导入目标目录

    我们可以在使用Sqoop导入工具将表格数据导入HDFS时指定目标目录。

    以下是将目标目录指定为Sqoop导入命令的选项的语法。

    --target-dir <new or exist directory in HDFS>

    以下命令用于将emp_add表数据导入到'/ queryresult'目录中。

    $ sqoop import 
    --connect jdbc:mysql://localhost/userdb 
    --username root 
    --table emp_add 
    --m 1 
    --target-dir /queryresult

    以下命令用于在/ queryresult目录形式的emp_add表中验证导入的数据。

    $ $HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*

    它将显示带逗号(,)分隔字段的emp_add表数据。

    1201, 288A, vgiri,   jublee
    1202, 108I, aoc,     sec-bad
    1203, 144Z, pgutta,  hyd
    1204, 78B,  oldcity, sec-bad
    1205, 720C, hitech,  sec-bad
    

    表中的数据导入子集

    我们可以使用Sqoop导入工具中的'where'子句导入表的一个子集。它在相应的数据库服务器中执行相应的SQL查询,并将结果存储在HDFS中的目标目录中。

    where子句的语法如下。

    --where <condition>

    以下命令用于导入emp_add表数据的子集。子集查询将检索居住在塞康德拉巴德市的员工ID和地址。

    $ sqoop import 
    --connect jdbc:mysql://localhost/userdb 
    --username root 
    --table emp_add 
    --m 1 
    --where city =’sec-bad’” 
    --target-dir /wherequery

    以下命令用于从emp_add表中验证/ wherequery目录中的导入数据。

    $ $HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-*

    它将显示带逗号(,)分隔字段的emp_add表数据。

    1202, 108I, aoc,     sec-bad
    1204, 78B,  oldcity, sec-bad
    1205, 720C, hitech,  sec-bad
    

    增量导入

    增量导入是一种仅导入表中新添加的行的技术。需要添加'incremental','check-column'和'last-value'选项来执行增量导入。

    以下语法用于Sqoop导入命令中的增量选项。

    --incremental <mode>
    --check-column <column name>
    --last value <last check column value>

    让我们假设新添加到emp表中的数据如下 -

    1206, satish p, grp des, 20000, GR
    

    以下命令用于在emp表中执行增量导入。

    $ sqoop import 
    --connect jdbc:mysql://localhost/userdb 
    --username root 
    --table emp 
    --m 1 
    --incremental append 
    --check-column id 
    -last value 1205

    以下命令用于验证从emp表导入的数据到HDFS emp /目录。

    $ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*

    它以逗号(,)分隔字段向您显示emp表格数据。

    1201, gopal,    manager, 50000, TP
    1202, manisha,  preader, 50000, TP
    1203, kalil,    php dev, 30000, AC
    1204, prasanth, php dev, 30000, AC
    1205, kranthi,  admin,   20000, TP
    1206, satish p, grp des, 20000, GR
    

    以下命令用于查看emp表中已修改或新添加的行。

    $ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1

    它以逗号(,)分隔的字段向您显示emp表中新添加的行。

    1206, satish p, grp des, 20000, GR

    4 导入所有表格

    本章介绍如何将所有表从RDBMS数据库服务器导入到HDFS。每个表格数据存储在一个单独的目录中,并且目录名称与表格名称相同。

    语法

    以下语法用于导入所有表。

    $ sqoop import-all-tables (generic-args) (import-args) 
    $ sqoop-import-all-tables (generic-args) (import-args)

    让我们举一个从userdb数据库导入所有表的例子。数据库userdb包含的表的列表如下所示。

     +--------------------+
     |      Tables        |
     +--------------------+
     |      emp           |
     |      emp_add       |
     |      emp_contact   |
     +--------------------+
    

    以下命令用于从userdb数据库中导入所有表。

    $ sqoop import-all-tables 
    --connect jdbc:mysql://localhost/userdb 
    --username root
    

    注 - 如果使用的是全部导入表,则该数据库中的每个表都必须具有主键字段。

    以下命令用于验证HDFS中的所有表数据到userdb数据库。

    $ $HADOOP_HOME/bin/hadoop fs -ls
    

    它将向您显示userdb数据库中的表名称列表作为目录。

    输出

    drwxr-xr-x - hadoop supergroup 0 2014-12-22 22:50 _sqoop
    drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:46 emp
    drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:50 emp_add
    drwxr-xr-x - hadoop supergroup 0 2014-12-23 01:52 emp_contact

    5 导出

    本章介绍如何将数据从HDFS导出回RDBMS数据库。目标表必须存在于目标数据库中。输入给Sqoop的文件包含记录,这些记录在表中称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。

    缺省操作是使用INSERT语句将输入文件中的所有记录插入到数据库表中。在更新模式下,Sqoop生成将现有记录替换到数据库中的UPDATE语句。

    语法

    以下是导出命令的语法。

    $ sqoop export (generic-args) (export-args) 
    $ sqoop-export (generic-args) (export-args)
    

    让我们以HDFS中的文件中的员工数据为例。雇员数据在HDFS的'emp /'目录中的emp_data文件中可用。该emp_data如下。

    1201, gopal,     manager, 50000, TP
    1202, manisha,   preader, 50000, TP
    1203, kalil,     php dev, 30000, AC
    1204, prasanth,  php dev, 30000, AC
    1205, kranthi,   admin,   20000, TP
    1206, satish p,  grp des, 20000, GR
    

    必须手动创建要导出的表,并将其导出到数据库中。

    以下查询用于在mysql命令行中创建表'employee'。

    $ mysql
    mysql> USE db;
    mysql> CREATE TABLE employee ( 
       id INT NOT NULL PRIMARY KEY, 
       name VARCHAR(20), 
       deg VARCHAR(20),
       salary INT,
       dept VARCHAR(10));
    

    以下命令用于将表数据(位于HDFS上的emp_data文件中)导出到Mysql数据库服务器的db数据库中的employee表中。

    $ sqoop export 
    --connect jdbc:mysql://localhost/db 
    --username root 
    --table employee  
    --export-dir /emp/emp_data
    

    以下命令用于验证mysql命令行中的表。

    mysql>select * from employee;
    

    如果给定数据成功存储,则可以找到给定员工数据的下表。

    +------+--------------+-------------+-------------------+--------+
    | Id   | Name         | Designation | Salary            | Dept   |
    +------+--------------+-------------+-------------------+--------+
    | 1201 | gopal        | manager     | 50000             | TP     |
    | 1202 | manisha      | preader     | 50000             | TP     |
    | 1203 | kalil        | php dev     | 30000             | AC     |
    | 1204 | prasanth     | php dev     | 30000             | AC     |
    | 1205 | kranthi      | admin       | 20000             | TP     |
    | 1206 | satish p     | grp des     | 20000             | GR     |
    +------+--------------+-------------+-------------------+--------+

    6 Job

    本章介绍如何创建和维护Sqoop作业。Sqoop作业创建并保存导入和导出命令。它指定参数来识别和调用保存的作业。这种重新调用或重新执行用于增量导入,它可以将更新的行从RDBMS表导入HDFS。

    语法

    以下是创建Sqoop作业的语法。

    $ sqoop job (generic-args) (job-args)
       [-- [subtool-name] (subtool-args)]
    
    $ sqoop-job (generic-args) (job-args)
       [-- [subtool-name] (subtool-args)]

    创建作业(--create)

    我们在这里创建一个名为myjob的作业,它可以将表数据从RDBMS表导入HDFS。以下命令用于创建将数据从db数据库中的employee表导入到HDFS文件的作业。

    $ sqoop job --create myjob 
    -- import 
    --connect jdbc:mysql://localhost/db 
    --username root 
    --table employee --m 1

    验证作业(--list)

    '--list'参数用于验证保存的作业。以下命令用于验证保存的Sqoop作业列表。

    $ sqoop job --list

    它显示保存的作业列表。

    Available jobs: 
       myjob
    

    检查作业( - 显示)

    '--show'参数用于检查或验证特定作业及其细节。以下命令和示例输出用于验证名为myjob的作业。

    $ sqoop job --show myjob

    它显示了myjob中使用的工具及其选项。

    Job: myjob 
     Tool: import Options:
     ---------------------------- 
     direct.import = true
     codegen.input.delimiters.record = 0
     hdfs.append.dir = false 
     db.table = employee
     ...
     incremental.last.value = 1206
     ...
    

    执行作业(--exec)

    '--exec'选项用于执行保存的作业。以下命令用于执行名为myjob的保存作业。

    $ sqoop job --exec myjob

    它向您显示以下输出。

    10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation 
    ...

    7 Codegen

    本章介绍'codegen'工具的重要性。从面向对象的应用程序的角度来看,每个数据库表都有一个DAO类,它包含用于初始化对象的'getter'和'setter'方法。该工具(-codegen)自动生成DAO类。

    它根据表模式结构在Java中生成DAO类。Java定义被实例化为导入过程的一部分。这个工具的主要用途是检查Java是否丢失了Java代码。如果是这样,它将使用字段之间的默认分隔符创建Java的新版本。

    语法

    以下是Sqoop codegen命令的语法。

    $ sqoop codegen (generic-args) (codegen-args) 
    $ sqoop-codegen (generic-args) (codegen-args)
    

    让我们举一个例子来为userdb数据库中的emp表生成Java代码。

    以下命令用于执行给定示例。

    $ sqoop codegen 
    --connect jdbc:mysql://localhost/userdb 
    --username root  
    --table emp
    

    如果该命令执行成功,则它将在终端上产生以下输出。

    14/12/23 02:34:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
    14/12/23 02:34:41 INFO tool.CodeGenTool: Beginning code generation
    ……………….
    14/12/23 02:34:42 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
    Note: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.java uses or 
       overrides a deprecated API.
    Note: Recompile with -Xlint:deprecation for details.
    
    14/12/23 02:34:47 INFO orm.CompilationManager: Writing jar file: 
       /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.jar
    

    验证

    让我们看看输出。该粗体路径是emp表生成和存储的Java代码的位置。让我们使用以下命令来验证该位置中的文件。

    $ cd /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/
    $ ls
    emp.class
    emp.jar
    emp.java
    

    如果要深入验证,请比较userdb数据库中的emp表和/tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/.目录中的emp.java。

    8 Eval

    本章介绍如何使用Sqoop'eval'工具。它允许用户针对各自的数据库服务器执行用户定义的查询,并在控制台中预览结果。所以,用户可以期望导入结果表数据。使用eval,我们可以评估任何类型的可以是DDL或DML语句的SQL查询。

    语法

    以下语法用于Sqoop eval命令。

    $ sqoop eval (generic-args) (eval-args) 
    $ sqoop-eval (generic-args) (eval-args)
    

    选择查询评估

    使用eval工具,我们可以评估任何类型的SQL查询。让我们举一个在db数据库的employee表中选择有限行的例子。以下命令用于评估使用SQL查询的给定示例。

    $ sqoop eval 
    --connect jdbc:mysql://localhost/db 
    --username root  
    --query “SELECT * FROM employee LIMIT 3”
    

    如果该命令执行成功,则它将在终端上产生以下输出。

    +------+--------------+-------------+-------------------+--------+
    | Id   | Name         | Designation | Salary            | Dept   |
    +------+--------------+-------------+-------------------+--------+
    | 1201 | gopal        | manager     | 50000             | TP     |
    | 1202 | manisha      | preader     | 50000             | TP     |
    | 1203 | khalil       | php dev     | 30000             | AC     |
    +------+--------------+-------------+-------------------+--------+
    

    插入查询评估

    Sqoop评估工具可适用于建模和定义SQL语句。这意味着,我们也可以使用eval来插入语句。以下命令用于在db数据库的employee表中插入新行。

    $ sqoop eval 
    --connect jdbc:mysql://localhost/db 
    --username root  
    -e “INSERT INTO employee VALUES(1207,‘Raju’,‘UI dev’,15000,‘TP’)”
    

    如果该命令成功执行,则会在控制台上显示更新行的状态。

    否则,您可以在MySQL控制台上验证雇员表。以下命令用于使用select'query来验证db数据库的employee表的行。

    mysql>
    mysql> use db;
    mysql> SELECT * FROM employee;
    +------+--------------+-------------+-------------------+--------+
    | Id   | Name         | Designation | Salary            | Dept   |
    +------+--------------+-------------+-------------------+--------+
    | 1201 | gopal        | manager     | 50000             | TP     |
    | 1202 | manisha      | preader     | 50000             | TP     |
    | 1203 | khalil       | php dev     | 30000             | AC     |
    | 1204 | prasanth     | php dev     | 30000             | AC     |
    | 1205 | kranthi      | admin       | 20000             | TP     |
    | 1206 | satish p     | grp des     | 20000             | GR     |
    | 1207 | Raju         | UI dev      | 15000             | TP     |
    +------+--------------+-------------+-------------------+--------+
    

    9 列出数据库和表

    本章介绍如何使用Sqoop列出数据库。Sqoop list-databases工具解析并执行针对数据库服务器的'SHOW DATABASES'查询。此后,它列出了服务器上的当前数据库。

    语法

    以下语法用于Sqoop list-databases命令。

    $ sqoop list-databases (generic-args) (list-databases-args) 
    $ sqoop-list-databases (generic-args) (list-databases-args)
    

    示例查询

    以下命令用于列出MySQL数据库服务器中的所有数据库。

    $ sqoop list-databases 
    --connect jdbc:mysql://localhost/ 
    --username root
    

    如果该命令执行成功,则它将按如下方式显示MySQL数据库服务器中的数据库列表。

    ...
    13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
    
    mysql
    test
    userdb
    db

    本章介绍如何使用Sqoop列出MySQL数据库服务器中特定数据库的表。Sqoop列表表工具解析并执行针对特定数据库的“SHOW TABLES”查询。此后,它列出了数据库中的当前表格。

    语法

    以下语法用于Sqoop list-tables命令。

    $ sqoop list-tables (generic-args) (list-tables-args) 
    $ sqoop-list-tables (generic-args) (list-tables-args)
    

    示例查询

    以下命令用于列出MySQL数据库服务器的userdb数据库中的所有表。

    $ sqoop list-tables 
    --connect jdbc:mysql://localhost/userdb 
    --username root
    

    如果该命令执行成功,则它将按如下方式显示userdb数据库中的表的列表。

    ...
    13/05/31 16:45:58 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
    
    emp
    emp_add
    emp_contact
  • 相关阅读:
    Java虚拟机
    Java集合常见面试题一
    5个新自动化测试框架,你值得了解
    Mock工具介绍
    空降,如何做好管理?
    QA在业务变动中如何维护测试用例?
    接口越权扫描平台初探
    程序员删代码泄愤,被判刑5个月,网友:年轻人不讲武德?!
    哪些 Python 库让你相见恨晚?
    两篇毕业论文致谢同一个女朋友?哈哈哈哈!
  • 原文地址:https://www.cnblogs.com/sea520/p/13558262.html
Copyright © 2020-2023  润新知