zoukankan      html  css  js  c++  java
  • 1.6-1.10 使用Sqoop导入数据到HDFS及一些设置

    一、导数据

    1、import和export

    Sqoop可以在HDFS/Hive和关系型数据库之间进行数据的导入导出,其中主要使用了import和export这两个工具。这两个工具非常强大,
    提供了很多选项帮助我们完成数据的迁移和同步。比如,下面两个潜在的需求:
    
    1、业务数据存放在关系数据库中,如果数据量达到一定规模后需要对其进行分析或同统计,单纯使用关系数据库可能会成为瓶颈,
    这时可以将数据从业务数据库数据导入(import)到Hadoop平台进行离线分析。
    
    2、对大规模的数据在Hadoop平台上进行分析以后,可能需要将结果同步到关系数据库中作为业务的辅助数据,这时候需要
    将Hadoop平台分析后的数据导出(export)到关系数据库。

    [root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help import
    [root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help export


    2、import参数

    ##sqoop通用参数
        --connect <jdbc-uri>:指定JDBC连接字符串。
        --connection-manager <class-name>:指定要使用的连接管理器类。
        --driver <class-name>:手动指定要使用的JDBC驱动程序类。
        --hadoop-mapred-home <dir>:覆盖$ HADOOP_MAPRED_HOME。
        --help:打印使用说明。
        --password-file:为包含认证密码的文件设置路径。
        -P:从控制台读取密码。
        --password <password>:设置验证密码。
        --username <username>:设置验证用户名。
        --verbose:在运行时打印更多信息。
        --connection-param-file <filename>:提供连接参数的可选属性文件。
        --relaxed-isolation:将mapper的连接事务隔离设置为只读。
    
    
    
    ##import参数
        --append    将数据追加到HDFS上一个已存在的数据集上
        --as-avrodatafile    将数据导入到Avro数据文件
        --as-sequencefile    将数据导入到SequenceFile
        --as-textfile    将数据导入到普通文本文件(默认)
        --boundary-query <statement>    边界查询,用于创建分片(InputSplit)
        --columns <col,col,col…>    从表中导出指定的一组列的数据
        --delete-target-dir    如果指定目录存在,则先删除掉
        --direct    使用直接导入模式(优化导入速度)
        --direct-split-size <n>    分割输入stream的字节大小(在直接导入模式下)
        --fetch-size <n>    从数据库中批量读取记录数
        --inline-lob-limit <n>    设置内联的LOB对象的大小
        -m,--num-mappers <n>    使用n个map任务并行导入数据
        -e,--query <statement>    导入的查询语句
        --split-by <column-name>    指定按照哪个列去分割数据
        --table <table-name>    导入的源表表名
        --target-dir <dir>    导入HDFS的目标路径
        --warehouse-dir <dir>    HDFS存放表的根路径
        --where <where clause>    指定导出时所使用的查询条件
        -z,--compress    启用压缩
        --compression-codec <c>    指定Hadoop的codec方式(默认gzip)
        --null-string <null-string>    果指定列为字符串类型,使用指定字符串替换值为null的该类列的值
        --null-non-string <null-string>    如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值


    3、在MySQL中准备一些数据

    mysql> use test;
    Database changed
    
    mysql> CREATE TABLE `my_user` (
        ->   `id` tinyint(4) NOT NULL AUTO_INCREMENT,
        ->   `account` varchar(255) DEFAULT NULL,
        ->   `passwd` varchar(255) DEFAULT NULL,
        ->   PRIMARY KEY (`id`)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> INSERT INTO `my_user` VALUES ('1', 'admin', 'admin');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO `my_user` VALUES ('2', 'pu', '12345');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO `my_user` VALUES ('3', 'system', 'system');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO `my_user` VALUES ('4', 'zxh', 'zxh');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO `my_user` VALUES ('5', 'test', 'test');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO `my_user` VALUES ('6', 'pudong', 'pudong');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO `my_user` VALUES ('7', 'qiqi', 'qiqi');
    Query OK, 1 row affected (0.00 sec)


    4、将mysql表导出到hdfs

    ##这里没有指定存到hdfs哪里,会默认存储hdfs用户主目录下以表名为目录存储
    bin/sqoop import 
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
    --username root 
    --password 123456 
    --table my_user
    
    
    ##默认存储,默认用了4个map
    [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -ls -R /user/root
    19/05/06 15:55:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    drwxr-xr-x   - root supergroup          0 2019-05-06 15:53 /user/root/my_user
    -rw-r--r--   1 root supergroup          0 2019-05-06 15:53 /user/root/my_user/_SUCCESS
    -rw-r--r--   1 root supergroup         25 2019-05-06 15:53 /user/root/my_user/part-m-00000
    -rw-r--r--   1 root supergroup         26 2019-05-06 15:53 /user/root/my_user/part-m-00001
    -rw-r--r--   1 root supergroup         12 2019-05-06 15:53 /user/root/my_user/part-m-00002
    -rw-r--r--   1 root supergroup         28 2019-05-06 15:53 /user/root/my_user/part-m-00003


    指定存储目录,设置用1个map:

    ##
    bin/sqoop import 
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
    --username root 
    --password 123456 
    --table my_user 
    --target-dir /user/root/sqoop/imp_my_user 
    --num-mappers 1
    
    
    ##
    [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -ls -R /user/root/sqoop
    19/05/06 16:01:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    drwxr-xr-x   - root supergroup          0 2019-05-06 16:01 /user/root/sqoop/imp_my_user
    -rw-r--r--   1 root supergroup          0 2019-05-06 16:01 /user/root/sqoop/imp_my_user/_SUCCESS
    -rw-r--r--   1 root supergroup         91 2019-05-06 16:01 /user/root/sqoop/imp_my_user/part-m-00000


    二、执行流程

    sqoop 底层的实现就是MapReduce,对import来说,仅仅运行Map Task


    三、设置数据存储格式为parquet

    1、先把mysql的数据导出到hdfs

    ##
    bin/sqoop import 
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
    --username root 
    --password 123456 
    --table my_user 
    --target-dir /user/root/sqoop/imp_my_user_parquet 
    --fields-terminated-by ',' 
    --num-mappers 1 
    --as-parquetfile


    2、再将数据从hdfs导入到hive

    ##在hive中先创建一张表
    drop table if exists default.hive_user_orc ;
    create table default.hive_user_orc(
    id int,
    username string,
    password string
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    STORED AS parquet ;
    
    
    ##导入数据
    hive (default)> load data inpath '/user/root/sqoop/imp_my_user_parquet' into table default.hive_user_orc ;
    
    
    #查询,此时数据都为空,格式为parquet文件,这是sqoop1.4.5的一个bug,1.4.6已经修复;
    hive (default)> select * from default.hive_user_orc ;


    四、导入数据使用query

    1、选择导出所需的列

    ##只导出 id和account这两列
    bin/sqoop import 
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
    --username root 
    --password 123456 
    --table my_user 
    --target-dir /user/root/sqoop/imp_my_user_column 
    --num-mappers 1 
    --columns id,account
    
    
    ##
    [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -text /user/root/sqoop/imp_my_user_column/part-m-00000
    19/05/06 16:39:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    1,admin
    2,pu
    3,system
    4,zxh
    5,test
    6,pudong
    7,qiqi


    2、query

    * 在实际的项目中,要处理的数据,需要进行初步清洗和过滤
        * 某些字段过滤
        * 条件
        * join


    ##--query参数,直接写一条select语句
    bin/sqoop import 
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
    --username root 
    --password 123456 
    --query 'select id, account from my_user where $CONDITIONS' 
    --target-dir /user/root/sqoop/imp_my_user_query 
    --num-mappers 1
    
    
    
    ##
    [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -text /user/root/sqoop/imp_my_user_query/part-m-00000
    19/05/06 16:58:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    1,admin
    2,pu
    3,system
    4,zxh
    5,test
    6,pudong
    7,qiqi


    五、import hdfs设置数据压缩为sanppy

    1、设置hadoop支持sanppy压缩

    [root@hadoop-senior cdh]# tar zxf cdh5.3.6-snappy-lib-natirve.tar.gz
    
    [root@hadoop-senior lib]# rm -rf /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native
    
    [root@hadoop-senior lib]# cp -r native/ /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/
    
    
    ##查看是否已经支持
    [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hadoop checknative
    19/05/06 17:13:56 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
    19/05/06 17:13:56 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
    Native library checking:
    hadoop:  true /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native/libhadoop.so.1.0.0
    zlib:    true /lib64/libz.so.1
    snappy:  true /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native/libsnappy.so.1
    lz4:     true revision:99
    bzip2:   true /lib64/libbz2.so.1


    2、

    bin/sqoop import 
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test 
    --username root 
    --password 123456 
    --table my_user 
    --target-dir /user/root/sqoop/imp_my_sannpy 
    --delete-target-dir                                         
    --num-mappers 1 
    --compress 
    --compression-codec org.apache.hadoop.io.compress.SnappyCodec
    
    
    
    #--delete-target-dir      目标目录存在则删除
    #--compress    启用压缩
  • 相关阅读:
    一日一技:微信开发-自定义菜单
    Redis五种数据结构
    .NET 5 部署在docker上运行
    一日一技:微信开发-发送模板消息
    Redis快速入门及应用
    面试官扎心一问:防止重复请求提交,有什么方案?
    在Windows上安装Docker
    上班摸鱼神器—VSCode 里也可以看股票 & 基金实时数据
    C# Nuget程序集StackExchange.Redis操作Redis 及 Redis 视频资源 及 相关入门指令 牛逼不,全都有
    Mongodb 更新某一条记录 C#
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/10820932.html
Copyright © 2011-2022 走看看