1.sqoop简介
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
Sqoop是一个在(MySQL、Oracle)等关系型数据库和大数据平台之间进行批量数据迁移的工具。Sqoop底层能实现将关系型数据库中的数据迁移到大数据平台上是因为sqoop的底层是采用MapReduce程序实现抽取、转换、加载,MapReduce本身就并行化和高容错率,能很好的保证数据的迁移,而且与Kettle等传统ETL工具相比,Sqoop的任务跑在Hadoop集群上,能有效减少ETL服务器资源的使用情况
2.安装
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
export HADOOP_COMMON_HOME=/home/hadoop/cluster/hadoop-2.6.4
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/cluster/hadoop-2.6.4
#set the path to where bin/hbase is available
export HBASE_HOME=/home/hadoop/cluster/hbase-0.98
#Set the path to where bin/hive is available
export HIVE_HOME=/home/hadoop/cluster/hive-1.2.1
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/home/hadoop/cluster/zookeeper-3.4.5/conf
加入 mysql 驱动包到 sqoop1.4.6/lib 目录下
cp mysql-connector-java-5.1.40-bin.jar apps/sqoop-1.4.6/lib/
验证安装是否成功
./sqoop-version
3.Sqoop的基本命令
列出MySQL数据有哪些数据库
./sqoop list-databases --connect jdbc:mysql://192.168.47.128:3306/ --username root --password root
列出MySQL中的某个数据库有哪些数据表:
./sqoop list-tables --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root
创建一张跟mysql中的help_keyword表一样的hive表hk:
./sqoop create-hive-table --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root --table help_keyword --hive-table hk
4.Sqoop的数据导入hdfs
“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。
所有记录 都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据)
1、从RDBMS导入到HDFS中
语法格式
sqoop import (generic-args) (import-args)
常用参数
--connect <jdbc-uri> jdbc 连接地址
--connection-manager <class-name> 连接管理者
--driver <class-name> 驱动类
--hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME
--help help 信息
-P 从命令行输入密码
--password <password> 密码
--username <username> 账号
--verbose 打印流程信息
--connection-param-file <filename> 可选参数
eg:
普通导入:导入mysql库中的help_keyword的数据到HDFS上
导入的默认路径:/user/hadoop/help_keyword
-m 1 生成一个文件
./sqoop import --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root --table help_keyword -m 1
导入: 指定分隔符和导入路径
-m 2 生成2个文件
./sqoop import --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root --table help_keyword --target-dir /input/sqoop/ --fields-terminated-by '\t' -m 2
导入数据:带where条件
./sqoop import --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root --where "name='STRING' " --table help_keyword --target-dir /input/condition -m 1
查询指定列
./sqoop import --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root --columns "name" --where "name='STRING' " --table help_keyword --target-dir /input/col -m
导入:指定自定义查询SQL
sqoop import \
--connect jdbc:mysql://192.168.47.128:3306/ \
--username root \
--password root \
--target-dir /input/myimport \
--query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' \
--split-by help_keyword_id \
--fields-terminated-by '\t' \
-m 4
./sqoop import --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root --target-dir /input/myimport --query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' --split-by help_keyword_id --fields-terminated-by '\t' -m 1
在以上需要按照自定义SQL语句导出数据到HDFS的情况下:
1、引号问题,要么外层使用单引号,内层使用双引号,$CONDITIONS的$符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后$CONDITIONS的$符号需要转义
2、自定义的SQL语句中必须带有WHERE \$CONDITIONS
5.从hdfs把数据导出到mysql中
1、创建mysql中的表
create table help_keyword_hive like help_keyword;
2、导出数据到MySql
./sqoop export --connect jdbc:mysql://192.168.47.128:3306/mysql --username root --password root --table help_keyword_hive --export-dir /input/sqoop/ --input-fields-terminated-by '\t' -m 1
6.mySQL到Hive
首先要启动hive元数据服务
将MySQL中的test表导入到hive中
./sqoop import \
--connect jdbc:mysql://192.168.47.128:3306:3306/test\
--username root \
--password root \
--table student1\
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table student1
注意:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库
7.MySQL到HBase
首先要启动HBASE服务。同时在HBASE中手动创建表,因为部分版本原因,可能导致sqoop不会在HBASE中自动创建表格
7.1 在HBASE中创建student1_hbase表
7.2 将mysql中的数据同步到HBASE中
bin/sqoop import \
--connect jdbc:mysql://192.168.47.128:3306/test \
--username root \
--password root \
--table student1 \
--where 'id >= 5' \
--hbase-create-table \
--hbase-table "student1_hbase" \
--hbase-row-key "id" \
--column-family "info" \
--num-mappers 1 \
--split-by id