集团站切换校区
图标

学习文章

当前位置:首页 > >学习文章 > >

{大数据}sqoop数据迁移

发布时间: 2018-02-09 09:30:38

导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;

导出数据:从Hadoop的文件系统中导出数据到关系数据库;


2.2 工作机制

将导入或导出命令翻译成mapreduce程序来实现

在翻译出的mapreduce中主要是对inputformat和outputformat进行定制


2.3 sqoop实战及原理

2.3.1 sqoop安装

安装sqoop的前提是已经具备java和hadoop的环境


1、下载并解压最新版下载地址http://ftp.wayne.edu/apache/sqoop/1.4.6/

2、修改配置文件$ cd $SQOOP_HOME/conf

$ mv sqoop-env-template.sh sqoop-env.sh

打开sqoop-env.sh并编辑下面几行:

export HADOOP_COMMON_HOME= /home/hadoop/apps/hadoop-2.8.1

export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.8.1/

export HIVE_HOME=/home/hadoop/apps/hive-1.2.1

3、加入mysql的jdbc驱动包cp  ~/app/hive/lib/mysql-connector-java-5.1.28.jar   $SQOOP_HOME/lib/

4、验证启动$ 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安装工作完成。


2.4 Sqoop的数据导入“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)

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

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

​2.4.2 示例

表数据在mysql中有一个库userdb中三个表:emp, emp_add和emp_contact

表emp:


表emp_add:​


表emp_conn:


​导入表表数据到HDFS

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

bin/sqoop import   \

--connect jdbc:mysql://hdp08:3306/sqoopdb   \

--username root  \

--password root   \

--table emp   \

--m 1


Hdfs存放文件默认路径/user/hadoop/表名

错误一:

17/12/17 22:08:47 INFO mapreduce.Job: Task Id : attempt_1513542008513_0003_m_000000_2, Status : FAILED

Error: java.lang.RuntimeException: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

解决方式:远程连接授权

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'hdp08' IDENTIFIED BY 'root' WITH GRANT OPTION;

注意:'myuser'、'mypassword' 需要替换成实际的用户名和密码。

mysql> flush PRIVILEGES;


如果成功执行,那么会得到下面的输出。

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


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

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

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

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

bin/sqoop import \

--connect jdbc:mysql://hdp08:3306/sqoopdb \

--username root \

--password root \

--target-dir /work \

--table emp --m 1


​下面的命令是用来验证 /work 目录中 emp_add表导入的数据形式。

​$HADOOP_HOME/bin/hadoop fs -cat /work/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


​导入关系表到HIVE

​bin/sqoop import --connect jdbc:mysql://hdp08:3306/sqoopdb --username root --password root --table emp --hive-import --m 1

导入岗位是MANAGER,并且是30号部门的员工信息


​导入表数据子集

​导入岗位是MANAGER,并且是30号部门的员工信息

​bin/sqoop import --connect jdbc:mysql://hdp08:3306/sqoopdb --username root --password root --where "job='MANAGER' and deptno=30" --table emp --hive-import --m 1


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

where子句的语法如下。

​--where <condition>


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

bin/sqoop import \

--connect jdbc:mysql://hdp08:3306/sqoopdb \

--username root \

--password root \

--where "city ='sec-bad'" \

--target-dir /wherequery \

--table emp_add --m 1


按需导入

bin/sqoop import \

--connect jdbc:mysql://hdp08:3306/sqoopdb \

--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 '\t' \

--m 1


​下面的命令用来验证数据从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表执行增量导入。


bin/sqoop import \

--connect jdbc:mysql://hdp08:3306/sqoopdb \

--username root \

--password root \

--table dept --m 1 \

--incremental append \

--check-column deptno \

--last-value 50


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

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

它用逗号(,)分隔 emp_add表数据和字段。

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


2.5 Sqoop的数据导出将数据从HDFS导出到RDBMS数据库

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

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

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


​语法

以下是export命令语法。​

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

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://hdp08:3306/sqoopdb \

--username root \

--password root \

--table emp_bak \

--export-dir /work2


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     |

+------+--------------+-------------+-------------------+--------+​



上一篇: 已经是最新的文章了

下一篇: {大数据}辅助系统

在线咨询 ×

您好,请问有什么可以帮您?我们将竭诚提供最优质服务!