2.7.1 Sqoop简介以及使用
官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
2.7.1.1 产生背景
基于传统关系型数据库的稳定性,还是有很多企业将数据存储在关系型数据库中;早期由于工具的缺乏,Hadoop与传统数据库之间的数据传输非常困难。基于前两个方面的考虑,需要一个在传统关系型数据库和Hadoop之间进行数据传输的项目,Sqoop应运而生。
2.7.1.2 Sqoop是什么
Sqoop是一个用于Hadoop和结构化数据存储(如关系型数据库)之间进行高效传输大批量数据的工具。它包括以下两个方面:
可以使用Sqoop将数据从关系型数据库管理系统(如MySQL)导入到Hadoop系统(如HDFS、Hive、HBase)中
将数据从Hadoop系统中抽取并导出到关系型数据库(如MySQL)
Sqoop的核心设计思想是利用MapReduce加快数据传输速度。也就是说Sqoop的导入和导出功能是通过基于Map Task(只有map)的MapReduce作业实现的。所以它是一种批处理方式进行数据传输,难以实现实时的数据进行导入和导出。
官网介绍:
Apache Sqoop(TM) is a tool designed for efficiently transferring bulk
data between Apache Hadoop and structured datastores such as relational databases.
2.7.1.3 特点
优点:它可以将跨平台的数据进行整合。
缺点:它不是很灵活。
mysql <--- > hdfs
mysql ---> hive
mysql ---> hbase
sqoop的重要的几个关键词??
import : 从关系型数据库到hadoop
export : 从hadoop到关系型数据库。
2.7.2 Sqoop的安装
1、解压配置环境变量
tar -zxvf /home/sqoop... -C /usr/local/sqoop...
vi /etc/profile
2、mv ./conf/sqoop-env-template.sh ./conf/sqoop-env.sh
3、配置文件:vi ./conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/usr/local/hadoop-2.7.1/
export HADOOP_MAPRED_HOME=/usr/local/hadoop-2.7.1/
export HIVE_HOME=/usr/local/hive-1.2.1/
export ZOOCFGDIR=/usr/local/zookeeper-3.4.7/
4、将mysql的驱动包导入到sqoop安装目录下的lib包下面
cp /home/mysql-connector-java-5.1.18.jar ./lib/
5、启动测试:
sqoop version
sqoop help
sqoop import/export/job/merge/list-database/list-tables --connect 其它属性
查看数据库:
sqoop list-databases \
--connect jdbc:mysql://hadoop01:3306 \
--username root --password 123456;
sqoop list-tables \
--connect jdbc:mysql://hadoop01:3306/hive \
--username root --password 123456;
2.7.3 Sqoop-import
sqoop语句要求写成1行,多行时用\连接。
sqoop的相关属性有先后顺序、有搭配要求。
sqoop help
Available commands:
codegen Generate code to interact with database records
create-hive-table Import a table definition into Hive
eval Evaluate a SQL statement and display the results
export Export an HDFS directory to a database table
help List available commands
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
import-mainframe Import datasets from a mainframe server to HDFS
job Work with saved jobs
list-databases List available databases on a server
list-tables List available tables in a database
merge Merge results of incremental imports
metastore Run a standalone Sqoop metastore
version Display version information
sqoop import/export/job/merge/list-databases/list-tables --connect 其它属性
列出数据库:
sqoop list-databases \
--connect jdbc:mysql://hadoop01:3306 \
--username root --password 123456;
列出表:
sqoop list-tables \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password root;
案例1:表没有主键,需要指定map task的个数为1个才能执行
bin/sqoop import --connect jdbc:mysql://hadoop01:3306/hive \
--username root --password 123456 \
--table TBLS
-m 1 \
--target-dir hdfs://hadoop01:9000/sqjh/4
-m指定几个map来跑
sqoop import --connect jdbc:mysql://hadoop01:3306/hive \
--username root --password 123456 \
--table gjh \
-m 1 \
--incremental append \
--check-column id \
--last-value 0 \
--target-dir hdfs://hadoop01:9000/sq24/21
2.7.4 DBMS-hdfs
案例2:表没有主键,使用–split-by指定执行split的字段
bin/sqoop import --connect jdbc:mysql://hdp01:3306/userdb \
--username root --password mysql \
--table emp \
--split-by id \
--target-dir hdfs://hdp01:9000/sqoopdata/3
出错--
Caused by: java.sql.SQLException: null, message from server: "Host 'hdp03' is not allowed to connect to this MySQL server"
解决方案:
先连接mysql:mysql -uroot -p
#(执行下面的语句 .:所有库下的所有表 %:任何IP地址或主机都可以连接)
GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'mysql' WITH GRANT OPTION;
FLUSH PRIVILEGES;
grant all privileges on . to root@"localhost" identified by "mysql" with grant option;
FLUSH PRIVILEGES;
向hdfs正常导入导入数据
sqoop import --connect jdbc:mysql://hadoop01:3306/hive \
--driver com.mysql.jdbc.Driver \
--username root --password 123456 \
--table gjh \
-m 1 \
--fields-terminated-by '\t' \
--compress \
--compression-codec org.apache.hadoop.io.compress.Bzip2Codec \ --压缩格式
--columns 'id,na,dt' \
--delete-target-dir \ 先删除在执行
--target-dir hdfs://hadoop01:9000/sqjh/03
案例3:需要导入的数据不是全部的,而是带条件导入
bin/sqoop import --connect jdbc:mysql://hdp01:3306/userdb \
--username root --password mysql \
--table emp \
--split-by id \
--where 'id > 1203' \
--target-dir hdfs://hdp01:9000/sqoopdata/5
案例4:要导入的数据,不想包含全部字段,只需要部分字段
使用query导入:
bin/sqoop import --connect jdbc:mysql://hdp01:3306/userdb \
--username root --password mysql \
--split-by id \
--query 'select id,name,dept from emp where id < 1203 and $CONDITIONS' \
--target-dir hdfs://hdp01:9000/sqoopdata/7
--query 和 --table 不能同时存在
sql写成1行
query后使用'' 和 "" 的区别 注意:\$CONDITIONS
sqoop import --connect jdbc:mysql://hadoop01:3306/hive \
--driver com.mysql.jdbc.Driver \
--username root --password 123456 \
-m 1 \
--split-by id \
--fields-terminated-by '\t' \
--query 'SELECT id,na from gjh where id>3 and $CONDITIONS' \ --where和and都必须存在
--as-parquetfile \
--target-dir hdfs://hadoop01:9000/sqjh/03
2.7.5 DBMS-hive
案例5:将数据导入到hive中
sqoop import --connect jdbc:mysql://hadoop01:3306/hive \
--driver com.mysql.jdbc.Driver \
--username root --password 123456 \
--split-by id \
--table gjh \
--columns 'id,na,dt' \
--null-string '\\N' \ --对于空值的特殊处理
--null-non-string 0 \
--delete-target-dir \
--fields-terminated-by '\t' \
--hive-import \
--hive-overwrite \
--hive-table ali.sq1
2.7.6 增量导入数据
案例6:增量append方式导入数据:
bin/sqoop import --connect jdbc:mysql://hdp01:3306/userdb \
--username root --password mysql \
--table emp \
--incremental append \
--check-column id \
--last-value 1205 \
-m 1
案例七:增量导入hive分区表
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--driver com.mysql.jdbc.Driver \
--username root \
--password 123456 \
--table user \
--incremental append \
--check-column user_id \
--last-value 0 \
--fields-terminated-by '\t' \
--hive-partition-key dt \
--hive-partition-value '2019-9-19' \
--hive-import \
--hive-overwrite \
--hive-table ali.test20
2.7.7 Sqoop-export
案例7:数据导出:
sqoop export \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table user1 \
--export-dir hdfs://hadoop01:9000//user/hive/warehouse/ali.db/test20/dt=2019-9-19 \
--input-fields-terminated-by '\t' \ --没有这一行时老是报错,加上它之后才好,它也是必要的
-m 1
sqoop的job:
--create <job-id> Create a new saved job
--delete <job-id> Delete a saved job
--exec <job-id> Run a saved job
--help Print usage instructions
--list List saved jobs
--meta-connect <jdbc-uri> Specify JDBC connect string for the
metastore
--show <job-id> Show the parameters for a saved job
--verbose Print more information while working
sqoop job --list
sqoop job --create job1 -- import --connect jdbc:mysql://hadoop01:3306/hive \
--driver com.mysql.jdbc.Driver \
--username root --password 123456 \
--table gjh \
-m 1 \
--incremental append \
--check-column id \
--last-value 0 \
--target-dir hdfs://hadoop01:9000/sqjh/08
--我的在创建job工作时报错Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObje 意思就是缺少个和json有关的包那就去下载呗
在网址->http://www.java2s.com/Code/Jar/o/Downloadorgjsonjar.htm这里可以下载
注意:就算没执行成功这个job也是被创建的;
然后执行这个job
sqoop job --exec myjob
mysql表的编码格式做为utf8,hdfs文件中的列数类型和mysql表中的字段数一样
导出暂不能由hive表导出mysql关系型数据库中
--export-dir是一个hdfs中的目录,它不识别_SUCCESS文件
--query导入的时候注意设置问题。
2.7.8sqoop的job:
sqoop的job:
--create <job-id> Create a new saved job
--delete <job-id> Delete a saved job
--exec <job-id> Run a saved job
--help Print usage instructions
--list List saved jobs
--meta-connect <jdbc-uri> Specify JDBC connect string for the
metastore
--show <job-id> Show the parameters for a saved job
--verbose Print more information while working
sqoop job --list
sqoop job --create job1 -- import --connect jdbc:mysql://hadoop01:3306/hive \
--driver com.mysql.jdbc.Driver \
--username root --password 123456 \
--table gjh \
-m 1 \
--incremental append \
--check-column id \
--last-value 0 \
--target-dir hdfs://hadoop01:9000/sqjh/08
--我的在创建job工作时报错Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObje 意思就是缺少个和json有关的包那就去下载呗
在网址->http://www.java2s.com/Code/Jar/o/Downloadorgjsonjar.htm这里可以下载
注意:就算没执行成功这个job也是被创建的;
然后执行这个job
sqoop job --exec myjob