sqoop
Sqoop is a tool designed to transfer data between Hadoop andrelational databases. You can use Sqoop to import data from a relationaldatabase management system (RDBMS) such as MySQL or Oracle into the HadoopDistributed File System (HDFS), transform the data in Hadoop MapReduce, andthen export the data back into an RDBMS.
官方文档中说到,sqoop是一种用来将关心型数据库(比如MySQL)中的数据导入到HDFS中,或者将HDFS中数据导出到MySQL中的工具。
以HDFS/hive为参照,确定导入导出方向
1)improt mysql --> Hive/HDFS //导入
2)export Hive/HDFS --> mysql //导出
sqoop的配置:我们下载好sqoop并解压之后,需要更改如下两点:
1、 修改配置文件
这里修改主要是配置sqoop找到hadoop:
比如:
#Set pathto where bin/hadoop is available
exportHADOOP_COMMON_HOME=/opt/modules/cdh/hadoop-2.5.0-cdh5.3.6
#Set pathto where hadoop-*-core.jar is available
exportHADOOP_MAPRED_HOME=/opt/modules/cdh/hadoop-2.5.0-cdh5.3.6
#set thepath to where bin/hbase is available
#exportHBASE_HOME=
#Set thepath to where bin/hive is available
exportHIVE_HOME=/opt/modules/cdh/hive-0.13.1-cdh5.3.6
#Set thepath for where zookeper config dir is
export ZOOCFGDIR=/opt/modules/cdh/zookeeper-3.4.5-cdh5.3.6/conf
2、 加入MySQL的jdbc驱动包到sqoop目录下的lib目录中
$ cp mysql-connector-java-5.1.34-bin.jar /opt/modules/cdh/sqoop-1.4.5-cdh5.3.6/lib/
3、 做好以上两点之后,我们就可以测试能否连接MySQL了。
通过官网查询,我们可以看到sqoop主要有如下命令:
其中,我们多用到导入 import,导出export,这里我们使用其中的—list命令测试能否使用sqoop连接mysql。
在这里,需要输入mysql的用户与密码。我这里设置root用户的密码为root123。
bin/sqooplist-databases \
--connectjdbc:mysql://[hostname]:3306 \
--usernameroot \
--password root123
如果测试成功的话,就代表我们已经配置成功。
5、我们以官方文档为例,
Argument | Description |
--connect <jdbc-uri> | Specify JDBC connect string |
--connection-manager <class-name> | Specify connection manager class to use |
--driver <class-name> | Manually specify JDBC driver class to use |
--hadoop-mapred-home <dir> | Override $HADOOP_MAPRED_HOME |
--help | Print usage instructions |
--password-file | Set path for a file containing the authentication password |
-P | Read password from console |
--password <password> | Set authentication password |
--username <username> | Set authentication username |
--verbose | Print more information while working |
--connection-param-file <filename> | Optional properties file that provides connection parameters |
--relaxed-isolation | Set connection transaction isolation to read uncommitted for the mappers. |
以如下例子进行导入:
1、将MySQL数据库中数据导入到HDFS
bin/sqoop import \
--connect jdbc:mysql://[hostname]:3306/test \
--username root \ //使用root用户
-P \ //不使用明文指定数据库连接密码
--table user \ //使用user表格
--target-dir /sqoop \ //指定数据导入到HDFS上的目录
--delete-target-dir \ //如果目标目录已存在,则先删除
-m 1 \ //指定使用导入数据的map个数,mapreduce(V1)中的方式
--fields-terminated-by "," //目标文件的分隔符
这是将数据库中的test数据库下面的user表格导入到HDFS中的sqoop目录下面,测试成功后我们可以在HDFS中进行查看。
当然我们也可是使用明文密码进行连接。
比如:
bin/sqoop import \
--connect jdbc:mysql://[hostname]:3306/test \
--username root \
--password root \
--table user \
--target-dir /sqoop/input \
--num-mappers 1 \
--fields-terminated-by "," \
--delete-target-dir
2、将MySQL数据库数据导入到hive
bin/sqoop import \
--connect jdbc:mysql://[hostname]:3306/test \
--username root \
--password root \
--table user \
-m 1 \
--delete-target-dir \
--fields-terminated-by "\t" \
--hive-import \ //导入hive
--hive-overwrite \
--hive-database mydb \ //导入hive中的mydb数据库
--hive-table user0 //导入hive中的mydb数据库中的user表
总结:
1.hive中的database要先创建
2.hive中的表会自动创建
3.数据是由MySQL先导入到当前用户在HDFS的用户主目录下,然后再加载到hive表中
3、从HDFS、Hive表导出到Mysql
由于hive表的数据库和表其实就是HDFS上的目录,表数据是HDFS上的文件,所以从Hive表导出数据就是从HDFS对应的目录导出数据
比如:
create table hive2mysql (
pl varchar(20),
date varchar(20),
hour varchar(20),
value varchar(20)
);
bin/sqoop export \
--connect jdbc:mysql://hadoop0505:3306/mydb\ //连接数据库
--username root \
--password root \
--table hive2mysql \ //数据库中表名
--num-mappers 1 \ //设置MapReduce中map个数
--export-dir /user/hive/warehouse/test \ //HDFS中存放hive数据的位置
--fields-terminated-by "\001"
总结:
1.从Hive表和HDFS导出数据其实是一回事,都是要到处HDFS上的目录
2.--fields-terminated-by对于Hive表就是创建时候的字段分隔符,对于HDFS上的文件而言就是该文件的分隔符