sqoop入门

Sqoop产生背景

    1)RDBMS ==》Hadoop
        file ==》load hive
        shell==》file==》hdfs
        mapreduce:inputformat outputformat
        
    2)Hadoop ==》RDBMS
        MapReduce:TextInputFormaat DBoutputFormat
    
    存在的问题
        1)MR麻烦
        2)效率低:新的业务线 写一个MR
        
    ==》抽取一个框架
        如果要实现一个数据迁移的框架;
        1)RDBMS层面:首先想到驱动Driver还有username、password、url、database、table、sql
        2)Hadoop层面:hdfs、path、分隔符、mappers、reduces
        3)扩展一:当有一个新的业务线介入以后,那么我们只需要将新的业务线对应的参数传递给mapreduce即可
            A)hadoop jar的方式来提交
            B)动态的根据业务线来传入参数
        4)扩展二:ok了吗?我们要追求工匠精神
            思路是什么?==》WebUI+DB 以节目配置的形式来展现给用户也就是UIUE
            可以使用Spring Boot微服务构建大数据平台         

Sqoop概述

    官方网站:http://sqoop.apache.org/
    Apache Sqoop(TM)是一个工具,用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效地传输大量数据。
    注意,Sqoop1与Sqoop2不兼容;Sqoop2功能不完整,不适合生产部署。
    RDBMS<==>Hadoop(HDFS/HIVE)
    
    Sqoop:SQL-to-Hadoop
    连接传统数据库到Hadoop之间的一个桥梁
    sqoop入门_第1张图片
        MapReduce:一定有Mappr和Reduce吗?不一定
            使用MapReduce来完成导入操作;是否需要reduce。不一定;不做聚合类的操作就不需要
    Sqoop底层:一个读写的操作,只需要map就可以搞定,不需要reduce
    
    Sqoop有两个版本:1.x     2.x(1.99开头)

Sqoop1架构

sqoop入门_第2张图片
    command
    Sqoop
    Enterprise Data Warehouse数据仓库
    Document Based Systems基于文本的文档
    Relational Database 关系型数据库
    图有缺陷,图中应该有多个map task(可以手动控制map的个数)

Sqoop2架构

    sqoop入门_第3张图片
    Sqoop Server上UI; Connectors和Metedata里存有配置信息    
    Sqoop2里有Reduce Task

Sqoop部署:sqoop-1.4.6

    下载解压 配置环境变量
    

[hadoop@hadoop software]$ tar -zxvf sqoop-1.4.6.tar.gz -C ../app/
    [hadoop@hadoop sqoop-1.4.6]$ vim ~/.bash_profile 
        #set sqoop environment
        SQOOP_HOME=/home/hadoop/app/sqoop-1.4.7.bin__hadoop-2.6.0
        PATH=$SQOOP_HOME/bin:$PATH
        export SQOOP_HOME PATH
    [hadoop@hadoop sqoop-1.4.6]$ source  ~/.bash_profile 

移动mysql-connector-java-5.1.44.jar包到$SQOOP_HOME/lib目录下
    
 我们要配置的东西都在conf下面

 [hadoop@hadoop conf]$ ll
    total 28
    -rw-rw-r-- 1 hadoop hadoop 3895 Dec 19  2017 oraoop-site-template.xml
    -rw-rw-r-- 1 hadoop hadoop 1404 Dec 19  2017 sqoop-env-template.cmd
    -rwxr-xr-x 1 hadoop hadoop 1345 Dec 19  2017 sqoop-env-template.sh
    -rw-rw-r-- 1 hadoop hadoop 6044 Dec 19  2017 sqoop-site-template.xml
    -rw-rw-r-- 1 hadoop hadoop 6044 Dec 19  2017 sqoop-site.xml
    [hadoop@hadoop conf]$ pwd
    /home/hadoop/app/sqoop-1.4.7.bin__hadoop-2.6.0/conf
    [hadoop@hadoop conf]$ cp sqoop-env-template.sh sqoop-env.sh

需要配置的【用什么配置什么】我们先配置HADOOP_COMMON_HOME HADOOP_MAPRED_HOME HIVE_HOME
    

    #Set path to where bin/hadoop is available
    #export HADOOP_COMMON_HOME=

    #Set path to where hadoop-*-core.jar is available
    #export HADOOP_MAPRED_HOME=

    #set the path to where bin/hbase is available
    #export HBASE_HOME=

    #Set the path to where bin/hive is available
    #export HIVE_HOME=

    #Set the path for where zookeper config dir is
    #export ZOOCFGDIR=

 

