Hadoop数据传输工具sqoop

    xiaoxiao2022-06-28  40

    概述

    sqoop 是Apache顶级项目,主要用来在Hadoop和关系数据库中传递数据。通过sqoop,我们可以方便的将数据从关系数据库导入到HDFS,或者将数据从HDFS导出到关系数据库。 sqoop架构: sqoop架构非常简单,其整合了Hive、Hbase和Oozie, 通过map-reduce任务来传输数据,从而提供并发特性和容错。 sqoop的进一步发展可以参考: A New Generation of Data Transfer Tools for Hadoop: Sqoop 2 sqoop主要通过JDBC和关系数据库进行交互。理论上支持JDBC的database都可以使用sqoop和hdfs进行数据交互。 但是,只有一小部分经过sqoop官方测试,如下: Database            version             --direct support             connect string matches HSQLDB             1.8.0+             No             jdbc:hsqldb:*// MySQL             5.0+             Yes             jdbc:mysql:// Oracle             10.2.0+             No             jdbc:oracle:*// PostgreSQL             8.3+             Yes             (import only) jdbc:postgresql:// 较老的版本有可能也被支持,但未经过测试。 出于性能考虑,sqoop提供不同于JDBC的快速存取数据的机制,可以通过--direct使用。 以下基于sqoop-1.4.3

    安装

    sqoop安装使用可以参考 http://www.54chen.com/java-ee/sqoop-mysql-to-hive.html ,测试work

    工具

    sqoop包含一系列的工具,运行sqoop help可以查看相关帮助, $ ./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   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. 使用工具list-tables查看表,如下: $ ./sqoop list-tables --connect jdbc:mysql://127.0.0.1/test --username root --password 123456  a t1 可以使用codegen生成代码,但不执行map-reduce,如下: $ ./sqoop codegen --connect jdbc:mysql://127.0.0.1/test --username root --password 123456 --table a -- class-name zxm_sqoop  ...... 13/03/21 21:02:01 INFO orm.CompilationManager: Writing jar file:  /tmp/sqoop-work/compile/29864e3980ab5630b699e8e1e2145369/zxm_sqoop.jar 此处相关代码和java包可在  /tmp/sqoop-work/compile/29864e3980ab5630b699e8e1e2145369/ 找到

    Import

    sqoop 数据导入具有以下特点: 1.支持文本文件(--as-textfile)、avro( --as-avrodatafile )、SequenceFiles(--as-sequencefile)。  RCFILE暂未支持 ,默认为文本 2.支持数据追加,通过--apend指定 3.支持table列选取(--column),支持数据选取(--where),和--table一起使用 4.支持数据选取,例如读入多表join后的数据'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) ‘,不可以和--table同时使用 5.支持map数定制(-m) 6.支持压缩(--compress) 7. 支持将关系数据库中的数据导入到Hive(--hive-import)、HBase(--hbase-table)    数据导入Hive分三步:1)导入数据到HDFS  2)Hive建表  3)使用“LOAD DATA INPAHT”将数据LOAD到表中    数据导入HBase分二部:1)导入数据到HDFS 2)调用HBase put操作逐行将数据写入表 * 示例: mysql文件内容: mysql> select * from a;                           +------+--------+ | key1 | value1 | +------+--------+ |    1 | a1     | |    2 | a2     | |    3 | a3     | |    4 | a4     | |    5 | a5     | |    6 | a6     | |    7 | a7     | |    8 | a8     | |    9 | a9     | +------+--------+ 编写文件a.conf,内容: [html]  view plain  copy import      --append      -m   3      --connect    jdbc:mysql://127.0.0.1/test       --username    root       --password    123456       --table    a      --target-dir   /tmp/a      --columns   key1      --where   'key1>3'   运行: $ ./sqoop --options-file a.conf  查看输出: $ hadoop fs -ls /tmp/a/   Found 3 items -rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00000 -rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00001 -rw-r--r--   1 work supergroup          4 2013-03-21 23:08 /tmp/a/part-m-00002   ==》3个文件对应3个mapper $ hadoop fs -cat /tmp/a/* 4 5 6 7 8 9

    Export

    sqoop export 能将HDFS上的文件导出到关系数据库。其工作原理是根据用户指定的分隔符(字段分隔符:--fields-terminated-by)读入并解析数据,然后转换成insert/update语句导入数据到关系数据库。 其具有以下特点: 1. 支持将数据导出到表(--table)或者调用存储过程(--call) 2. 支持insert、update模式 3. 支持并发控制(-m) 实例: $ hadoop fs -cat /tmp/b/* 1,a 2,b 3,c $ ./sqoop export --connect jdbc:mysql://127.0.0.1/test --table b  -username root -password 123456 --ex port-dir /tmp/b mysql> select * from b;          +------+--------+ | key1 | value1 | +------+--------+ |    1 | a      | |    2 | b      | |    3 | c      | +------+--------+ 出了上述提到的工具外,sqoop还提供了一些有意思的工具,例如sqoop job,有兴趣的同学可以研究下

    其它:

    1. 通过使用map-reduce,sqoop提供了良好的并发性和容错,可以作为 异构数据库同步工具 2. Sqoop虽然支持Hive、HBase,但并不完整,某些场景下数据传输后的加工不可避免 3. 大数据传输,也许可以使用--direct

    reference:

    Apache sqoop Sqoop User Guide Apache Sqoop: A Data Transfer Tool for Hadoop A New Generation of Data Transfer Tools for Hadoop: Sqoop 2 Sqoop使用 大数据异构环境数据同步工具DataX 与Sqoop 之比较
    转载请注明原文地址: https://ju.6miu.com/read-1124175.html

    最新回复(0)