sqoop笔记

sqoop help
sqoop 不支持动态分区
mysql -uroot -p123456 -e “show databases”;
mysql -uroot -p123456 < /路径/test.sql
test.sql里面包含show databases

1.查看可用的数据库 (mysql)

sqoop list-databases --help
sqoop list-databases [GENERIC-ARGS] [TOOL-ARGS]
–connect
–username
–password

sqoop list-databases \
--connect jdbc:mysql://bigdata12:3306 \
--username root \
--password 123456

2.查看可用的tables(mysql)

sqoop list-tables --help
sqoop list-tables [GENERIC-ARGS] [TOOL-ARGS]
–connect
–username
–password

sqoop list-tables \
--connect jdbc:mysql://bigdata12:3306/bigdata \
--username root \
--password 123456

数据导入:mysql import(hdfs)

sqoop import --help
sqoop import [GENERIC-ARGS] [TOOL-ARGS]
–connect
–username
–password
–table

sqoop import \
--connect jdbc:mysql://bigdata12:3306/hive \
--username root \
--password 123456 \
--table TBLS

hadoop fs -text /user/hadoop/TBLS/* 查看数据

重复导入数据

–delete-target-dir

sqoop import \
--connect jdbc:mysql://bigdata12:3306/hive \
--username root \
--password 123456 \
--delete-target-dir \
--table TBLS

修改 hdfs目标路径

默认hdfs输出路径是/user/hadoop(用户)/TBLS(表名)
–target-dir

sqoop import \
--connect jdbc:mysql://bigdata12:3306/hive \
--username root \
--password 123456 \
--delete-target-dir \
--fields-terminated-by '\t' \
--target-dir /sqoop/TBLS \
--table TBLS

修改字段之间分割符

hdfs上文件存储默认按照逗号进行分隔
–fields-terminated-by

sqoop import \
--connect jdbc:mysql://bigdata12:3306/hive \
--username root \
--password 123456 \
--delete-target-dir \
--fields-terminated-by '\t' \
--table TBLS

修改加载数据的并行度

sqoop 默认加载数据的并行度是4
sqoop没有reduce过程,只有map过程
-m,–num-mappers

sqoop import \
--connect jdbc:mysql://bigdata12:3306/hive \
--username root \
--password 123456 \
--delete-target-dir \
--fields-terminated-by '\t' \
--target-dir /sqoop/TBLS \
-m 1 \
--table TBLS

修改sqoop作业的名字

–mapreduce-job-name

sqoop import \
--connect jdbc:mysql://bigdata12:3306/hive \
--username root \
--password 123456 \
--delete-target-dir \
--fields-terminated-by '\t' \
--target-dir /sqoop/TBLS \
-m 1 \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--table TBLS

筛选数据范围,选择想要的字段

–where
–columns <col,col,col…>

sqoop import \
--connect jdbc:mysql://bigdata12:3306/hive \
--username root \
--password 123456 \
--delete-target-dir \
--fields-terminated-by '\t' \
--target-dir /sqoop/TBLS \
-m 1 \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--columns 'TBL_ID,CREATE_TIME,DB_ID,LAST_ACCESS_TIME,OWNER,OWNER_TYPE' \
--where 'TBL_ID >= 40' \
--table TBLS

hadoop fs -ls 和 hadoop fs -ls / 区别【面试】

hadoop fs -ls 默认查看的是/user/hadoop/
hadoop fs -ls /查看的是根目录下的

同步没有主键的表

同步有主键的表时,并行度是多少都可以,按上面进行导入即可
解决没有主键表导入问题:
1.–split-by =》通过这个参数指定mapreduce按照表中哪个字段进行切片

sqoop import \
--connect jdbc:mysql://bigdata12:3306/bigdata \
--username root \
--password 123456 \
--delete-target-dir \
--target-dir /sqoop/emp \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--split-by 'empno' \
--table emp

2.-m 1 =》并行度设为1,表中所有数据只用一个map task进行操作,不用切片

sqoop import \
--connect jdbc:mysql://bigdata12:3306/bigdata \
--username root \
--password 123456 \
--delete-target-dir \
--target-dir /sqoop/emp \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
-m 1 \
--table emp;

因为sqoop底层走的是mapreduce,mapreduce加载数据有个input阶段,通过inputformat切片来加载数据,如果加载的是数据库,调用的是dbinputformat,切片的数量决定于map task的数量,数据库的切片是按照主键对应的字段进行切分,没有主键时,切片就不知道该怎么划分了,
DataDrivenDBInputFormat(切片): BoundingValsQuery:
SELECT MIN(TBL_ID), MAX(TBL_ID) FROM TBLS WHERE ( TBL_ID>= 40 )表明数据库切片按照主键进行划分
SELECT t.* FROM TBLS AS t LIMIT 1 =》判断mysql里是否有这张表/确认mysql里这张表的存在

处理null值数据(etl)

–null-non-string 不是string类型处理null
–null-string 是string类型处理null

sqoop import \
--connect jdbc:mysql://bigdata12:3306/bigdata \
--username root \
--password 123456 \
--delete-target-dir \
--target-dir /sqoop/emp \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--split-by 'empno' \
--null-non-string 0 \
--null-string '' \
--table emp

sql方式同步数据

-e,–query

sqoop import \
--connect jdbc:mysql://bigdata12:3306/bigdata \
--username root \
--password 123456 \
--delete-target-dir \
--target-dir /sqoop/emp_sql \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--split-by 'empno' \
--null-non-string 0 \
--null-string '' \
--query 'select empno,deptno,ename,sal from emp where $CONDITIONS'

–query --table 不能一起使用
要加上where $CONDITIONS

变成通用性,封装参数

1.shell脚本
2.sqoop --options-file
sqoop --options-file 跟上文件路径

vim emp.opt
import
--connect
jdbc:mysql://bigdata12:3306/bigdata
--username
root
--password
123456
--delete-target-dir
--target-dir
/sqoop/emp_sql
--mapreduce-job-name
'mysql_TBLS2hdfs'
--split-by
'empno'
--query
'select empno,deptno,ename,sal from emp where $CONDITIONS'
sqoop --options-fiel ./emp.opt

3.sqoop job
1.create 创建job
–create
2.list/show 查看job
–list
–show
3.exec 执行job
–exec

sqoop job --create mysql_emp2hdfs \
--import \
--connect jdbc:mysql://bigdata12:3306/bigdata \
--username root \
--password 123456 \
--delete-target-dir \
--target-dir /sqoop/emp_sql \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--split-by 'empno' \
--null-non-string 0 \
--null-string '' \
--query 'select empno,deptno,ename,sal from emp where $CONDITIONS'

sqoop job --list
sqoop job --show mysql_emp2hdfs
sqoop job --exec mysql_emp2hdfs
	删除--delete <job-id>

mysql import (hdfs)=>hive里导表

可以在hive 自动建表:不要用

sqoop import \
--connect jdbc:mysql://bigdata12:3306/bigdata  \
--username root  \
--password 123456 \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--delete-target-dir \
--target-dir /sqoop/emp_sqoop \
-m 1 \
--query 'select empno,deptno,ename,sal from emp where $CONDITIONS ' \
--hive-import \
--hive-overwrite \
--create-hive-table \
--hive-database bigdata_hive \
--hive-table emp_sqoop 

把mysql数据同步到hive里普通表

sqoop import \
--connect jdbc:mysql://bigdata12:3306/bigdata  \
--username root  \
--password 123456 \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--delete-target-dir \
--target-dir /sqoop/emp_tmp \
--fields-terminated-by ',' \
-m 1 \
--query 'select * from emp where $CONDITIONS ' \
--hive-import \
--hive-overwrite \
--hive-database bigdata_hive \
--hive-table emp_tmp 

把mysql数据同步到hive里的分区表

sqoop import \
--connect jdbc:mysql://bigdata12:3306/bigdata  \
--username root  \
--password 123456 \
--mapreduce-job-name 'mysql_TBLS2hdfs' \
--delete-target-dir \
--target-dir /sqoop/emp_tmp \
--fields-terminated-by '\t' \
-m 1 \
--query 'select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=20 and $CONDITIONS ' \
--hive-import \
--hive-overwrite \
--hive-database bigdata_hive \
--hive-table emp_sqoop_p \
--hive-partition-key deptno \
--hive-partition-value 20

通用性shell标本

if [ $# -lt 4 ];then
	echo "$0 use sync mysql 2 hive"
	echo "USAGE:$0 mysqldb sql hivedb hivetable"
	exit 1;
fi
#mysql parm
mysqldb=$1
sql="$2"

#hive parm
hivedb=$3
hivetable=$4

MySQL_URL="jdbc:mysql://bigdata12:3306/bigdata"
MySQL_USER=root
MySQL_PASSWD=123456
FIELDS_TERMINATED=","

sqoop import \
--connect ${MySQL_URL} \
--username ${MySQL_USER} \
--password ${MySQL_PASSWD} \
--mapreduce-job-name 'mysql2hive' \
--delete-target-dir \
--target-dir /sqoop/emp_tmp \
--fields-terminated-by ${FIELDS_TERMINATED} \
-m 1 \
--query "${sql} and \$CONDITIONS" \
--hive-import \
--hive-overwrite \
--hive-database ${hivedb} \
--hive-table ${hivetable}

测试:
./mysql2hive bigdata “select * from emp where deptno=20” bigdata_hive emp_tmp

数据导出 export

不管是hdfs还是hive都是基于hdfs路径导入到mysql里面
前提mysql里面这张表一定要存在

sqoop export \
--connect jdbc:mysql://bigdata12:3306/bigdata  \
--username root  \
--password 123456 \
--table emp_hdfs \
--mapreduce-job-name 'hdfs2mysql' \
--fields-terminated-by ',' \
--export-dir /user/hive/warehouse/bigdata_hive.db/emp/* 

开启历史日志

1.mapreduce job 历史日志 :
1. jobhistory 服务开启
mapreduce.jobhistory.address 0.0.0.0:10020

mapreduce.jobhistory.address bigdata12:10020 mapreduce.jobhistory.webapp.address bigdata12:19888
	2. 日志收集 
yarn.log-aggregation-enable true yarn.log.server.url http://bigdata12:19888/jobhistory/logs yarn.log-aggregation.retain-seconds 259200
  1. jobhistory 服务开启
    mapred historyserver [bigdata32]
    mapred --daemon start historyserver
  2. 日志收集
    yarn timelineserver [bigdata33]
    yarn --daemon start timelineserver

幂等性 : 多次操作 数据结果是不变的

mysql =》 hive =》 hive-overwrite
hive => mysql 幂等性 如何解决?
删掉表重新导出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值