一、sqoop 操作mysql与hdfs之间数据传输

一、 Sqoop简介


       Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。       Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。       Sqoop2的最新版本是1.99.7。请注意,2与1不兼容,且特征不完整,它并不打算用于生产部署。

二、 Sqoop原理

      将导入或导出命令翻译成mapreduce程序来实现。
      在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

三、Sqoop安装

  1. 安装Sqoop的前提是已经具备Java和Hadoop的环境。
  2. 下载地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/
  3. 上传安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到虚拟机中
  4. 解压sqoop安装包到指定目录,如:
    $ tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/
  5. 修改目录 sqoop
  6. 重命名配置文件 mv sqoop-env-template.sh sqoop-env.sh
  7. 修改配置文件: vim sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2
export HIVE_HOME=/opt/module/hive
# 还有zk、hbase 。。。我这里没有用到就没有配置
  1. 连接mysql测试
    8.1拷贝jdbc驱动到sqoop的lib目录下,如:
    cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib/
    8.2 验证Sqoop
    bin/sqoop help
	出现一些Warning警告(警告信息已省略),并伴随着帮助命令的输出:
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

8.3 测试能否连接数据库

[root@hadoop202 sqoop]# bin/sqoop list-databases --connect jdbc:mysql://hadoop202:3306/ --username root --password root
Warning: /opt/module/sqoop/bin/../../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /opt/module/sqoop/bin/../../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /opt/module/sqoop/bin/../../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /opt/module/sqoop/bin/../../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
19/09/26 02:46:53 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
19/09/26 02:46:53 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/09/26 02:46:53 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hymc
metastore
mysql
performance_schema
spark
test

如上,显示mysql下的所有数据库

四、Sqoop的使用案例


前提数据准备:
CREATE TABLE `test` (
  `s_id` varchar(20) NOT NULL DEFAULT '',
  `s_name` varchar(20) NOT NULL DEFAULT '',
  `s_birth` varchar(20) NOT NULL DEFAULT '',
  `s_sex` varchar(10) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


insert  into `test`(`s_id`,`s_name`,`s_birth`,`s_sex`) 
values ('01','赵雷','1990-01-01','男'),
('02','钱电','1990-12-21','男'),
('03','孙风','1990-05-20','男'),
('04','李云','1990-08-06','男'),
('05','周梅','1991-12-01','女'),
('06','吴兰','1992-03-01','女'),
('07','郑竹','1989-07-01','女'),
('08','王菊','1990-01-20','女');

1、导入数据
       在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。


1.1 RDBMS到HDFS

      1.1.1 全部导入到hdfs:// user/ test

bin/sqoop import --connect jdbc:mysql://hadoop202:3306/spark --username root --password root --table test --target-dir /user/test --delete-target-dir --num-mappers 1 --fields-terminated-by "\t"

      1.1.2 sql查询导入

bin/sqoop import \
--connect jdbc:mysql://hadoop202:3306/spark \
--username root \
--password root \
--target-dir /user/test1 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'SELECT s_id,s_name FROM test WHERE s_id=01 and $CONDITIONS;'

提示:must contain ' C O N D I T I O N S ′ i n W H E R E c l a u s e . 如 果 q u e r y 后 使 用 的 是 双 引 号 , 则 CONDITIONS' in WHERE clause. 如果query后使用的是双引号,则 CONDITIONSinWHEREclause.query使CONDITIONS前必须加转移符,防止shell识别为自己的变量。

      1.1.3 导入指定列
            这个其实用上面的sql方式,查询指定列即可实现效果

bin/sqoop import \
--connect jdbc:mysql://hadoop202:3306/spark \
--username root \
--password root \
--target-dir /user/test2 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns s_id,s_name \
--table test

      1.1.4 使用sqoop关键字筛选查询导入数据
            结合指定列等同sql方式

$ bin/sqoop import \
--connect jdbc:mysql://hadoop202:3306/spark \
--username root \
--password root \
--target-dir /user/test3 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table test \
--where "s_id>01" 

      1.2 RDBMS到Hive

$ bin/sqoop import \
--connect jdbc:mysql://hadoop202:3306/spark \
--username root \
--password root \
--table test \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table test_hive

      提示:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库,第一步默认的临时目录是/user/rooot/表名

      1.3 RDBMS到Hbase

$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 000000 \
--table company \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

      提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能
解决方案:手动创建HBase表

hbase> create 'hbase_company,'info'



       1.4 追加方式导入数据

      上面的几种导入方式效果是导入数据时需要把之前的清除重新导入,这样无法完成增量追加数据的效果。
      --delete-target-dir:导入前将旧数据删除
      --append:本次导入的数据在目录下形成一个新的文件,追加效果,不能与–delete-target-dir时使用


      1.4.1 追加数据演示

bin/sqoop import --connect jdbc:mysql://hadoop202:3306/spark --username root --password root --target-dir /user/test3 --num-mappers 1 --fields-terminated-by "\t" --table test  --append

如图:在原始数据的基础上新增一个数据文件
在这里插入图片描述
      1.4.2 增量效果追加数据

      上面的操作只是完成了不覆盖之前数据的前提下,新增数据操作,无法完成增量数据操作。

      何为“增量”?
      例如首次导入数据将所有数据导入hdfs中,过了三个月只需要将此三个月的数据导入到hdfs中
解决:那么首先肯定是需要使用如上追加的操作,将这三个月新产生的数据追加到hdfs,使用sql、条件匹配方式、或者将这三个月数据建立一张临时表导入到hdfs等方式。

      方式一:结合导入数据的条件限制与 –-append 参数即可完成

$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 000000 \
--target-dir /user/company \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id >=1 and $CONDITIONS;' \
--append

如where id >= 4 ,换从自己需要筛选范围即可

      方式二:相当于 last_modified <=last-value

bin/sqoop import \
--connect jdbc:mysql://hadoop202:3306/spark \
--username root \
--password root \
--target-dir /user/test1 \
--table test \
--check-column last_modified \
--incremental lastmodified \
--last-value "2019-09-25 15:42:54" \
--m 1 \
--append

      方式三:条件匹配,上述1.1.4 效果

bin/sqoop import --connect jdbc:mysql://hadoop202:3306/spark --username root --password root --target-dir /user/test3 --num-mappers 1 --fields-terminated-by "\t" --table test --where "s_id>01" –append

总结:方式一、三的方式好用



2、导出数据

       2.1 HIVE/HDFS到RDBMS

$ bin/sqoop export \
--connect jdbc:mysql://hadoop202:3306/spark \
--username root \
--password root \
--table test \
--num-mappers 1 \
--export-dir /user/test \
--input-fields-terminated-by "\t"

提示:Mysql中如果表不存在,不会自动创建


       2.2 脚本打包方式数据导出
      使用opt格式的文件打包sqoop命令,然后执行

      2.2.1 创建一个.opt文件

$ mkdir opt
$ cd opt
$ touch job_HDFS2RDBMS.opt

      2.2.2 编写sqoop脚本

$ vi opt/job_HDFS2RDBMS.opt

export
--connect
jdbc:mysql://hadoop202:3306/spark
--username
root
--password
root
--table
test
--num-mappers
1
--export-dir
/user/hive/warehouse/test_hive
--input-fields-terminated-by
"\t"

      2.2.3执行该脚本

$ bin/sqoop --options-file opt/job_HDFS2RDBMS.opt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值