• Sqoop 学习(一)


    一,概述

    二,工作机制

    三,sqoop安装和使用

      3.1 前提环境

      3.2 文件下载

      3.3 配置文件修改

      3.4 添加mysql的jdbc驱动包

      3.5 验证启动

    四,sqoop的数据导入

      4.1 语法

      4.2 示例

        4.2.1 导入表数据到HDFS

        4.2.2 导入到HDFS指定目录

        4.2.3 导入关系表到HIVE

        4.2.4 导入表数据子集

        4.2.5 增量导入

    五,sqoop的数据导出

     

     

     

    正文

    一,概述

    sqoopapache旗下一款Hadoop和关系数据库服务器之间传送数据”的工具。

      导入数据MySQLOracle导入数据到HadoopHDFSHIVEHBASE等数据存储系统;

      导出数据:Hadoop的文件系统中导出数据到关系数据库mysql等。如下图所示:

      

    二,工作机制

      将导入或导出命令翻译成mapreduce程序来实现在翻译出的mapreduce中主要是对inputformatoutputformat进行定制。

    三,sqoop安装和使用

      3.1 前提环境

      安装sqoop的前提是已经具备javahadoop的环境,所以在安装前请先安装jdk和hadoop.

      3.2 文件下载和解压

      下载地址:点击下载

      下载完毕后解压。

      3.3 配置文件修改

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

      打开sqoop-env.sh文件:配置hadoop文件目录,这个结合自己的工作目录配置。

    export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.1/ 
    export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.1/
    export HIVE_HOME=/home/hadoop/apps/hive-1.2.1

      3.4 添加mysql的jdbc驱动包

      将mysql-connect去jdbc驱动包添加到sqoop的lib目录:

    cp  ~/app/hive/lib/mysql-connector-java-5.1.28.jar   $SQOOP_HOME/lib/

      3.5 验证启动

    $ cd $SQOOP_HOME/bin
    $ sqoop-version

      预期输出:

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

      到这里,整个Sqoop安装工作完成。

    四,sqoop的数据导入

      “导入工具导入单个表从RDBMSHDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据或者Avrosequence文件二进制数据) 

      4.1 语句

      下面的语法用于将数据导入HDFS

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

      4.2 示例

      表数据:

      在mysql中有一个库userdb中三个表:emp, emp_addemp_conn

      表emp:

    id

    name

    deg

    salary

    dept

    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

    1205

    kranthi

    admin

    20,000

    TP

      表emp_add:

    id

    hno

    street

    city

    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_conn:

    id

    phno

    email

    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


      4.2.1 导入表
    数据到HDFS

      下面的命令用于从MySQL数据库服务器中的emp表导入HDFS:

    bin/sqoop import   
    --connect jdbc:mysql://hdp-node-01:3306/test   
    --username root  
    --password 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.
    INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
    -----------------------------------------------------
    O 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 /user/hadoop/emp/part-m-00000

      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

      4.2.2 导入到HDFS指定目录

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

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

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

      下面的命令是用来导入emp_add表数据到'/queryresult'目录

    bin/sqoop import 
    --connect jdbc:mysql://hdp-node-01:3306/test 
    --username root 
    --password root 
    --target-dir /queryresult 
    --fields-terminated-by ‘001--table emp 
    --split-by id
    --m 1

      注意:

    注意:如果报错,说emp类找不到,则可以手动从sqoop生成的编译目录(/tmp/sqoop-root/compile)中,找到这个emp.class和emp.jar,拷贝到sqoop的lib目录下:
    
    如果设置了 --m 1,则意味着只会启动一个maptask执行数据导入
    如果不设置 --m 1,则默认为启动4个map task执行数据导入,则需要指定一个列来作为划分map task任务的依据

      下面的命令是用来验证 /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

      4.2.3 导入关系表到HIVE

    bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root 
    --password root --table emp --hive-import --split-by id --m 1

      4.2.4 导入表数据子集

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

      where子句的语法如下:

    --where <condition>

      下面的命令用来导入emp_add表数据的子集。子集查询检索员工ID和地址,居住城市为:Secunderabad

    bin/sqoop import 
    --connect jdbc:mysql://hdp-node-01:3306/test 
    --username root 
    --password root 
    --where "city ='sec-bad'" 
    --target-dir /wherequery 
    --table emp_add 
     --m 1

      按需导入:

    bin/sqoop import 
    --connect jdbc:mysql://hdp-node-01:3306/test 
    --username root 
    --password root 
    --target-dir /wherequery2 
    --query 'select id,name,deg from emp WHERE id>1207 and $CONDITIONS' 
    --split-by id 
    --fields-terminated-by '	' 
    --m 2

      下面的命令用来验证数据从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

      4.2.5 增量导入

      增量导入是仅导入新添加的表中的行的技术。

      sqoop支持两种增量MySql导入到hive的模式,

        一种是append,即通过指定一个递增的列,比如:

        --incremental append  --check-column num_id --last-value 0

      另种是可以根据时间戳,比如:

        --incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'

      就是只导入created '2012-02-01 11:0:00'更大的数据。

      1/ append模式

      它需要添加‘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表执行增量导入。

    bin/sqoop import 
    --connect jdbc:mysql://hdp-node-01:3306/test 
    --username root 
    --password root 
    --table emp --m 1 
    --incremental append 
    --check-column id 
    --last-value 1208

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

    $ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-*
    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
    
    1206, satish p, grp des, 20000, GR

    五,sqoop的数据导出

      1/ 将数据从HDFS把文件导出到RDBMS数据库

      导出前,目标表必须存在于目标数据库中。

        默认操作是从将文件中的数据使用INSERT语句插入到表中

        更新模式是生成UPDATE语句更新表数据

      语法:

      以下是export命令语法。

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

      实例:

      数据是在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

      1、首先需要手动创建mysql中的目标表

    $ 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));

      2、然后执行导出命令

    bin/sqoop export 
    --connect jdbc:mysql://hdp-node-01:3306/test 
    --username root 
    --password root 
    --table employee 
    --export-dir /user/hadoop/emp/

      3验证表mysql命令行。

    mysql>select * from employee;
    如果给定的数据存储成功,那么可以找到数据在如下的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     |
    +------+--------------+-------------+-------------------+--------+
  • 相关阅读:
    POJ 2187 Beauty Contest(凸包+旋转卡壳)
    POJ 3845 Fractal(计算几何の旋转缩放)
    POJ 1755 Triathlon(线性规划の半平面交)
    POJ 2540 Hotter Colder(半平面交)
    POJ 3525/UVA 1396 Most Distant Point from the Sea(二分+半平面交)
    POJ 3348 Cows(凸包+多边形面积)
    POJ 1228 Grandpa's Estate(凸包唯一性判断)
    POJ 2826 An Easy Problem?!(线段交点+简单计算)
    如何在ARC代码中混编非ARC代码
    给view 添加事件
  • 原文地址:https://www.cnblogs.com/tashanzhishi/p/10876661.html
Copyright © 2020-2023  润新知