sqoop数据迁移

您所在的位置:网站首页 sqoop版本对应 sqoop数据迁移

sqoop数据迁移

2023-03-18 10:11| 来源: 网络整理| 查看: 265

sqoop数据迁移

概述:

sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统; 导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等

工作机制:是将导入和导出的命令翻译成mapreduce程序来实现,在翻译出的mapreduce中主要对inputformat和outputformat进行定制

sqoop安装

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

下载并解压

下载地址 http://archive.cloudera.com/cdh5/cdh/5/

sqoop1版本详细下载地址 http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.14.0.tar.gz sqoop2版本详细下载地址 http://archive.cloudera.com/cdh5/cdh/5/sqoop2-1.99.5-cdh5.14.0.tar.gz

这里我使用的是sqoop1的版本,下载之后上传到/export/softwares目录下,然后进行解压

cd /export/softwares tar -zxvf sqoop-1.4.6-cdh5.14.0.tar.gz -C ../servers/

修改配置文件

cd /export/servers/sqoop-1.4.6-cdh5.14.0/conf/ cp sqoop-env-template.sh sqoop-env.sh vim sqoop-env.sh export HADOOP_COMMON_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0 export HADOOP_MAPRED_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0 export HIVE_HOME=/export/servers/hive-1.1.0-cdh5.14.0

加入额外的依赖包

sqoop的使用需要添加两个额外的依赖包,一个是mysql的驱动包,一个是java-json的的依赖包,不然就会报错 mysql-connector-java-5.1.40.jar java-json.jar

将这两个jar包添加到sqoop的lib目录下

启动:

cd /export/servers/sqoop-1.4.6-cdh5.14.0 bin/sqoop-version sqoop的数据导入

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

列举所有的数据库

命令行查看帮助

bin/sqoop list-databases --help

列出所有的主机的数据库

bin/sqoop list-databases --connect jdbc:mysql://192.168.15.22:3306/ --username root --password root

查看某个数据库下的所有数据表

bin/sqoop list-tables --connect jdbc:mysql://192.168.15.22:3306/userdb --username root --password root 导入数据库表数据到hdfs

用下面命令从mysql数据库服务器包表emp表导到hdfs

–m启动一个maptask

bin/sqoop import --connect jdbc:mysql://192.168.15.37/userdb --username root --password root --table emp --m 1

验证是否导入成功

hdfs dfs -ls /user/root/emp

导入数据表到指定hdfs的目录

使用参数 --target-dir来指定导出目的地, 使用参数—delete-target-dir来判断导出目录是否存在,如果存在就删掉

bin/sqoop import --connect jdbc:mysql://192.168.15.37/userdb --username root --password root --table emp --m 1 --delete-target-dir --target-dir /sqoop/emp

查看导入的数据

hdfs dfs -text /sqoop/emp/part-m-00000

默认会使用逗号来分隔表中的数据和字段

1201,gopal,manager,50000,TP,2018-12-18 21:10:54.0,2018-12-18 21:10:54.0,1

导入hdfs指定目录并指定字段之间的分隔符

bin/sqoop import --connect jdbc:mysql://192.168.15.37/userdb --username root --password root --table emp --m 1 --delete-target-dir --target-dir /sqoop/emp2 --fields-terminated-by '\t'

查看文件内容

hdfs dfs -text /sqoop/emp2/part-m-00000 #数据已经按照'\t'来分隔 1201 gopal manager 50000 TP 2018-12-18 21:10:54.0 2018-12-18 21:10:54.01 导入关系表到hive

拷贝jar包

将我们mysql表当中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷贝到sqoop的lib目录下

cp /export/servers/hive-1.1.0-cdh5.14.0/lib/hive-exec-1.1.0-cdh5.14.0.jar /export/servers/sqoop-1.4.6-cdh5.14.0/lib/

准备hive的数据库与表

hive (default)> create database sqooptohive; hive (default)> use sqooptohive; hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by '\001';

导入数据

指定分隔符为’\001’,指定导入数据目的地为hive

bin/sqoop import --connect jdbc:mysql://192.168.15.37/userdb --username root --password root --table emp --m 1 --delete-target-dir --fields-terminated-by '\001' --hive-import --hive-table sqoophive.emp_hive --hive-overwrite

查看表数据

select * from emp_hive; emp_hive.id emp_hive.name emp_hive.deg emp_hive.salsry emp_hive.dept 1201 gopal manager 50000 TP 1202 manisha Proof reader 50000 TP 1203 khalil php dev 30000 AC 1204 prasanth php dev 30000 AC 1205 kranthi admin 20000 TP 导入关系表到hive并自动创建hive表 bin/sqoop import --connect jdbc:mysql://192.168.15.37:3306/userdb --username root --password root --table emp_conn --hive-import -m 1 --hive-database sqoophive

通过这个命令,我们可以直接将我们mysql表当中的数据以及表结构一起倒入到hive当中去

导入表数据子集

按照条件进行查找,通过—where参数来查找表emp_add当中city字段的值为sec-bad的所有数据导入到hdfs上面去

bin/sqoop import \ --connect jdbc:mysql://192.168.15.37:3306/userdb \ --username root --password root --table emp_add \ --target-dir /sqoop/emp_add -m 1 --delete-target-dir \ --where "city = 'sec-bad'" sql语句查找导入hdfs

通过 –query参数来指定我们的sql语句,通过sql语句来过滤我们的数据进行导入

