zoukankan      html  css  js  c++  java
  • 【Sqoop】介绍、安装、使用(列出MySQL中数据库/表 + mysql数据导入到Hive表 + Hive表数据导出到mysql表)

    目录

    一、介绍

    二、安装

    三、使用

      1、列出MySQL中所有的数据库

      2、列出MySQL指定数据库下的所有表

      3、将MySQL表数据导入进Hive表

      4、将Hive表数据导出进MySQL表


    一、介绍

    功能:Sqoop是一个采集工具。类似于Flume,但是Flume是从一些日志中采集信息,Sqoop是从RDBMS中采集信息。比如Sqoop采集信息到HDFS/Hive。

    版本
    Sqoop: 1.4.7 (用)
    Sqoop2:  1.99.7(不用)

    Sqoop的底层是:MapReduce中的map。

    二、安装

    步骤如下:

    1)地址http://archive.cloudera.com/cdh5/cdh/5/,下载sqoop-1.4.6-cdh5.7.0.tar.gz
    2)解压到~/app
    3)拷贝MySQL Driver:mysql-connector-java-5.1.27-bin.jar到Hive的安装包下的lib中
    4)conf/sqoop-env.sh 配置
    [hadoop@hadoop001 conf]$ cp sqoop-env-template.sh sqoop-env.sh
    [hadoop@hadoop001 conf]$ vi sqoop-env.sh
    export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
    export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
    export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
    5)vi ~/.bash_profile 配置Sqoop进环境变量
    export SQOOP_HOME=/home/hadoop/app/sqoop-1.4.6-cdh5.7.0
    export PATH=$SQOOP_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME
    6)使环境变量生效:`source ~/.bash_profile`
    7)查看是否配置成功:
    [hadoop@hadoop001 bin]$ echo $SQOOP_HOME
    /home/hadoop/app/sqoop-1.4.6-cdh5.7.0

    三、使用

    查看sqoop命令的使用帮助:[hadoop@hadoop001 bin]$ sqoop help   

    sqoop的导入、导出命令(出发点是Hadoop):
    导入(import): MySQL ==> Hadoop
    导出(export): Hadoop ==> MySQL

    但是:实际上SparkSpark就可以非常方便的实现读取MySQL中的表进Hadoop中/Hive中

    1、列出MySQL中所有的数据库

    sqoop list-databases
    --username root --password 123456
    --connect jdbc:mysql://localhost:3306/

    2、列出MySQL指定数据库下的所有表

    sqoop list-tables
    --username root --password 123456
    --connect jdbc:mysql://localhost:3306/test 

    3、将MySQL表数据导入进Hive表

    sqoop import --help :导入命令的帮助

    导入的命令:

    sqoop import
    --connect jdbc:mysql://localhost:3306/test06   ---mysql的连接
    --username root --password root   ---mysql的连接
    --delete-target-dir  -----建议每次导入的时候加上这个参数,每次以删除的模式导入,对应MR中的输出目录如果存在就报错的异常
    --table city_info    -----读取的mysql的表名
    --hive-import  ---功能是导入
    --hive-table city_info  ----导入hive表的表名
    --hive-overwrite        ----导入表 覆盖的方式
    --fields-terminated-by ' '  ---表字段分隔符
    --lines-terminated-by ' '   ---行分隔符
    --split-by city_id  ---指明主键 ,因为Sqoop默认把主键作为map的分片 ,这样可以把mysql中数据根据主键分片
    -m 2  ---并行的map的数量(因为Sqoop的导入功能实际上就是MR,只有map过程)

    1)MR角度:从导入的过程中就可以看得出来,这个MapReduce作业是只有map的。

    2)并行度角度:Sqoop默认的并行度是4,也就是mapper数是4。可以通过-m设置这个MapReduce作业的并行度。Sqoop默认以主键作为map分片,通过--split-by​​​​​​​指明主键mysql中分片的主键。

    执行完上述命令之后,mysql中的城市表数据就导入HDFS中了,但是默认导入HDFS的/user/hadoop(用户名)/表名下,而不是hive表对应的路径下,所以还需要将HDFS上的数据hdfs dfs -mv 移动到hive表对应的路径下,这样在hive表中就能查询到数据了。

    如果想sqoop导入的数据直接进入hive的表目录下,使用--target-dir /user/hive/warehouse/hive.db/city_info参数就可以了。其中:输出目录不能存在。

    现在来测试一下--target-dir参数,导入的命令:

    参考:https://blog.csdn.net/finejade1027/article/details/90380038

    创建MySQL表:
    CREATE TABLE `city_info` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    mysql> insert into city_info(id,name) values(1,"tom");
    Query OK, 1 row affected (0.02 sec)

    mysql> insert into city_info(id,name) values(2,"mike");
    Query OK, 1 row affected (0.00 sec)

    导入MySQL数据到HDFS的命令:
    sqoop import
    --username root --password 123456
    --connect jdbc:mysql://localhost:3306/test
    --query "select * from city_info where $CONDITIONS"
    --target-dir /wordcount/data --fields-terminated-by ','
    --split-by id -m 1
    其中:输出目录不能存在。其中:where $CONDITIONS是固定的
    导入的时候可能提示下面的信息,不用管它,没有关系。把导入的命令写在一行就可以:
    Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../hbase does not exist! HBase imports will fail.
    Please set $HBASE_HOME to the root of your HBase installation.
    Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../hcatalog does not exist! HCatalog jobs will fail.
    Please set $HCAT_HOME to the root of your HCatalog installation.
    Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../accumulo does not exist! Accumulo imports will fail.
    Please set $ACCUMULO_HOME to the root of your Accumulo installation.
    Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../zookeeper does not exist! Accumulo imports will fail.
    Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
    --target-dir /wordcount
    -m 219/08/21 13:25:10 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.7.0
    19/08/21 13:25:10 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
    19/08/21 13:25:10 ERROR tool.BaseSqoopTool: Error parsing arguments for import:
    19/08/21 13:25:10 ERROR tool.BaseSqoopTool: Unrecognized argument:

    实际走的是一个MR,存储到HDFS:
    [hadoop@hadoop001 bin]$ hdfs dfs -cat /wordcount/data/p*
    1,tom
    2,mike

    4、将Hive表数据导出进MySQL表

    [fanl@centos7 sqoop-1.4.6-cdh5.14.2]$ bin/sqoop export
    --connect jdbc:mysql://127.0.0.1:3306/sqoop
    --username root
    --password 123456
    --table logs_result ------>mysql的表
    --export-dir '/user/hive/warehouse/weblogs.db/logs_result' ----->hive中表的路径
    --num-mappers 2  ------->Sqoop的并行度
    --input-fields-terminated-by '01'
     
    ## hive默认的分隔符:01

  • 相关阅读:
    单片机数字滤波的算法!
    Python中列表的兄弟
    史上最全的Python程序员面试必备常用问题
    新人在学习web前端的容易踩哪些坑?
    linux+arm系统学习与基础学习
    C和C++笔记:动态内存管理
    Python 爬虫干货之urllib库
    单片机、ARM、MUC、DSP、FPGA、嵌入式错综复杂的关系!
    单片机死机了怎么办?
    单片机各种复位电路原理
  • 原文地址:https://www.cnblogs.com/huomei/p/12601396.html
Copyright © 2011-2022 走看看