sqoop笔记
Posted qq_47721411
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
2. 日志收集
yarn.log-aggregation-enable true yarn.log.server.url http://bigdata12:19888/jobhistory/logs yarn.log-aggregation.retain-seconds 259200
- jobhistory 服务开启
mapred historyserver [bigdata32]
mapred --daemon start historyserver - 日志收集
yarn timelineserver [bigdata33]
yarn --daemon start timelineserver
幂等性 : 多次操作 数据结果是不变的
mysql =》 hive =》 hive-overwrite
hive => mysql 幂等性 如何解决?
删掉表重新导出
以上是关于sqoop笔记的主要内容,如果未能解决你的问题,请参考以下文章