• 安装 sqoop


    简介

    Sqoop是一个用来将Hadoop(Hive、HBase)和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中,但是不能将hbase、hive的数据导入到关系型数据库。

    下载

    因为官方并不建议在生产环境中使用sqoop2,即1.99.7,所以这里我用的是sqoop1,即1.4.7

    点击下载:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

    安装

    解压

    #tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /data/hadoop/
    #cd /data/hadoop
    #mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop

    配置环境变量~/.bashrc

    export SQOOP_HOME=/data/hadoop/sqoop
    export PATH=${SQOOP_HOME}/bin:$PATH

    编辑完成后,执行命令: source /etc/profile

    sqoop配置文件修改

    进入 /data/hadoop/sqoop/conf 目录下,
    # cd /data/hadoop/sqoop/conf
    
    将sqoop-env-template.sh复制一份,并取名为sqoop-env.sh
    # cp sqoop-env-template.sh sqoop-env.sh

    在sqoop-env.sh文件最后添加如下参数

    # Hadoop    
    export HADOOP_HOME=/data/hadoop/hadoop 
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin  
    export HADOOP_COMMON_HOME=${HADOOP_HOME}    
    export HADOOP_HDFS_HOME=${HADOOP_HOME}    
    export HADOOP_MAPRED_HOME=${HADOOP_HOME}  
    export HADOOP_YARN_HOME=${HADOOP_HOME}    
    # Native Path    
    export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native    
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"   
    # Hadoop end  
       
    #Hive  (如果存在)
    export HIVE_HOME=/data/hadoop/hive
    export PATH=$HIVE_HOME/bin:$PATH  
       
    #HBase  (如果存在)
    export HBASE_HOME=/data/hadoop/hbase
    export PATH=$HBASE/bin:$PATH  

    mysql驱动包

    下载地址:https://dev.mysql.com/downloads/connector/j/

    解压与拷贝

    # tar zxvf mysql-connector-java-8.0.13.tar.gz
    # cd mysql-connector-java-8.0.13/
    # cp mysql-connector-java-8.0.13.jar /data/hadoop/sqoop/lib/

    sqoop使用

    1、查看帮助

    
    # sqoop help
    Available commands:
    codegen Generate code to interact with database records
    create-hive-table Import a table definition into Hive
    eval Evaluate a SQL statement and display the results
    export Export an HDFS directory to a database table
    help List available commands
    import Import a table from a database to HDFS
    import-all-tables Import tables from a database to HDFS
    import-mainframe Import datasets from a mainframe server to HDFS
    job Work with saved jobs
    list-databases List available databases on a server
    list-tables List available tables in a database
    merge Merge results of incremental imports
    metastore Run a standalone Sqoop metastore
    version Display version information

    想要显示具体的参数用法,可以使用sqoop help  options

    # sqoop help import

    2、显示mysql所有数据库(mysql的安装自行百度)

    # sqoop list-databases --connect jdbc:mysql://192.168.1.91 --username root --password 123456  注意,url地址要写对,mysql权限要赋予。
    如果报如下的错误:
    19/07/20 18:23:16 ERROR tool.BaseSqoopTool: Got error creating database manager: java.io.IOException: No manager for connect string: jdbc.mysql://192.168.1.91
    这种情况要么是mysql驱动程序拷贝,要么是url地址写错误了

    上诉的这个错误就是url写错了,正常应该是
    jdbc:mysql://192.168.1.91 这里写成了 jdbc.mysql://192.168.1.91
    我在这里卡了好一会,,尴尬的一批。0.0

    也可以使用如下的命令查询某一个数据库
    # sqoop list-databases --connect jdbc:mysql://192.168.1.91:3306/test?characterEncoding=UTF-8 --username root --password '123456'

    3、显示数据库里面的所有表

    # sqoop list-tables --connect jdbc:mysql://192.168.1.91:3306/hadoop?characterEncoding=UTF-8 --username root --password '123456'

    4、使用sqoop导入数据

      sqoop利用Hadoop MapReduce(只是执行map阶段)来执行数据的导入和导出。

    查看import帮助

    # sqoop help import
    usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS]
    ....
    sqoop import命令有两个基本部分,一个是GENERIC参数,另一个是TOOL参数

    在导入前,首先在mysql里面创建一个hadoop数据库

    create database hadoop;
    use hadoop;
    创建表
    create table learn(id int,name char,age int);
    插入一条简单的数据
    insert into  learn values(1,'yjt',22);

    导入数据到hdfs

    # sqoop import --connect jdbc:mysql://192.168.1.91:3306/hadoop --username root --password '123456' --table learn --target-dir /test
    报错了
    ERROR tool.ImportTool: Import failed: No primary key could be found for table learn. Please specify one with --split-by or perform a sequential import with '-m 1'.
    说这个learn没有主键。报错的后面提示了解决办法,,--split-by  <column> 指定以什么字段分割 -m是指定map任务数

    重新执行
    # sqoop import --connect jdbc:mysql://192.168.1.91:3306/hadoop --username root --password '123456' --table learn --target-dir /test --split-by id

    查看hdfs上的test目录存在的数据

    # hadoop fs -cat /test/part-m-00000
    1,y,22

    说明成功把数据导入到了hdfs

       当使用Sqoop导入命令时,Sqoop将数据集切分成多个分区,并启动map-only任务将数据块传输到hdfs,Sqoop从数据库的元数据中推断出数据类型。所以,sqoop导入可以分为两个过程:

    (1) sqoop收集要导入的数据所需的元数据。

    (2)Sqoop将map任务提交到Hadoop集群。

       Sqoop是不直接连接到关系型数据库或者仓库来导入(导出)数据的。Sqoop通过运行MapReduce作业来连接到数据库,读取数据并将数据导入到hdfs。

    在上诉的导入命令中,需要输入一大堆的参数,能不能把一些每次导入需要的选项保存下来呢,,答案是可以的,可以使用选项文件(--options-file)参数,如下:

    创建文本文件,以保存参数

    # cat sqoop-option-file.txt 
    --connect 
    jdbc:mysql://192.168.1.91/hadoop
    --username 
    root
    --password 
    123456

    执行sqoop导入操作

    # sqoop import --options-file sqoop-option-file.txt --table learn --target-dir /test1 --split-by id

    5、Sqoop是如何导入数据的???

    (1)Sqoop连接数据库。

    (2)获取表的元数据

    (3)生成一个Java类并进行编译

    (4)连接到Hadoop集群

    (5)在Hadoop集群执行MapReduce作业

    (6)MapReduce使用在步骤2中生成的元数据执行map任务来完成导入过程

    (7)MapReduce将输出作为hdfs中的一组文件生成

    6、指定密码的几种方式

    (1)使用--password   password

    (2)使用--p 以交互式方式输入密码

    (3)使用--password-file  password-file  从文件中读取密码

    (4)保存到sqoop metastore中,可以通过在sqoop-site.xml文件设置sqoop.metastore.client.record.password属性来设置明文密码。

     

    参考文章:

    https://www.cnblogs.com/frankdeng/p/9132194.html

    https://www.cnblogs.com/frankdeng/p/9067092.html

    https://www.cnblogs.com/cenyuhai/p/3306037.html

    官网

  • 相关阅读:
    Hashtable源码分析
    ConcurrentHashMap1.7源码分析
    JDK1.8新特性
    回炉Spring--Bean生命周期及AOP
    @DateTimeFormat 和 @JsonFormat 注解
    面向切面编程-日志切面应用及MDC使用
    maven 多模块开发
    maven 安装
    ztree树节点重叠问题
    Java问题解读系列之IO相关---Java深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/yjt1993/p/11218804.html
Copyright © 2020-2023  润新知