sqoop数据工具

第一章 sqoop简介

sqoop 是一款开源的工具,主要用在Hadoop(Hive)与传统的数据库(mysql)间进行数据的传递,可以将HDFS的数据导进关系型数据库中 Sqopp2与1不兼容,且特征不完整,并不用做生产  

第二章 Sqoop原理

将导入或导出命令翻译成MapReduce程序实现

在翻译出的MapReduce中主要是对inputformat和outputformat进行定制

第三章 sqop的简单使用案例

3.1 导入数据

在sqoop中,“导入”概念指:从非大数据集(RDBMS)向大数据集群(HDFS,Hive,Hbase)中传入数据:即导入,即使用import关键字

3.1.1 RDBMS到HDFS


  1. 确定Mysql服务开启正常
  2. 在Mysql中新键一张表并插入一些数据
    ​mysql> create database company; Query OK, 1 row affected (0.00 sec) mysql> create table company.staff(id int(4) primary key not null auto_increment,name varchar(255),sex varchar(255)); Query OK, 0 rows affected (0.00 sec) mysql> insert into company.staff(name,sex) values("Thomas","Male"); Query OK, 1 row affected (0.00 sec) mysql> insert into company.staff(name,sex) values('Catalina','Female'); Query OK, 1 row affected (0.00 sec) ​
  3. 导入数据

    1. 全部导入
      ​sqoop import //导入 {mysql 参数} --connectjdbc:mysql://192.168.100.11:3306/company //连接mysql 数据库 --username root //数据库用户名 --password 123456 //数据库用户密码 --table staff // MySQL数据库被导入表的名字 {Hdfs参数} --target-dir /hive/company //数据导出的hdfs目录 --delete-target-dir //如果存在则删除 --num-mappers 1 //Map的数量 --fields-terminated-by '\t' //指定分隔符 ​
    2. 查询导入
      ​sqoop import --connect jdbc:mysql://192.168.100.11:3306/company --username root --password 123456 --target-dir /hive/company2 --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --query 'select name,sex from staff where id <=1 and $CONDITIONS;' (--query " 双引号 " 使用 \$CONDITIONS 为防止 shell 识别为自己的变量      '单引号' 使用 $CONDITIONS) ​
    3. 当-m 设置的值大于1时,split-by必须设置字段(需要是 int 类型的字段),如果不是 int类型的字段,则需要加上参数
      ​split-by "key" //设置切割主键 ​
    4. 导指定列
      ​sqoop import //数据导入 --connect jdbc:mysql://192.168.100.11:3306/company //jdbc数据库 --username root //数据库用户 --password 123456 //数据库密码 --table staff //数据表 --columns id,sex //列名,如果涉及多列用逗号隔开 --target-dir /hive/company4 \> //hdfs数据导入地址 --delete-target-dir //若hdfs文件存在,则删除 -m 1 // map数量 --fields-terminated-by "\t" //字段分隔符 ​
    5. 使用sqoop关键字查询导入数据
      ​//where sqoop import //导出数据 --connect jdbc:mysql://192.168.100.11:3306/company //jdbc数据库 --username root --password 123456 --table staff --where "id=1" //条件表达式 --fields-terminated-by "\t" --target-dir /hive/company5 --delete-target-dir ​


3.1.2 RDBMS 到Hive

先由mysql将数据导入到hdfs,再由hive将hdfs的数据导入到hive的数据表中

提前在hive中建立hive表

sqoop import 
--connect jdbc:mysql://192.168.100.11:3306/company
--username root
--password 123456
--table staff
-m 1
--hive-import
--fields-terminated-by "\t" //字段分隔符
--hive-overwrite //覆盖
--hive-table staff_hiv //指定数据表的名字
--hive-database dataname //数据库的名字
如果不指定–target-dir,数据会存储在HDFS中的hive/warehouse目录下
对于hive表导入,可以将sql语句写入脚本,以XXX.sql命名

3.1.3 RDBMS 到HBase


3.2 导出数据

3.2.1 Hive 到RDBMS

sqoop export \
--connect jdbc:mysql://hadoop-CDH:3306/test \
--username root \
--password 123456 \
--table mysql_table_name \ //mysql接受数据的表
--export-dir /source_data_path \ //指定要导出数据在hive的目录
--num-mappers 1 \
--input-fields-terminated-by '\t'

3.2.2 HDFS 到RDBMS–connect

语法:
sqoop export \
--connectjdbc \
--username \
--password \
--driver \
--columnscol1,col2,...... 导出到表哪几列
--direct:使用direct导出,速度更快
--export-dir<dir>: 从HDFS哪一个目录导出
-m<n>: 指定mapper个数
--table<table-name>:导出数据库哪一张表
解析输入参数:
--input-enclosed-by<char>: 设置输入字段的封闭字符
--input-escaped-by<char>:设置输入字段的转义字符
--input-fields-terminated-by<char>:HDFS文件字段分隔符
--input-lines-terminated-by<char>:HDFS文件换行符
输出格式化参数:
--enclosed-by<char>: 设置字段封闭符
--escaped-by<char>: 设置转义字符
--fields-terminated-by<char>: 设置每一字段分割符
--lines-terminated-by<char>: 设置每一行结束分割符
--mysql-delimiters:使用mysql默认的分隔符,fields:, lines: \n escaped-by: \
如果在hive表中该字段是字符串且为NULL,然后理解成为NULL而不是\N
--input-null-string<null-string>
如果在hive表中该字段是非字符串类型且为NULL,然后理解成为NULL而不是\N
--input-null-non-string<null-string>
**eg:**
sqoopexport \
--connectjdbc:mysql://hadoop-all-01:3306/hadoop \
--usernamehive \
--passwordhive \
--drivercom.mysql.jdbc.Driver \
--export-dir/user/hive/warehouse/hadoop.db/m_d \
--columns"id,country,city,phone" \
--tabledirector \
--num-mappers2 \
--direct\
--input-fields-terminated-by',' \
--input-null-string'\\N' \
--input-null-non-string'\\N'