【Sqoop】介绍、安装、使用(列出MySQL中数据库/表 + mysql数据导入到Hive表 + Hive表数据导出到mysql表)

目录

一、介绍

二、安装

三、使用

  1、列出MySQL中所有的数据库

  2、列出MySQL指定数据库下的所有表

  3、将MySQL表数据导入进Hive表

  4、将Hive表数据导出进MySQL表


一、介绍

功能:Sqoop是一个采集工具。类似于Flume,但是Flume是从一些日志中采集信息,Sqoop是从RDBMS中采集信息。比如Sqoop采集信息到HDFS/Hive。

版本
Sqoop: 1.4.7 (用)
Sqoop2:  1.99.7(不用)

Sqoop的底层是:MapReduce中的map。

 

二、安装

步骤如下:

1)地址http://archive.cloudera.com/cdh5/cdh/5/,下载sqoop-1.4.6-cdh5.7.0.tar.gz
2)解压到~/app
3)拷贝MySQL Driver:mysql-connector-java-5.1.27-bin.jar到Hive的安装包下的lib中
4)conf/sqoop-env.sh 配置
[hadoop@hadoop001 conf]$ cp sqoop-env-template.sh sqoop-env.sh
[hadoop@hadoop001 conf]$ vi sqoop-env.sh
export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
5)vi ~/.bash_profile 配置Sqoop进环境变量
export SQOOP_HOME=/home/hadoop/app/sqoop-1.4.6-cdh5.7.0
export PATH=$SQOOP_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME
6)使环境变量生效:`source ~/.bash_profile`
7)查看是否配置成功:
[hadoop@hadoop001 bin]$ echo $SQOOP_HOME
/home/hadoop/app/sqoop-1.4.6-cdh5.7.0

 

三、使用

查看sqoop命令的使用帮助:[hadoop@hadoop001 bin]$ sqoop help   

sqoop的导入、导出命令(出发点是Hadoop):
导入(import): MySQL ==> Hadoop
导出(export): Hadoop ==> MySQL

但是:实际上SparkSpark就可以非常方便的实现读取MySQL中的表进Hadoop中/Hive中

 

1、列出MySQL中所有的数据库

sqoop list-databases \
--username root --password 123456 \
--connect jdbc:mysql://localhost:3306/

 

2、列出MySQL指定数据库下的所有表

sqoop list-tables \
--username root --password 123456 \
--connect jdbc:mysql://localhost:3306/test 

 

3、将MySQL表数据导入进Hive表

sqoop import --help :导入命令的帮助

导入的命令:

sqoop import \
--connect jdbc:mysql://localhost:3306/test06 \   ---mysql的连接
--username root --password root \   ---mysql的连接
--delete-target-dir \  -----建议每次导入的时候加上这个参数,每次以删除的模式导入,对应MR中的输出目录如果存在就报错的异常
--table city_info \    -----读取的mysql的表名
--hive-import \  ---功能是导入
--hive-table city_info \  ----导入hive表的表名
--hive-overwrite \        ----导入表 覆盖的方式
--fields-terminated-by '\t' \  ---表字段分隔符
--lines-terminated-by '\n' \   ---行分隔符
--split-by city_id \  ---指明主键 ,因为Sqoop默认把主键作为map的分片 ,这样可以把mysql中数据根据主键分片
-m 2  ---并行的map的数量(因为Sqoop的导入功能实际上就是MR,只有map过程)

1)MR角度:从导入的过程中就可以看得出来,这个MapReduce作业是只有map的。

2)并行度角度:Sqoop默认的并行度是4,也就是mapper数是4。可以通过-m设置这个MapReduce作业的并行度。Sqoop默认以主键作为map分片,通过--split-by​​​​​​​指明主键mysql中分片的主键。

执行完上述命令之后,mysql中的城市表数据就导入HDFS中了,但是默认导入HDFS的/user/hadoop(用户名)/表名下,而不是hive表对应的路径下,所以还需要将HDFS上的数据hdfs dfs -mv 移动到hive表对应的路径下,这样在hive表中就能查询到数据了。

如果想sqoop导入的数据直接进入hive的表目录下,使用--target-dir /user/hive/warehouse/hive.db/city_info参数就可以了。其中:输出目录不能存在。

现在来测试一下--target-dir参数,导入的命令:

参考:https://blog.csdn.net/finejade1027/article/details/90380038

创建MySQL表:
CREATE TABLE `city_info` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql> insert into city_info(id,name) values(1,"tom");
Query OK, 1 row affected (0.02 sec)

mysql> insert into city_info(id,name) values(2,"mike");
Query OK, 1 row affected (0.00 sec)

导入MySQL数据到HDFS的命令:
sqoop import \
--username root --password 123456 \
--connect jdbc:mysql://localhost:3306/test \
--query "select * from city_info where \$CONDITIONS" \
--target-dir /wordcount/data --fields-terminated-by ',' \
--split-by id -m 1
其中:输出目录不能存在。其中:where \$CONDITIONS是固定的
导入的时候可能提示下面的信息,不用管它,没有关系。把导入的命令写在一行就可以:
Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
--target-dir /wordcount \
-m 219/08/21 13:25:10 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.7.0
19/08/21 13:25:10 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/08/21 13:25:10 ERROR tool.BaseSqoopTool: Error parsing arguments for import:
19/08/21 13:25:10 ERROR tool.BaseSqoopTool: Unrecognized argument:

实际走的是一个MR,存储到HDFS:
[hadoop@hadoop001 bin]$ hdfs dfs -cat /wordcount/data/p*
1,tom
2,mike

 

4、将Hive表数据导出进MySQL表

[fanl@centos7 sqoop-1.4.6-cdh5.14.2]$ bin/sqoop export \
--connect jdbc:mysql://127.0.0.1:3306/sqoop \
--username root \
--password 123456 \
--table logs_result \------>mysql的表
--export-dir '/user/hive/warehouse/weblogs.db/logs_result' \----->hive中表的路径
--num-mappers 2  \------->Sqoop的并行度
--input-fields-terminated-by '\001'
 
## hive默认的分隔符:\001

 

posted @ 2020-03-30 21:32  lemon胡  阅读(712)  评论(0编辑  收藏  举报