重温大数据---协作框架Sqoop详解

接下来讲Sqoop,Flume,Oozie,Hue。这几个小东西在我初学大数据的时候就了给我坚持的理由,为什么呢?因为简单啊!?当然我这话是针对于使用以及对框架的认识。大佬勿喷。话不多少直接进入主题–Sqoop。

Hadoop协作框架

为什么我们需要使用各种协作框架来进行开发?存在即合理!对于下面的一个需求,是我们使用这些框架的最佳例子。

大数据最常见的一个应用就是企业需要对日志类型的海量数据进行分析

  • 我们需要 hdfs存储文件
  • mr处理文件清洗数据 , hive - hql分析数据

抛出三个问题:

  • 第一个问题
    hdfs的文件来源哪里?

现实数据来源两个方面
* RDBMS(Oracle,MySQL,DB2…) -> sqoop(SQL to HADOOP)
* 文件(apache,nginx日志数据) -> Flume(实时抽取数据)

第二个问题
对数据的分析任务Job,至少都是上千(互联网公司)如何调度?

什么执行,多长执行一次,执行频率
某一些业务的分析,需要许多job任务共同完成,相互依赖关系 ,工作流如何调度呢 ?–>Oozie

第三个问题
hadoop 2.x生态系统中重要的框架,如何进行监控?

统一WEB UI界面,管理框架,监控框架—>Hue

Sqoop

Sqoop:SQL-to-Hadoop
sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。本质就是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序。这也是Sqoop的底层原理。

  • 连接传统关系型数据库和Hadoop的桥梁

  • 把关系型数据库的数据导入到Hadoop与其相关的系统(如HBase和Hive)中

  • 把数据从Hadoop系统里抽取并导出到关系型数据库里

  • 利用MapReduce加快数据传输速度

  • 批处理方式进行数据传输
    在这里插入图片描述
    Sqoop核心的功能有两个:

  • 导入

  • 导出

导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统

导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等 Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。

Sqoop配置使用

配置

修改配置文件



Sqoop的底层是交给MR在执行,所以它的配置非常简单,只需要指订HCH,HMH(简写)就ok!

使用

注意:需要把 mysql-connector-java-5.1.27-bin.jar 放到sqoop的lib目录下面。
解释:sqoop在运行时会产生java代码,代码的内容实质上就是就是往数据库中插入数据。

查看帮助

./sqoop help xx

usage: sqoop list-tables [GENERIC-ARGS] [TOOL-ARGS]

Common arguments:
   --connect <jdbc-uri>                         Specify JDBC connect
                                                string
   --connection-manager <class-name>            Specify connection manager
                                                class name
   --connection-param-file <properties-file>    Specify connection
                                                parameters file
   --driver <class-name>                        Manually specify JDBC
                                                driver class to use
   --hadoop-home <hdir>                         Override
                                                $HADOOP_MAPRED_HOME_ARG
   --hadoop-mapred-home <dir>                   Override
                                                $HADOOP_MAPRED_HOME_ARG
   --help                                       Print usage instructions
-P                                              Read password from console
   --password <password>                        Set authentication
                                                password
   --password-alias <password-alias>            Credential provider
                                                password alias
   --password-file <password-file>              Set authentication
                                                password file path
   --relaxed-isolation                          Use read-uncommitted
                                                isolation for imports
   --skip-dist-cache                            Skip copying jars to
                                                distributed cache
   --username <username>                        Set authentication
                                                username
   --verbose                                    Print more information
                                                while working

?查看有哪些数据库

./sqoop list-databases --connect jdbc:mysql://192.168.1.205:3306 --username root --password root

Sqoop命令的三个核心参数

bin/sqoop list-databases
–connect jdbc:mysql://master:3306/数据库名
–username root
–password root

导入导出核心内容:

数据导入流程

  • 得到表的元数据
  • 提交map任务


例子?

bin/sqoop import \
--connect jdbc:mysql://master:3306/test \
--username root \
--password root \
--table my_user

注意:不指定写出目录的话,在hdfs的当前用户目录下面。

	bin/sqoop import \
	--connect jdbc:mysql://master:3306/test \
	--username root \
	--password root \
	--table my_user \
	--target-dir /user/sqoop/imp_my_user \
	--num-mappers 1

设置map个数为1 。target-dir指定导入数据到 /user/sqoop/imp_my_user 目录下。
此场景为MySQL-----> HDFS

控制文件格式

