【Sqoop】介绍、安装、使用(列出MySQL中数据库/表 + mysql数据导入到Hive表 + 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