sqoop命令

 sqoop help就可看到命令帮助

      Available commands:
      codegen            Generate code to interact with database records
      create-hive-table  Import a table definition into Hive
      eval               Evaluate a SQL statement and display the results
      export             Export an HDFS directory to a database table
      help               List available commands
      import             Import a table from a database to HDFS
      import-all-tables  Import tables from a database to HDFS
      import-mainframe   Import datasets from a mainframe server to HDFS
      job                Work with saved jobs
      list-databases     List available databases on a server
      list-tables        List available tables in a database
      merge              Merge results of incremental imports
      metastore          Run a standalone Sqoop metastore
      version            Display version information


      
    演示查看mysql的库

  [hadoop@hadoop conf]$ sqoop list-databases --connect jdbc:mysql://192.168.232.8:3306 --username root --password root
    19/04/04 16:39:09 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
    Thu Apr 04 16:39:10 CST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    information_schema
    hive
    hos
    mysql
    opencart
    performance_schema
    quick_deploy
    sys
    [hadoop@hadoop conf]$

    查看某库的表【只需要在connect后加库名即可】不明白就以sqoop list-tables --help查看帮助即可
    sqoop list-tables --connect jdbc:mysql://192.168.232.8:3306/test --username root --password root

Mysql数据导入到hdfs

【导入导出是基于Hadoop来说的】

    sqoop import \
    --connect jdbc:mysql://192.168.232.8:3306/test 
    --username root 
    --password root
    --table emp
   【-m 1】【-m指定的是map的数量默认四个】
   【--delete-target-dir】【如果文件存在先删除存在的文件夹再导入】
   【--mapreduce-job-name】【设置作业的名字】
   【--colums】【设置指定的列,双引号里的列名以逗号分割】
   【--target-dir】【不指定路径会导入用户根目录下/usr/hadoop/表名】
   【--where】【比如--where "SAL>200"】这里的SAL是表里的一个列名
   【--query】【比如--query "select *from emp where sal>2000 and \$CONDITIONS"】这个是执行sql的参数不能和【--table】一同使用;sql语句中不加[and \$CONDITIONS]会报错。还有另一种写法【比如--query 'select *from emp where sal>2000 and $CONDITIONS'】
    执行会报错:
    坑:java.lang.NoClassDefFoundError:org/json/JSONObject
    拷贝包java-json.jar到$SQOOP_HOME/lib目录下再次执行即可

插入知识点:hadoop fs -ls和hadoop fs -ls / 的区别 hadoop fs -ls默认就是hadoop fs -ls /usr/hadoop/emp
    上诉没有配置路径所以--table emp 会在hadoop fs -ls下面
    
 
    问题;为什么有四个map【hdfs的emp文件夹里会有四个文件】 

导出没有主键的表到HDFS    

假如表salgrage没有主键

    sqoop import \
    --connect jdbc:mysql://192.168.232.8:3306/test 
    --username root 
    --password root
    --table salgrage    
    上诉直接执行会报错【可以通过--split-by解决或者直接使用-m 1来解决】
    --split-by GRADE【需要加上这个参数;GRADE是列名;意思是按照这一列切分数据】
    -m 2
    
    
    1)map=4的时候
    2)没主键如何切分数据
    


导入HDFS文件分隔符及空值的处理


    --fields-terminated-by '\t'    表示以$$为分隔符导入HDFS中
        
    null值的处理
    --null-string '0'【String类型用0来替换】
    --null-non-string ''【不是String类型用空来替换】
    

导入HDFS文件direct模式介绍

【快速从mysql导入hdfs的方式】    
    --direct 【后面不加任何参数】

    原理是利用数据库里的mysqlimport工具比jdbc更加高效
http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.7.0/SqoopUserGuide.html
    注意:Direct-mode import form mysql does not support column指direct模式不支持列指定
    
    Database    version    --direct support?    connect string matches
    HSQLDB    1.8.0+    No    jdbc:hsqldb:*//
    MySQL    5.0+    Yes    jdbc:mysql://
    Oracle    10.2.0+    Yes    jdbc:oracle:*//
    PostgreSQL    8.3+    Yes (import only)    jdbc:postgresql://
    CUBRID    9.2+    NO    jdbc:cubrid:*    

增量导入HDFS文件

Table 5. Incremental import arguments:

Argument    Description
--check-column (col)    Specifies the column to be examined when determining which rows to import. (the column should not be of type CHAR/NCHAR/VARCHAR/VARNCHAR/ LONGVARCHAR/LONGNVARCHAR)
--incremental (mode)    Specifies how Sqoop determines which rows are new. Legal values for mode include append and lastmodified.
--last-value (value)    Specifies the maximum value of the check column from the previous import.--check-column 指定一列
    