bin/sqoop import \ --connect jdbc:mysql://192.168.15.37:3306/userdb --username root --password root \ --delete-target-dir -m 1 \ --query 'select phno from emp_conn where 1=1 and $CONDITIONS' \ --target-dir /sqoop/emp_conn 增量导入

增量导入是仅导入新添加的表中的行的技术。 它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。 下面的语法用于Sqoop导入命令增量选项

--incremental --check-column --last value

第一种:

导入emp表中id大于1202的所有数据

注意:增量导入的时候,一定不能加参数–delete-target-dir否则会报错

bin/sqoop import \ --connect jdbc:mysql://192.168.15.37:3306/userdb \ --username root \ --password root \ --table emp \ --incremental append \ --check-column id \ --last-value 1202 \ -m 1 \ --target-dir /sqoop/increment

第二种:通过–where来实现

使用where来进行控制数据的选取会更加精确

bin/sqoop import \ --connect jdbc:mysql://192.168.15.37:3306/userdb \ --username root \ --password root \ --table emp \ --incremental append \ --where "create_time > '2018-06-17 00:00:00' and is_delete='1' and create_time < '2018-06-17 23:59:59'" \ --target-dir /sqoop/incement2 \ --check-column id \ --m 1 sqoop的数据导出

hdfs导出到mysql

在hdfs的目录/sqoop/emp,数据内容如下

1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1 1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1 1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1 1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0 1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

第一步:创建mysql表

CREATE TABLE `emp_out` ( `id` INT(11) DEFAULT NULL, `name` VARCHAR(100) DEFAULT NULL, `deg` VARCHAR(100) DEFAULT NULL, `salary` INT(11) DEFAULT NULL, `dept` VARCHAR(10) DEFAULT NULL, `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `is_delete` BIGINT(20) DEFAULT '1' ) ENGINE=INNODB DEFAULT CHARSET=utf8;

第二步:执行导出命令

使用export来实现数据的导出,将hdfs的数据导出到mysql中去

bin/sqoop export \ --connect jdbc:mysql://192.168.15.37:3306/userdb \ --username root --password root \ --table emp_out \ --export-dir /sqoop/emp \ --input-fields-terminated-by ","

第三步:验证mysql数据库

查看emp_out表中是否有数据

sqoop常用命令及参数

常用命令列举:

序号 命令 类 说明 1 import ImportTool 将数据导入到集群 2 export ExportTool 将集群数据导出 3 codegen CodeGenTool 获取数据库中某张表数据生成Java并打包Jar 4 create-hive-table CreateHiveTableTool 创建Hive表 5 eval EvalSqlTool 查看SQL执行结果 6 import-all-tables ImportAllTablesTool 导入某个数据库下所有表到HDFS中 7 job JobTool 用来生成一个sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。 8 list-databases ListDatabasesTool 列出所有数据库名 9 list-tables ListTablesTool 列出某个数据库下所有表 10 merge MergeTool 将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中 11 metastore MetastoreTool 记录sqoop job的元数据信息,如果不启动metastore实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以在配置文件sqoop-site.xml中进行更改。 12 help HelpTool 打印sqoop帮助信息 13 version VersionTool 打印sqoop版本信息

命令&参数详解

1、公有参数:数据库连接

序号 参数 说明 1 –connect 连接关系型数据库的URL 2 –connection-manager 指定要使用的连接管理类 3 –driver JDBC的driver class 4 –help 打印帮助信息 5 –password 连接数据库的密码 6 –username 连接数据库的用户名 7 –verbose 在控制台打印出详细信息

2、公有参数:import

序号 参数 说明 1 –enclosed-by 给字段值前后加上指定的字符 2 –escaped-by 对字段中的双引号加转义符 3 –fields-terminated-by 设定每个字段是以什么符号作为结束,默认为逗号 4 –lines-terminated-by 设定每行记录之间的分隔符,默认是\n 5 –mysql-delimiters Mysql默认的分隔符设置,字段之间以逗号分隔,行之间以\n分隔,默认转义符是\,字段值以单引号包裹。 6 –optionally-enclosed-by 给带有双引号或单引号的字段值前后加上指定字符。

3、公有参数:export

序号 参数 说明 1 –input-enclosed-by 对字段值前后加上指定字符 2 –input-escaped-by 对含有转移符的字段做转义处理 3 –input-fields-terminated-by 字段之间的分隔符 4 –input-lines-terminated-by 行之间的分隔符 5 –input-optionally-enclosed-by 给带有双引号或单引号的字段前后加上指定字符

4、公有参数:hive

序号 参数 说明 1 –hive-delims-replacement 用自定义的字符串替换掉数据中的\r\n和\013 \010等字符 2 –hive-drop-import-delims 在导入数据到hive时,去掉数据中的\r\n\013\010这样的字符 3 –map-column-hive 生成hive表时,可以更改生成字段的数据类型 4 –hive-partition-key 创建分区,后面直接跟分区名,分区字段的默认类型为string 5 –hive-partition-value 导入数据时,指定某个分区的值 6 –hive-home hive的安装目录,可以通过该参数覆盖之前默认配置的目录 7 –hive-import 将数据从关系数据库中导入到hive表中 8 –hive-overwrite 覆盖掉在hive表中已经存在的数据 9 –create-hive-table 默认是false,即,如果目标表已经存在了,那么创建任务失败。 10 –hive-table 后面接要创建的hive表,默认使用MySQL的表名 11 –table 指定关系数据库的表名


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3