hadoop之Sqoop

Sqoop原理:

将导入导数命令翻译成MR程序来实现,翻译出的MR主要是针对InputFormat和OutputFormat进行定制的;

sqoop的作用:

利用Mapreduce分布式批处理,加快了数据传输速度,保证了容错性。主要用于hadoop(hive)与关系型数据库之间的数据传递,可以将关系型数据库中的数据导入HDFS中,也可以将HDFS的数据导入关系型数据库中。

sqoop导入:从RDBMS到HDFS,导入单个表,表的每一行被视为HDFS的记录。所有的记录被保存在文本文件的文本数据或者在Avro和序列文件的二进制数据。

sqoop导出:从HDFS导出一组文件到RDBMS。作为输入到sqoop文件包含记录,这被称为在表中的行。那些被读取并解析成一组记录和分隔使用用户指定的分隔符。

Sqoop1存在的问题:

1、基于命令行的操作方式易于出错,且不安全

2、数据传输和数据格式是紧耦合的,这使得connector无法支持所有的数据格式

3、安全密钥是暴露出来的,非常不安全

4、sqoop安装需要root权限

Connector必须符合JDBC模型,并使用通用的JDBC词汇

导入与导出:

https://blog.csdn.net/py_123456/article/details/80761446

导入数据:导入到大数据集群

导入到HDFS:MySQL服务开启,
全部导入:

bin/sqoop import \
       --connect jdbc:mqsql://hadoop112:3306/company \
         --username root \
          --password 111111 \
          --table staff \           #读取数据库表
          --target-dir /user/company \      #将数据导入到指定的HDFS目录下。如果不指定,会默认数据库的表名称
        --delete-target-dir \
        --num-mappers 1 \     #指定map任务并发度
        --fields-terminated-by "\t"

查询到入:

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

在查询语句中CONDITIONS前必须转义

导入指定的列:

bin/sqoop import \
                        --connect jdbc:mysql://hadoop112:3306/company \
                        --username root \
                        --password 111111 \
                        --target-dir /user/company \
                        --delete-target-dir \
                        --num-mappers 1 \
                        --fields-terminated-by "\t" \
                        --cilumns id,sex \   #columns 中如果涉及多列,用逗号分隔,分割时不要添加空格
                        --table staff

使用sqoop关键字筛选查询导入数据:

                       bin/sqoop import \
                       --connect jdbc:mysql://hadoop112:3306/company \
                       --username root \
                       --password 111111 \
                       --target-dir /user/company \
                       --delete-target-dir \
                       --num-mappers 1 \
                       --fields-terminated-by  "\t" \
                       --table staff \
                       --where "id=1"      #关键字筛选

RDBMS到hive:

 bin/sqoop import \
         --connect jdbc:mysql://hadoop112:3306/company \
         --username root \
         --password 111111 \
         --table staff \
         --num-mappers 1 \
         --fields-terminated-by "\t" \
         --hive-import \                                       
         --hive-overwrite \
         --hive-table staff_hive

该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库,第一步默认的临时目录是/user/atguigu/表名
在导入之前先要在hive上创建一张表 ,若是不创建会自动创建
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

导出数据:
hive/HDFS 到RDBMS

bin/sqoop export \
      --connect jdbc:mysql://hadoop112:3306/company \
       --username root \
       --password 111111 \
       --table staff \
       --num-mappers 1 \
       --export-dir /user/hive/warehouse/staff_hive \
        --input-fields-terminated-by "\t"
#mysql 中如果表不存在,不会自动创建

空值?

--hive-inport #导入到hive中,
--target-dir #指定在HDFS中的临时目录
--hive-overwrite #对表中的数据覆盖
--fields-terminated -by #指定数据分隔符。默认是逗号
--input-null-string "\N" --input-null-non-string "\N" #导出时空值转化为\N 用\N 标识为空值
--null-string '\N' --null-non-string '\N' # 导入时空值的处理

【注】文件的存储格式(parquetfile avrodatafile textfile) 默认的是textfile

Sqoop2的改进:

引入sqoop server,集中化管理connector

多种访问方式:CLI,web UI,rest API

引入基于角色的安全机制

Sqoop1VSsqoop2:

优点:sqoop1部署简单

缺点:命令行方式容易出错,格式紧耦合,无法支持所有的数据类型,安全机制不够完善,安装需要root权限,connector必须符合jdbc模型

优点:支持多种交互方式,命令行,webUI ,rest API,connector集中化管理,所有的链接安装在sqoopserver上,完善权限管理机制,connector

规范化,仅仅负责数据的读写

缺点:架构相对较复杂,部署配置也复杂。

你可能感兴趣的:(hadoop之Sqoop)