视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
sqoop详细教程
2025-09-26 11:14:38 责编:小OO
文档
Apache Sqoop是用来实现结构型数据(如关系数据库)和Hadoop之间进行数据迁移的工具。它充分利用了MapReduce的并行特点以批处理的方式加快数据的传输,同时也借助MapReduce实现了容错。

项目地址: http://sqoop.apache.org/

目前为止,已经演化出了2个版本:sqoop1和sqoop2。

sqoop1的最新版本是1.4.5,sqoop2的最新版本是1.99.3;1.99.3和1.4.5是不兼容的,并且功能尚未开发完成,还不适合在生产环境部署。

sqoop支持的数据库:

Databaseversion--direct support?connect string matches
HSQLDB1.8.0+Nojdbc:hsqldb:*//
MySQL5.0+Yesjdbc:mysql://
Oracle10.2.0+Nojdbc:oracle:*//
PostgreSQL8.3+Yes (import only)jdbc:postgresql:/
guojian@localtest:~/work$ sudo apt-get install sqoop

guojian@localtest:~/work$ 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.

import是将关系数据库迁移到HDFS上

guojian@localtest:~/work$ sqoop import --connectjdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds

guojian@localtest:~/work$ hadoop fs -ls /user/guojian/sds

Found 5 items

-rw-r--r--   3 guojian cug_test          0 2014-09-11 16:04 /user/guojian/sds/_SUCCESS

-rw-r--r--   3 guojian cug_test        483 2014-09-11 16:03 /user/guojian/sds/part-m-00000.snappy

-rw-r--r--   3 guojian cug_test        504 2014-09-11 16:04 /user/guojian/sds/part-m-00001.snappy

-rw-r--r--   3 guojian cug_test       1001 2014-09-11 16:03 /user/guojian/sds/part-m-00002.snappy

-rw-r--r--   3 guojian cug_test        952 2014-09-11 16:03 /user/guojian/sds/part-m-00003.snappy

可以通过--m设置并行数据,即map的数据,决定文件的个数。

默认目录是/user/${user.name}/${tablename},可以通过--target-dir设置hdfs上的目标目录。

如果想要将整个数据库中的表全部导入到hdfs上,可以使用import-all-tables命令。

sqoop import-all-tables –connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd

如果想要指定所需的列,使用如下:

sqoop import --connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --columns "SD_ID,CD_ID,LOCATION"

指定导出文件为SequenceFiles,并且将生成的类文件命名为com.ctrip.sds:

sqoop import --connect    jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --class-name com.ctrip.sds --as-sequencefile

导入文本时可以指定分隔符:

sqoop import --connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --fields-terminated-by '\' --lines-terminated-by '\\n' --optionally-enclosed-by '\\"'

可以指定过滤条件:

sqoop import --connect jdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table sds --where "sd_id > 100"

export是import的反向过程,将hdfs上的数据导入到关系数据库中

sqoop export --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds --export-dir /user/guojian/sds

上例中sqoop数据中的sds表需要先把表结构创建出来,否则export操作会直接失败。

由于sqoop是通过map完成数据的导入,各个map过程是的,没有事物的概念,可能会有部分map数据导入失败的情况。为了解决这一问题,sqoop中有一个折中的办法,即是指定中间 staging 表,成功后再由中间表导入到结果表。

这一功能是通过 --staging-table  指定,同时staging表结构也是需要提前创建出来的:

sqoop export --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds --export-dir /user/guojian/sds --staging-table sds_tmp

需要说明的是,在使用 --direct , --update-key 或者--call存储过程的选项时,staging中间表是不可用的。

验证结果:

(1)数据会首先写到sds_tmp表,导入操作成功后,再由sds_tmp表导入到sds结果表中,同时会清除sds_tmp表。

(2)如果有map失败,则成功的map会将数据写入tmp表,export任务失败,同时tmp表的数据会被保留。

(3)如果tmp中已有数据,则此export操作会直接失败,可以使用 --clear-staging-table 指定在执行前清除中间表。

export选项:

--direct直接使用 mysqlimport 工具导入mysql

--export-dir 需要export的hdfs数据路径

-m,--num-mappers 并行export的map个数n

--table
导出到的目标表
--call 调用存储过程
--update-key 指定需要更新的列名,可以将数据库中已经存在的数据进行更新
--update-mode 更新模式,包括 updateonly (默认)和allowinsert

前者只允许更新,后者允许新的列数据写入
--input-null-string The string to be interpreted as null for string columns
--input-null-non-string The string to be interpreted as null for non-string columns
--staging-table 指定中间staging表

--clear-staging-table执行export前将中间staging表数据清除

--batchUse batch mode for underlying statement execution.
ArgumentDescription
create-hive-table将关系数据库表导入到hive表中

参数说明
–hive-home Hive的安装目录,可以通过该参数覆盖掉默认的hive目录

–hive-overwrite覆盖掉在hive表中已经存在的数据

–create-hive-table默认是false,如果目标表已经存在了,那么创建任务会失败

–hive-table后面接要创建的hive表

–table指定关系数据库表名
sqoop create-hive-table --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds --hive-table sds_bak

默认sds_bak是在default数据库的。