前面提过数据存储格式

  • textfile

  • orcfile

  • parquet

      例子?
    
      // 导入到hdfs使用parquet文件存储格式i
      bin/sqoop import \
      --connect jdbc:mysql://master:3306/test \
      --username root \
      --password 123456 \
      --table my_user \
      --target-dir /user/sqoop/imp_my_user_parquet \
      --fields-terminated-by ',' \
      --num-mappers 1 \
      --as-parquetfile
      
       // 指定列导入   
      bin/sqoop import \
      --connect jdbc:mysql://master:3306/test \
      --username root \
      --password root \
      --table my_user \
      --target-dir /user/sqoop/imp_my_user_column \
      --num-mappers 1 \
      --columns id,account
      
      * 在实际的项目中,通常需要处理的数据,需要在导入数据时进行初步清洗和过滤。
      例子?
      
      	bin/sqoop import \
      	--connect jdbc:mysql://master:3306/test \
      	--username root \
      	--password 123456 \
      	--query  'select id, account from my_user where $CONDITIONS' \
      	--target-dir /user/sqoop/imp_my_user_query \
      	--num-mappers 1
      	
      注意:使用query时,必须指定where语句(where $CONDITIONS')如果你有其他条件,你可以and连接。
      >>>>>>>>>>>>>>>>>import hdfs : compress >>>>>>>>>>>>>>>>>>、
      前提:压缩库你得配置编译源码Snappy
      bin/sqoop import \
      --connect jdbc:mysql://master:3306/test \
      --username root \
      --password 123456 \
      --table my_user \
      --target-dir /user/sqoop/imp_my_sannpy \
      --delete-target-dir \
      --num-mappers 1 \
      --compress \
      --compression-codec org.apache.hadoop.io.compress.SnappyCodec \
      --fields-terminated-by '\t'
    
      >>>>>>>>>>>>>>>>>import hdfs  increment>>>>>>>>>>>>>>>>>>
      增量数据的导入
      	有一个唯一标识符,通常这个表都有一个字段,类似于插入时间createtime
      
      
      Incremental import arguments:
         --check-column <column>        Source column to check for incremental
                                        change
         --incremental <import-type>    Define an incremental import of type
                                        'append' or 'lastmodified'
         --last-value <value>           Last imported value in the incremental
                                        check column		
      例子?
      bin/sqoop import \
      --connect jdbc:mysql://master:3306/test \
      --username root \
      --password 123456 \
      --table my_user \
      --target-dir /user/sqoop/imp_my_incr \
      --num-mappers 1 \
      --incremental append \
      --check-column id \
      --last-value 4
      
      这里指定了 last-value意思是导入的数据从4开始生效。
      
      1 xx
      2 oo
      3 pp
      4 qq
      5 xx
      实际导入的是
      5 xx
      
      >>>>>>>>>>>>>>>>>import hdfs direct  直接从mysql导出数据(就是快点)>>>>>>>>>>>>>>>>>>
      bin/sqoop import \
      --connect jdbc:mysql://master:3306/test \
      --username root \
      --password 123456 \
      --table my_user \
      --target-dir /user/sqoop/imp_my_incr \
      --num-mappers 1 \
      --delete-target-dir \
      --direct 
    

导出数据流程

	>>>>>>>>>>>>>>>>>导出Mysql表到文件系统 >>>>>>>>>>>>>>>>>>
	例子?
	bin/sqoop export \
	--connect jdbc:mysql://master:3306/test \
	--username root \
	--password 123456 \
	--table my_user \
	--export-dir /user/sqoop/exp/user/ \
	--num-mappers 1




	>>>>>>>>>>>>>>>>>导入到Hive >>>>>>>>>>>>>>>>>>

	例子?	
	bin/sqoop import \
	--connect jdbc:mysql://master:3306/test \
	--username root \
	--password 123456 \
	--table my_user \
	--fields-terminated-by '\t' \
	--delete-target-dir \
	--num-mappers 1 \
	--hive-import \
	--hive-database default \
	--hive-table user_hive
	
	
	>>>>>>>>>>>>>>>>>导出到Hive >>>>>>>>>>>>>>>>>>

	bin/sqoop export \
	--connect jdbc:mysql://master:3306/test \
	--username root \
	--password 123456 \
	--table my_user2 \
	--export-dir  /user/hive/warehouse/user_hive \
	--num-mappers 1 \
	--input-fields-terminated-by '\t'
	
     就把数据目的地换成了Hive表在HDFS上的位置。

执行文件

sqoop也支持类似与Hive的sql脚本执行功能。


总结

sqoop没有过多高深的东西,说了那么多核心内容也就如下图,下图能掌握就OK了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值