--incremental append和--delete-target-dir不能一块用
    
--last-value 以这个列的这个值为标准,导入比这个值大的数据    

eval的使用 

执行一个sql语句;把这个结果在控制台展示出来
    sqoop eval \
    --connect jdbc:mysql://192.168.232.8:3306/test 
    --username root 
    --password root
    --query "select * from emp"

-options-file

-options-file的使用:工作中推荐使用【讲sqoop命令直接封装成一个文件】
    
    vim test.txt【test内容为下列几行】
    
    import 
    --connect 
    jdbc:mysql://192.168.232.8:3306/test 
    --username 
    root 
    --password 
    root
    --table 
    salgrage
    
    
    sqoop执行的时候直接
    sqoop --options-file test.txt

导出HDFS数据到MySQL    

 导出之前需要把empdemo表创建好
    create table empdemo as select * from emp where 1=2;意识是比照emp创建一个空表【没有索引之说;索引在大数据都是鸡肋】
    相同的导入条件每次导入数据;数据就会重复【配合shell脚本手工删除目标数据】
    
    sqoop export \
    --connect jdbc:mysql://192.168.232.8:3306/test 
    --username root 
    --password root
    --table empdemo
    --export-dir /user/hadoop/emp 【要导出的HDFS文件路径】
    -m 1
    
    
    【--update-key】【按照key更新数据】

导入Mysql数据库到Hive表

 sqoop import \
    --connect jdbc:mysql://192.168.232.8:3306/test 
    --username root 
    --password root
    --query "select * from emp"
    
    --hive-import
    --create-hive-table 【在工作当中最好不要自动直接创建;要手动创建表】
    --hive-table emp【指定表名】
    【--hive-overwrite】【覆盖掉重复的数据】
    
    【--hive-partition-key "month"】【分区表导入参数】
    【--hive-partition-value "2019-2"】【分区表导入参数】
    
    cd到$HIVE_HOME/lib里拷贝jar包
    hive-common-1.1.0.jar
    hive-shims-*
    到$SQOOP_HOME/lib下

导出Hive表到MySQL数据库

sqoop export \
    --connect jdbc:mysql://192.168.232.8:3306/test 
    --username root 
    --password root
    --table emp_demo
    --export-dir /user/hive/warehouse/emp_import【hive数据表路径】
    --fields-terminated-by '' 【分隔符】
    -m 1

sqoop job

sqoop job --help 可以查看封装job所需参数【工作中使用sqoop job+crontab】

   创建一个job
    sqoop job --create myjob \
    -- import \【注意这里--后有一个空格】
    --connect jdbc:mysql://192.168.232.8:3306/test 
    --username root 
    --password root
    --query "select * from emp"
    
    执行job
    sqoop job --exec myjob
    
    
   demo 


    1. 创建Job
说明:在创建Job时,使用--password-file参数,而且非--passoword。主要原因是在执行Job时使用--password参数将有警告,并且需要输入密码才能执行Job。当我们采用--password-file参数时,执行Job无需输入数据库密码。

     sqoop  job --create test_job 
    -- import 
    --connect jdbc:mysql://10.96.3.8:3306/lOT_DMPS 
    --username galera --password-file /data/cdh/hive/hiveExternal/sqoopMysqlTest.pwd  
    --table test_etl --target-dir '/data/cdh/hive/hiveExternal/TEST_ETL' 
    --check-column id 
    --incremental append 
    --last-value 1 
    --null-string '\\N' 
    --null-non-string '\\N' 
    --fields-terminated-by '\001'
    --lines-terminated-by '\n' -m 1

2.创建password-file文件

注:sqoop规定密码文件必须放在HDFS之上,并且权限必须为400

(1)echo -n "123456" > sqoopMysqlTest.pwd
(2)hdfs dfs -put sqoopMysqlTest.pwd /data/cdh/hive/hiveExternal

(3)hdfs dfs -chmod 400 /data/cdh/hive/hiveExternal/sqoopMysqlTest.pwd

3.执行job
sqoop job -exec test_job

4.查询job ,主要是查看增量更新字段中每次执行后报错的值

sqoop job -show test_job

5.查看job list
sqoop job --list

6.删除job
sqoop job -delete test_job


小案例:场景: mysq1有emp表,不直接使用mysq1进行统计,而是先将mysq1中的emp表数据通过sqoop抽取到hive中然后使用hive进行统计分析,统计的结果通过sqoop导出MySQL数据库

这是常见的ETL操作 extraction tranformation load

转载于:https://my.oschina.net/u/4005872/blog/3034319

你可能感兴趣的:(sqoop入门)