sqoop的安装以及使用详解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值