Sqoop原理:
将导入导数命令翻译成MR程序来实现,翻译出的MR主要是针对InputFormat和OutputFormat进行定制的;
sqoop的作用:
利用Mapreduce分布式批处理,加快了数据传输速度,保证了容错性。主要用于hadoop(hive)与关系型数据库之间的数据传递,可以将关系型数据库中的数据导入HDFS中,也可以将HDFS的数据导入关系型数据库中。
sqoop导入:从RDBMS到HDFS,导入单个表,表的每一行被视为HDFS的记录。所有的记录被保存在文本文件的文本数据或者在Avro和序列文件的二进制数据。
sqoop导出:从HDFS导出一组文件到RDBMS。作为输入到sqoop文件包含记录,这被称为在表中的行。那些被读取并解析成一组记录和分隔使用用户指定的分隔符。
Sqoop1存在的问题:
1、基于命令行的操作方式易于出错,且不安全
2、数据传输和数据格式是紧耦合的,这使得connector无法支持所有的数据格式
3、安全密钥是暴露出来的,非常不安全
4、sqoop安装需要root权限
Connector必须符合JDBC模型,并使用通用的JDBC词汇
导入与导出:
https://blog.csdn.net/py_123456/article/details/80761446
导入数据:导入到大数据集群
导入到HDFS:MySQL服务开启,
全部导入:
bin/sqoop import \
--connect jdbc:mqsql://hadoop112:3306/company \
--username root \
--password 111111 \
--table staff \ #读取数据库表
--target-dir /user/company \ #将数据导入到指定的HDFS目录下。如果不指定,会默认数据库的表名称
--delete-target-dir \
--num-mappers 1 \ #指定map任务并发度
--fields-terminated-by "\t"
查询到入:
bin/sqoop import \
--connect jdbc:mqsql://hadoop112:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'
在查询语句中CONDITIONS前必须转义
导入指定的列:
bin/sqoop import \
--connect jdbc:mysql://hadoop112:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--cilumns id,sex \ #columns 中如果涉及多列,用逗号分隔,分割时不要添加空格
--table staff
使用sqoop关键字筛选查询导入数据:
bin/sqoop import \
--connect jdbc:mysql://hadoop112:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1" #关键字筛选
RDBMS到hive:
bin/sqoop import \
--connect jdbc:mysql://hadoop112:3306/company \
--username root \
--password 111111 \
--table staff \
--num-mappers 1 \
--fields-terminated-by "\t" \
--hive-import \
--hive-overwrite \
--hive-table staff_hive
该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库,第一步默认的临时目录是/user/atguigu/表名
在导入之前先要在hive上创建一张表 ,若是不创建会自动创建
RDBMS到Hbase:
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 000000 \
--table company \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \ #表不存在自己创建
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id
导出数据:
hive/HDFS 到RDBMS
bin/sqoop export \
--connect jdbc:mysql://hadoop112:3306/company \
--username root \
--password 111111 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"
#mysql 中如果表不存在,不会自动创建
空值?
--hive-inport #导入到hive中,
--target-dir #指定在HDFS中的临时目录
--hive-overwrite #对表中的数据覆盖
--fields-terminated -by #指定数据分隔符。默认是逗号
--input-null-string "\N" --input-null-non-string "\N" #导出时空值转化为\N 用\N 标识为空值
--null-string '\N' --null-non-string '\N' # 导入时空值的处理
【注】文件的存储格式(parquetfile avrodatafile textfile) 默认的是textfile
Sqoop2的改进:
引入sqoop server,集中化管理connector
多种访问方式:CLI,web UI,rest API
引入基于角色的安全机制
Sqoop1VSsqoop2:
优点:sqoop1部署简单
缺点:命令行方式容易出错,格式紧耦合,无法支持所有的数据类型,安全机制不够完善,安装需要root权限,connector必须符合jdbc模型
优点:支持多种交互方式,命令行,webUI ,rest API,connector集中化管理,所有的链接安装在sqoopserver上,完善权限管理机制,connector
规范化,仅仅负责数据的读写
缺点:架构相对较复杂,部署配置也复杂。