Sqoop详解

  1. Sqoop介绍
    Sqoop是在hadoop和数据库之间传输大量数据的工具
    原理:将导入导出命令翻译成MR成功徐来实现,在翻译出的MR中主要是对inputformat和outputformat进行定制。

  2. 安装与配置
    1)解压安装 (这里以sqoop1.4.7为例)
    2)修改配置文件
    重命名文件mv sqoop-env-template.sh sqoop-env.sh
    修改 sqoop-env.sh
    export HADOOP_COMMON_HOME=/home/admin/modules/hadoop-2.7.2 export HADOOP_MAPRED_HOME=/home/admin/modules/hadoop-2.7.2 export HIVE_HOME=/home/admin/modules/apache-hive-1.2.2-bin
    3)拷贝jdbc驱动
    拷贝 jdbc 驱动到 sqoop 的 lib 目录下
    4)验证sqoop
    bin/sqoop version 出现Sqoop 1.4.7(警告可以暂时忽略)算成功
    5)测试sqoop是否能连接数据库
    bin/sqoop list-databases --connect jdbc://mysql://mysqlName:3306/ --username root --password 123456

  3. sqoop的使用案例
    1)导入数据
    在sqoop中导入是指从非大数据集群(RDMS)向大数据集群(HDFS,HIVE,HBASE)中传入数据,即使用import关键字
    (1)RDMS到HDFS

    第一步:在mysql中新建一张表,并插入一些数据
    $ mysql -uroot -p123456
    mysql> create database company;
    mysql> create table company.staff(id int(4) primary key not null auto_increment, name
    varchar(255), sex varchar(255));
    mysql> insert into company.staff(name, sex) values('Thomas', 'Male');
    mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');
    第二步:导入数据
    (1)全部导入
    bin/sqoop import \
    --connect jdbc:mysql://hadoop01:3306/company \
    --username root \
    --password 123456 \
    --table staff \
    --target-dir /user/company \
    --delete-target-dir \
    --num-mappers 1\
    --fields-terminated-by "\t"
    (2)查询导入
    bin/sqoop import \
    --connect jdbc:mysql://hadoop01:33-6/company \
    --username root \
    --password 123456 \
    --target-dir /hadoop/testdata/company \
    --delete-target-dir \
    --num-mappers 1\
    --fields-terminated-by "\t" \
    --query 'select name,sex from staff where id <= 1 and $CONDITIONS;'
    提示1:必须在where后面加‘$CONDITIONS’,如果query后使用的是双引号,则$CONDITIONS前必须加转义符。
    提示2:--query选项不能同时与--table选项使用
    (3)导入指定列
    bin/sqoop import \
    --connect jdbc:mysql://hadoop01:3306/company \
    --username root \
    --password 123456 \
    --target-dir /hadoop/textdata/company \
    --delete-target-dir \
    --num-mappers 1\
    --fields-terminated-by "\t"
    --columns id,sex \
    --table staff
    提示:columns中如果有多列要用逗号分隔,中间不要添加空格
    (4)使用sqoop关键字筛选查询导入数据where
     bin/sqoop import \
    --connect jdbc:mysql://linux01:3306/company \
    --username root \
    --password 123456 \
    --target-dir /user/company \
    --delete-target-dir \
    --num-mappers 1 \
    --fields-terminated-by "\t" \
    --table staff \
    --where "id=1"
    提示:sqoop可以使用sqoop import -D property.name=property.value这样的方式加入执行任务的参数,多个参数用空格隔开。
    

    (2)RDBMS到HIVE

     bin/sqoop import \
    --connect jdbc:mysql://linux01:3306/company \
    --username root \
    --password 123456 \
    --table staff \
    --num-mappers 1 \
    --hive-import \
    --fields-terminated-by "\t" \
    --hive-overwrite \
    --hive-table staff_hive
    提示:该过程分为两步,第一步是将数据导入到HDFS,第二步将导入到hdfs的数据迁移到hive仓库,第一步默认的临时目录是/user/admin/表名
    

    2)导出数据
    在sqoop中,导出是指从hdfs、hive、hbase向RDBMS中传输数据使用export
    (1)hive/hdfs 到RDBMS

    bin/sqoop export \
    --connect jdbc:mysql://hadoop01:3306/company \
    --username root \
    --password 123456 \
    --table staff \
    --num-mappers 1 \
    --export-dir /hive/warehouse/staff_hive \
    --input-fields-terminated-by "\t"
    提示:msyql中表不存在不会自动创建
    

    3)脚本打包
    使用过opt格式的文件打包sqoop命令,然后执行

    (1)创建一个.opt文件
    touch opt/job_hdfs2drdbms.opt
    (2)编写sqoop脚本
    export
    --connect
    jdbc:mysql://hadoop01:3306/company
    --username
    root
    --password
    123456
    --table
    staff
    --num-mappers
    1
    --export-dir
    /hive/warehouse/staff_hive
    --input-fields-terminated-by
    "\t"
    (3)执行脚本
    bin/sqoop --options-file opt/job_hdfs2rdbms.opt
    
  4. sqoop的常用命令和参数
    1)常用命令列举
    import ImportTool 将数据导入到集群
    export ExportTool 将集群数据导出
    codegen CodeGenTool 获取数据库中某张表数据生成java并打包jar
    create-hive-table CreateHiveTableTool 创建hive表
    eval EvalSqlToop 查看SQL执行结果
    import-all-tables ImportAllTablesTool 导出某个数据库下所有表到hdfs
    job JobTool 生成一个个sqoop的任务
    list-databases 列出所有数据库名
    list-tables 列出某个数据库下所有表
    merge 将hdfs中不同目录下面的数据合在一起,并存放在指定目录中
    metastore 记录sqoopjob的元数据信息
    2)命令&参数详解
    公用参数,就是大多数命令都支持的参数
    (1)公用参数:数据库连接
    –connect、–connection-manager指定要使用的连接管理类
    –driver jdbc的driver class
    –password --username连接数据库的用户名和密码
    –verbose 在控制台打印出详细信息
    (2)公用参数:import
    –enclosed-by 给字段值前后加上指定的值
    –escaped-by 对字段中的双引号加转义符
    –fields-terminated-by设定某个字段是以扫描符号作为结束,默认是逗号
    –lines-terminated-by设定每行之间的分隔符,默认是"\n"
    (3)公用参数export
    –input-enclosed-by 对字段值前后加上指定字符
    –input-dscaped-by 对含有转义符的字段做转义处理
    –input-fields-terminated-by字段自建的分隔符
    –input-lines-terminated-by行之间的分隔符
    (4)公用参数 hive
    –hive-delims-replacement 用自定义的字符串替换掉数据中的\r\n等字符
    –hive-drop-import-delims 再导入数据到hive时,去掉数据中\r\n等字符
    –map-column-hive 生成hive表时,可以更改生成字段的数据类型给
    –hive-partition-key创建分区,后面直接跟分区名,分区字段默认string
    –hive-partition-value导入数据时,指定某个分区的值
    –hive-home hive的安装目录,可以覆盖之前的默认配置的目录
    –hive-import将数据从关系数据库中导入hive表中
    –hive-overwrite 覆盖掉hive表中已经存在的数据
    –create-hive-table默认是false,如果目标存在,创建任务失败
    –hive-table 后面接要创建的hive表,默认使用过Mysql的表名
    –table指定关系数据库的表名

你可能感兴趣的:(sqoop)