 
	 
	发布时间: 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:

下面的命令用于从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  $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 
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子句的语法如下。
下面的命令用来导入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 
$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导入命令增量选项。 --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命令语法。
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、然后执行导出命令 --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     | +------+--------------+-------------+-------------------+--------+
上一篇: {思科CCIE-RS}OSPF选路规则(1)基于IOS 12.3 BY乱雪纷飞
下一篇: {大数据}辅助系统