zoukankan      html  css  js  c++  java
  • 大数据入门第十二天——sqoop入门

    一、概述

      1.sqoop是什么

        从其官网:http://sqoop.apache.org/ 

      Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases

        中文来说,就是:

    sqoop是apache旗下一款Hadoop和关系数据库服务器之间传送数据的工具。

      导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;

      导出数据:从Hadoop的文件系统中导出数据到关系数据库

        简而言之,sqoop是一个数据迁移工具!

      2.主要原理  

        将导入或导出命令翻译成mapreduce程序来实现

        在翻译出的mapreduce中主要是对inputformatoutputformat进行定制

    二、安装与配置

        1.准备

          本地具备java与hadoop环境,下载sqoop,下载地址:http://archive.apache.org/dist/sqoop/1.4.6/

          // 这里的Alpha表示的是内测版

          将下载的sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz上传到服务器

        2.解压

    [hadoop@mini1 ~]$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 

        // 位置可以按照自己的习惯进行定义

    [hadoop@mini1 ~]$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop

        3.修改配置文件

    [hadoop@mini1 ~]$ cd sqoop/
    [hadoop@mini1 sqoop]$ cd conf/
    [hadoop@mini1 conf]$ mv sqoop-env-template.sh sqoop-env.sh

        通过which/whereis 定位一下hadoop等目录

        打开 sqoop-env.sh,修改以下几项(打开注释,添加相关值):

    export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.4/ 
    export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.4/
    export HIVE_HOME=/home/hadoop/apps/hive-1.2.1

        4.加入Mysql的jdbc驱动包

          由于我们是向MySQL导数据,所以需要的是对应的驱动包到Lib目录(这里就直接从hive里面拿了)

    [hadoop@mini1 sqoop]$ cp ~/apps/hive-1.2.1/lib/mysql-connector-java-5.1.42.jar ./lib/

        5.验证启动     

    [hadoop@mini1 sqoop]$ bin/sqoop

        // 如果配置了环境变量,将可以直接通过sqoop启动

        6.查看帮助

    [hadoop@mini1 sqoop]$ bin/sqoop help
    usage: sqoop COMMAND [ARGS]
    
    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
    
    See 'sqoop help COMMAND' for information on a specific command.

    三、sqoop数据导入

      “导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据) 

      1.数据库导入HDFS

        1.语法

    $ sqoop import (generic-args) (import-args) 

      // 完整参数,参考:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_import_literal

        2.示例

    bin/sqoop import 
    --connect jdbc:mysql://mini1:3306/test 
    --username root 
    --password Zcc170821# 
    --table girl 
    --m 1

       -m,--num-mappers <n> Use n map tasks to import in parallel,其他完整参数,参考文档

       未指定--target-dir /user/sqoop/test1 则默认为/user/hadoop/表名,这里可以进行在HDFS上的查看:

    [hadoop@mini1 lib]$ hadoop fs -cat /user/hadoop/girl/part-m-00000

      2.导入关系表到Hive

        其实基本上是从数据库到hdfs,再Load到hive的表,不过这里可以一步到位了

    bin/sqoop import 
    --connect jdbc:mysql://mini1:3306/test 
    --username root 
    --password Zcc170821# 
    --table girl 
    --target-dir /user/hadoop/girl2 
    --hive-import 
    --m 1

     

       3.导入数据子集

        有时候只想导入数据表中的一部分数据,可以通过where来进行过滤筛选:

    bin/sqoop import 
    --connect jdbc:mysql://mini1:3306/test 
    --username root 
    --password Zcc170821# 
    --where "id > 5" 
    --target-dir /user/hadoop/girl3 
    --table girl 
    --m 1

        当然,如果单纯where无法满足,可以使用自定义的query语句来筛选:——注意只要写了where则后面的 and $CONDITIONS是死的,必须这么写!

    bin/sqoop import 
    --connect jdbc:mysql://mini1:3306/test 
    --username root 
    --password Zcc170821# 
    --query "select * from girl where name='11' and id>6 and $CONDITIONS" 
    --target-dir /user/hadoop/girl3 
    --table girl 
    --m 1

        也可以使用split by来指定切片字段,这样就结合--m参数分配了

    --split-by id 
    --m 1

        或者指定字段的分隔符,这样到HDFS就是这个分割符了。这样以后建表从hive映射就使用这个分隔符了:

    --fields-terminated-by <char>

      4.增量导入 

        增量导入( Incremental Imports)是仅导入新添加的表中的行的技术。

        它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入

    bin/sqoop import 
    --connect jdbc:mysql://mini1:3306/test 
    --username root 
    --password Zcc170821# 
    --table girl --m 1 
    --target-dir /user/hadoop/girl4 
    --incremental append 
    --check-column id 
    --last-value 12

       // 如果不想一直因为已经存在target-dir而新建,可以使用参数delete-target-dir,这样就会自动删除已经存在的目录了!请选择性使用

      这样,targer-dir里面就是新增的数据了:

    [hadoop@mini1 lib]$ hadoop fs -cat /user/hadoop/girl4/part-m-00000
    13,22,aa
    14,23,bb

     四、sqoop数据导出 

       1.从HDFS中导出

       将数据从HDFS导出到RDBMS数据库

      导出前,目标表必须存在于目标数据库中

        默认操作是从将文件中的数据使用INSERT语句插入到表中

        更新模式下,是生成UPDATE语句更新表数据

       1.手动创建目标表

    两种方法复制表结构:
    1.create table B as select * from A where 1=2; 
    或者: 
    2.create table B like A;

      这里就复制上面的girl的表结构了

      2.执行导出命令

    bin/sqoop export 
    --connect jdbc:mysql://mini1:3306/test 
    --username root 
    --password Zcc170821# 
    --table girl2 
    --export-dir /user/hadoop/girl/

      如果文件不是默认的,分隔符,则添加指定参数:

    --fields-terminated-by '	'

      2.sqoop作业

        sqoop也支持作业的形式

          --create创建

    bin/sqoop job --create myimportjob -- import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1

          --list查看

    $ sqoop job --list

          --show查看

    $ sqoop job --show myjob

          --exec执行

    $ sqoop job --exec myjob
    它会显示下面的输出。
    10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation 
    ...

        但是我们可以用shell脚本的方式来运行调度,所以这个意义并不是很大.

  • 相关阅读:
    有关Lucene的问题(7):用Lucene构建实时的索引
    Lucene学习总结之九:Lucene的查询对象(1)
    有关Lucene的问题(6):Lucene的事务性
    Lucene学习总结之九:Lucene的查询对象
    面向连接的Socket Server的简单实现
    Lucene 原理与代码分析完整版
    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题
    k8spod的状态为evicted的情况分析
    centos7环境 的 k8s安装helm 3.7.1
    VMware虚拟机中CentOS7的硬盘空间扩容
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8478521.html
Copyright © 2011-2022 走看看