• sqoop总结


    1.数仓模型

    1.1建模方法

    ER模型:

    ​ 常用于OLTP数据库建模

    维度模型:

    ​ 面向分析场景而生;对称易扩展

    1.2星型/雪花

    星型模型:

    ​ 一个事实表+多个维度表;事实表和维度表通过主键外键相连;

    ​ 数据冗余;查询逻辑简单,查询性能高

    雪花模型:

    ​ 部分维度表没有直接连到事实表;

    ​ 去冗余;查询逻辑难,查询性能低;

    星座模型:

    ​ 多个事实表+多个维度表

    总结:

    数仓多使用星型模型构建底层数据hive表, 通过冗余来建好查询次数从而提高查询效率; 对olap分析引擎友好.

    雪花模型在关系型数据库mysql,oracle中较为常见,特别是电商的数据库表.

    2.sqoop

    导入导出:

    ​ 关系数据库(mysql,oracle)

    ​ Hadoop的hdfs,hive,hbase等

    list

    sqoop list-databases \
    --connect jdbc:mysql://ip:3306/ \
    --username 用户名 \
    --password 密码 \
    
    sqoop list-tables \
    --connect jdbc:mysql://ip:3306/库名 \
    --username 用户名 \
    --password 密码
    

    import

    从关系型数据库导入hdfs(包括hive,hbase), 如果导入的是hive,没有表它会自动创建

    导入hdfs

    ##mysql导入hdfs
    
    sqoop import \
    --connect jdbc:mysql://ip:3360/库名 \
    --username root \
    --password root@123 \
    --target-dir hdfs://summer/apps/hive/warehouse/a.db/user_label \ ##指定hdfs表目录 
    --fields-terminated-by '^' \  ##设定导入数据后每个字段分隔符,默认是分号(;)分隔
    --lines-terminated-by '\n' \  ##设定导入数据后每行的分隔符
    --m 1 \   #并发的map数量为1,默认值为4
    --null-string '\\N'    ##导入字段为空时,用指定字符进行替换
    

    导入hive表

    ##导入hive表
    ##需要增加声明 --hive-import
    
    sqoop import \
    --connect jdbc:mysql://ip:3306/库名
    --username root \
    --password root@123 \
    --table test_user_label
    --hive-import \   ##导入hive表声明
    --m 1 
    

    增量导入hive表

    ①append模式,指定一个递增的列

    --incremental append  --check-column num_id --last-value 0 
    ##增量导入append模式: 
    ##必须要有incremental,check-column,last-value
    ##而且append不能与--hive-等参数同时使用
    
    sqoop import \
    --connect jdbc:mysql://ip:3306/库名 \
    --username root \
    --password root@123 \
    --table test_user_table \
    --target-dir hdfs://summer/apps/hive/warehouse/a.db/user_label \
    --fields-terminated-by '^' \ 
    --incremental append \
    --check-column id \
    --last-value 1208
    

    ②lastmodified模式, 根据时间戳

    --incremental lastmodified --check-column created --last-value '2018-02-01 11:0:00' 
    ##只导入create字段比'2018-02-01 11:0:00'更大的数据
    
    ##增量导入lastmodified模式: 
    ##lastmodified模式必须指定--append(追加)还是要--merge-key(合并)
    
    sqoop import \
    --connect jdbc:mysql://ip:3306/库名 \
    --username root \
    --password root@123 \
    --table test_user_table \
    --target-dir hdfs://summer/apps/hive/warehouse/a.db/user_label \
    --fields-terminated-by '^' \ 
    --incremental lastmodified \
    --check-column last_modified \
    --last-value "2017-09-28 22:20:38" \
    --append     ##必须指定一个:append或merge-key
    

    export

    从hdfs(hive和hbase)导入到关系型数据库

    sqoop export \
    --connect jdbc:mysql://ip:3306/库名 \
    --username root \
    --password root@123 \
    --table test_user_table \
    --export-dir /user/news \
    --input-fields-terminated-by "\t" \
    --m 1
    

    codegen

    将关系型数据库中映射为一个java类,该类中有各列对应的各个字段

    sqoop codegen \
    --connect jdbc:mysql://ip:3306/库名 \
    --username root \
    --password root@123 \
    --table user_test_table \
    --bindir /home/test \
    --class-name HelloSummer \
    
    

    create-hive-table

    生成与关系数据库结构对应的hive表结构

    sqoop create-hive-table \    
    --connect jdbc:mysql://ip:3306/库名 \
    --username root \
    --password root@123 \
    --table user_test_table \     # 关系数据库表名
    --hive-table hive_user_table  # 要创建的hive表名
    
    参数 含义
    --hive-home Hive的安装目录,可以通过该参数覆盖掉默认的Hive目录
    --hive-overwrite 覆盖掉在Hive表中已经存在的数据
    --create-hive-table 默认是false,如果目标表已经存在了,那么创建任务会失败
    --hive-table 要创建的hive表
    --table 关系数据库的表名

    eval

    快速运行下sql将结果显示在控制台

    sqoop eval \
    --connect jdbc:mysql://ip:3306/库名 \
    --username root \
    --password root@123 \
    --query "select * from user limit 2"   # query后为查询的sql语句
    

    import-all-tables

    ​ 将RDBMS中所有表导入hdfs,每个表对应一个hdfs目录

    sqoop import-all-tables \
    --connect jdbc:mysql://ip:3306/库名
    --username root \
    --password root@123 \
    --warehouse /all_tables
    

    job

    生成一个sqoop任务,不会立即执行,需要手动执行

    ##生成一个job
    
    sqoop job \
    --create firstTestJob --import-all-tables \
    --connect jdbc:mysql://ip:3306/库名 \
    --username root \
    --password root@123 \
    
    ##查看所有job
    sqoop job \
    --list
    
    
    ##执行一个job
    sqoop job \
    --exec firstTestJob             #exec后是要执行的job名
    

    merge

    将hdfs中不同目录下面的数据合并在一起放入指定目录中

    sqoop merge \
    --new-data /test/new \
    --onto /test/old \
    --target-dir /test/meged \
    --jar-file /home/user/myUser.jar \
    --class-name myUser \
    --merge-key id
    

    metastore

    记录sqoop job的元数据信息,不启动则job元数据的存储目录为~/.sqoop,可在sqoop-site.xml中修改

    ##启动sqoop的metastore服务
    sqoop metastore
    
    
    ## --shutdown 关闭metastore
    
  • 相关阅读:
    socket server的N种并发模型
    进程、线程以及Goroutine的区别
    分布式从ACID、CAP、BASE的理论推进
    epoll的理论与IO阻塞机制
    golang面试题知识点总结
    golang中如何进行项目模块及依赖管理
    面对golang中defer,要注意什么?
    Kaggle 学习之旅
    推荐在线学习读书网站
    k8s 的 dashboard 的实践
  • 原文地址:https://www.cnblogs.com/ShyPeanut/p/15848906.html
Copyright © 2020-2023  润新知