sqoop学习笔记
学习sqoop主要从以下几点入手
一 为啥要用sqoop
二 Sqoop到底是啥
三 Sqoop怎么安装
四 Sqoop如何使用
一、为啥要用sqoop,业务场景分析
二、Sqoop到底是啥
1、Hadoop生态系统中sqoop的位置
2、概念
Sqoop是hadoop家族技能成员中重要的组成部分,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。
“这么牛掰的东西、瞬间感觉春天到了”
3、Sqoop架构
三、Sqoop安装
java –version
hadoop -version
http://sqoop.apache.org/
cd /app/hadoop
tar -zxvf sqoop-1.4.6.tar.gz
export SQOOP_HOME=/app/hadoop/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
mysql-connector-java-5.1.44.jar
ojdbc14-10.2.0.4.0.jar
export HADOOP_COMMON_HOME=/app/hadoop/hadoop-2.7.2
exportHADOOP_MAPRED_HOME=/app/hadoop/hadoop-2.7.2
exportHIVE_HOME=/app/hadoop/apache-hive-2.1.1
四、Sqoop使用
1、查看有哪些参数 >Sqoop help
2、sqoop常见参数说明
sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
-username root \
-password root
sqoop list-tables --connect jdbc:mysql://127.0.0.1/operation --usernameroot --password 123
5、导入mysql表到hive
1)直接导入
sqoopimport --hive-import\
--connectjdbc:oracle:thin:@localhost:1521:DBNAME \
--usernameUSERNAME \
--passwordPASSWORD \
--verbose \
-m 1 \
--table TABLENAME \
--hive-database cashier
2)查询导入,可以自定义字段
sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id \
-m 4 \
--target-dir /user/foo/joinresults \
--hive-databases cashier \
--hive-tabletbl_cashier_number
3)导入指定字段并加入过滤条件
sqoop import \
--hive-import \
--connect jdbc:oracle:thin:@localhost:1521:DBNAME \
--username USERNAME \
--password PASSWORD \
--verbose -m 1 \
--table TABLENAME \
--columns “cashier_no,order_no” \
--where "start_date > '2010-01-01‘ \
--hive-database cashier \
--hive-table tbl_casher_number
sqoopcreate-hive-table \
--connectjdbc:oracle:thin:@//localhost:1521/ORCL\
--usernameDATACENTER\
--password clear\
--tabletablename
5)sqoop增量导入
sqoop import \
--hive-import \
--connectjdbc:oracle:thin:@xxxxx:31521/profile \
--username xxx --password xxx --verbose -m 1 \
--tableLIVE_CASHIER.TBL_PAY_SUPPLIER_INFO \
--hive-database cashier \
--hive-table TBL_PAY_SUPPLIER_INFO
--incrementallastmodified|append \两种模式
--check-column CREATE_TIME \CREATE_TIME必须是日期类型
--last-value ‘2012-06-02 00:00:00’\第一次导入的下界,从第二次开始,sqoop会自动更新该值为上一次导入的上界
由于我们表结果时间采用字符串格式、并且没有自增的ID,所以放弃使用,大家可以研究下
通过编写shell脚本、调用linux的crontab定时执行shell脚本,规则:每天凌晨3点执行导入上有一天的数据,所以达不到实时效果,后期可以研究下采用kafka,
0 3 * * * /app/hadoop/sqoop-task/view.sh
1:获取上次执行的时间,读取view.txt,如果不存在做全量更新,之后把最后执行时间写入
10)Hive实时数据同步研究方向
五、sqoop踩过的坑
1:This may happen if the user doesnot have DBA privileges. Please check privileges and try again
解决方案:没有导出权限,需DBA开通
2:Imported Failed: There is no columnfound in the target tabletbl_pay_supplier_info. Please ensure that your tablename is correct
解决方案:表名要大写,并要指定库
3:网络适配器无法建立连接:The Network Adapter could notestablish the connection
解决方案:把所有hadoop对应的集群服务器加入了数据库白名单就好了。
4:Can’t parse input data:’\N’
解决方案:添加参数-input-null-string '\\N' --input-null-non-string '\\N'
5:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directoryhdfs://CashierHadoop/app/hadoop/sqoop-task/tbl_cashier_refund already exists
解决方案:加入—delete-target_dir
6: When importing a query to Hive,you must specify --hive-table
解决方案:加入—hive-table指定表名
以上仅是自己在公司业务场景下用到的,其他的如果有什么问题,互相交流