sqoop学习笔记

来源:互联网 发布:济南java工资线 编辑:程序博客网 时间:2024/05/17 00:54

学习sqoop主要从以下几点入手

一 为啥要用sqoop
二 Sqoop到底是啥
三 Sqoop怎么安装
四 Sqoop如何使用


一、为啥要用sqoop,业务场景分析

      
1、公司要做大数据统计分析,采用的是hadoop+zookeeper+flume+hive+kylin
2、财务需要统计数据报表,考虑到kylin的实时性问题,最后解决方案:当天查oracle从库,其他时间查kylin(秒级)。
      所有的基础:数据


二、Sqoop到底是啥

1、Hadoop生态系统中sqoop的位置


2、概念

Sqoop是hadoop家族技能成员中重要的组成部分,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。

“这么牛掰的东西、瞬间感觉春天到了”


3、Sqoop架构



三、Sqoop安装

1、第1步:验证JAVA安装

        java –version 

2、第2步:验证Hadoop的安装

       hadoop -version

3、第三步:安装sqoop
4、下载sqoop

    http://sqoop.apache.org/

5、解压缩

   cd /app/hadoop

  tar -zxvf sqoop-1.4.6.tar.gz

6、配置环境变量

   export SQOOP_HOME=/app/hadoop/sqoop-1.4.6

  export PATH=$PATH:$SQOOP_HOME/bin

7、上传oracle、mysql驱动jar到sqooplib目录下

   mysql-connector-java-5.1.44.jar 

   ojdbc14-10.2.0.4.0.jar

8、${SQOOP_HOME}/conf中执行命令mv sqoop-env-template.sh sqoop-env.sh

9、修改配置文件sqoop-env.sh

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常见参数说明

--connect连接数据库
--username数据库账号
--password数据库密码
--table导入那张表,表名要大写
--target_dir到处目录 使用--query必填
--columns导出指定列
--delete-target-dir \如果目标目录存在,则删除。如果不设置这个,目标目录存在则会报错  
--direct直接导入模式,使用的是关系数据库自带的导入导出工具。官网上是说这样导入会更快
--verbose:打印详细日志
--split-by:按字段分割map,结合参数m进行使用
--hive-import:导入数据至hive
--null-string:源表数据字段为字符且为空时,用指定字符代替
--null-non-string:源表数据字段不为字符且为空时,用指定字符代替
--hive-overwrite覆盖导入,全覆盖
--m几个并发任务同时执行 默认4
--where过滤条件
--query查询导入,where后边必须$CONDITIONS
--check-column(col)用来作为判断的列名,如id
--incremental(mode) append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录
last-value (value)指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值
3、列出mysql数据库中的所有数据库

sqoop list-databases \

--connect jdbc:mysql://localhost:3306/ \

-username root \

-password root 

4、列出mysql所有的表

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

4)创建一个具有相同名字和相同表结构的表

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会自动更新该值为上一次导入的上界

6)Sqoop job

  由于我们表结果时间采用字符串格式、并且没有自增的ID,所以放弃使用,大家可以研究下

7)Crontab shell基本

    通过编写shell脚本、调用linux的crontab定时执行shell脚本,规则:每天凌晨3点执行导入上有一天的数据,所以达不到实时效果,后期可以研究下采用kafka,

8)每天凌晨3点执行shell脚本

0 3 * * * /app/hadoop/sqoop-task/view.sh

9)Shell脚本

1:获取上次执行的时间,读取view.txt,如果不存在做全量更新,之后把最后执行时间写入


10)Hive实时数据同步研究方向


五、sqoop踩过的坑

1This may happen if the user doesnot have DBA privileges. Please check privileges and try again  

解决方案:没有导出权限,需DBA开通

2Imported 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对应的集群服务器加入了数据库白名单就好了。

4Can’t parse input data:’\N’

解决方案:添加参数-input-null-string  '\\N' --input-null-non-string '\\N' 

5org.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指定表名




以上仅是自己在公司业务场景下用到的,其他的如果有什么问题,互相交流