这一步需要依赖HCatalog,需要先安装HCatalog,否则报如下错误:

Hive history file=/tmp/guojian/hive_job_log_cfbe2de9-a358-4130-945c-b97c0add9d_1628102887.txt

FAILED: ParseException line 1:44 mismatched input ')' expecting Identifier near '(' in column specification

list-databases列出一台server上可用的数据库

sqoop list-databases --connect jdbc:mysql://192.168.81.176/ --username root -password passwd

list-tables列出一个数据库中的表

sqoop list-tables --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd

codegen:将关系数据库表映射为一个java文件、java class类、以及相关的jar包

sqoop codegen --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --table sds

Note: /tmp/sqoop-guojian/compile/d58f607b046a061593ba708ec5f3d608/sds.java uses or overrides a deprecated API.

Note: Recompile with -Xlint:deprecationfor details.

guojian@localtest:~/work$ ll /tmp/sqoop-guojian/compile/d58f607b046a061593ba708ec5f3d608/

total 48

drwxrwxr-x  2 guojian guojian  40969月 1214:15 ./

drwxrwxr-x 11 guojian guojian  40969月 1214:15 ../

-rw-rw-r--  1 guojian guojian 1197月 1214:15 sds.class

-rw-rw-r--  1 guojian guojian  4811  9月 12 14:15 sds.jar

-rw-rw-r--  1 guojian guojian 17525  9月 12 14:15 sds.java

merge是将两个数据集合并的工具,对于相同的key会覆盖老的值。

--class-name 指定merge job使用的类名称

--jar-file 合并时引入的jar包,该jar包是通过Codegen工具生成的jar包

--merge-key
指定作为merge key的列名

--new-data 指定newer数据目录

--onto 指定older数据目录

--target-dir 指定目标输出目录
参数说明
sqoop merge --new-data /user/guojian/sds --onto /user/guojian/sqoop --target-dir /user/guojian/sds_new --jar-file sds.jar --class-name sds --merge-key SD_ID

值得注意的是,--target-dir如果设置为已经存在的目录,sqoop会报错退出。

eval用户可以很快的使用sql语句对数据库进行操作。这使得用户在执行import操作之前检查sql语句是否正确。

sqoop eval --connect jdbc:mysql://192.168.81.176/sqoop --username root -password passwd --query "SELECT SD_ID,CD_ID,LOCATION FROM sds LIMIT 10"

job用来生成sqoop任务。

--create 创业一个新的sqoop作业.

--delete 删除一个sqoop job

--exec 执行一个 --create 保存的作业

--show 显示一个作业的参数
--list显示所有创建的sqoop作业

参数说明
例子:

sqoop job --create myimportjob -- import --connectjdbc:mysql://192.168.81.176/hivemeta2db --username root -password passwd --table TBLS

guojian@localtest:~/work$ sqoop job --listAvailable jobs:

  myimportjob

guojian@localtest:~/work$ sqoop job --show myimportjob

Job: myimportjob

Tool: import

Options:----------------------------

verbose = false

db.connect.string =     jdbc:mysql://192.168.81.176/hivemeta2db

codegen.output.delimiters.escape = 0

codegen.output.delimiters.enclose.required = false

codegen.input.delimiters.field = 0

hbase.create.table = false

db.require.password = true

hdfs.append.dir = false

db.table = TBLS

import.fetch.size = null

accumulo.create.table = false

codegen.input.delimiters.escape = 0

codegen.input.delimiters.enclose.required = false

db.username = root

codegen.output.delimiters.record = 10

import.max.inline.lob.size = 16777216

hbase.bulk.load.enabled = false

hcatalog.create.table = false

db.clear.staging.table = false

codegen.input.delimiters.record = 0

enable.compression = false

hive.overwrite.table = false

hive.import = false

codegen.input.delimiters.enclose = 0

accumulo.batch.size = 10240000

hive.drop.delims = false

codegen.output.delimiters.enclose = 0

hdfs.delete-target.dir = false

codegen.output.dir = .

codegen.auto.compile.dir = true

mapreduce.num.mappers = 4

accumulo.max.latency = 5000

import.direct.split.size = 0

codegen.output.delimiters.field = 44

export.new.update = UpdateOnly

incremental.mode = None

hdfs.file.format = TextFile

codegen.compile.dir = /tmp/sqoop-guojian/compile/bd9c7f7b651276067b3f7b341b7fa4cb

direct.import = false

hive.fail.table.exists = false

db.batch = false

执行:

sqoop job -exec myimportjob

metastore 配置sqoop job的共享元数据信息,这样多个用户定义和执行sqoop job在这一 metastore中。默认存储在~/.sqoop

启动:sqoop metastore

关闭:sqoop metastore --shutdown

metastore文件的存储位置是在 conf/sqoop-site.xml中sqoop.metastore.server.location 配置,指向本地文件。

metastore可以通过TCP/IP访问,端口号可以通过sqoop.metastore.server.port 配置,默认是16000。

客户端可以通过 指定 sqoop.metastore.client.autoconnect.url 或使用 --meta-connect ,配置为 jdbc:hsqldb:hsql://:/sqoop,例如 jdbc:hsqldb:hsql://metaserver.example.com:16000/sqoop 。

更多说明见 http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html下载本文

显示全文