Sqoop 快速入门

内容简介
sqoop 的安装
sqoop 的基本命令
数据导入导出示例
  sqoop 是一个数据迁移工具。 sqoop 非常简单, 其整合了 Hive 、 Hbase 和

Oozie , 通过 map-reduce 任务来传输数据, 从而提供并发特性和容错。
Sqoop 由于是将数据导入到 hdfs 中, 所以需要依赖于 hadoop。 即前提上 hadoop
已经安装且正确配置。
sqoop 主要通过 JDBC 和关系数据库进行交互。 理论上支持 JDBC 的 database
都可以使用 sqoop 和 hdfs 进行数据交互 。 如将 database 中的数据导入到 hdfs 或
是将 hdfs 中的数据导入到 database 中。 本部分将介绍 sqoop1.x 的使用。

安装 sqoop
  安装 sqoop 非常简单, 只要下载 sqoop 并解压到任意一个台已经安装好 hadoop 的
机器上即可。
下载时, 请下载以下完整的文件, 如下图 所示:

或在 linux 的命令行模式下, 直接使用 wget 下载:
$wget
https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__h
adoop-2.0.4-alpha.tar.gz
解压到 Linux 的任意目录下:
$ tar zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
解压以后, 由于目录比较长, 可以使用 mv 命令, 修改名称:
$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop-1.4.6
进入 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 从 hdfs 导
出数据到 db
help List available commands
import Import a table from a database to HDFS 将数据导入到 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 metastoreversion Display version information
在上面的命令中, 使用的比较多的是 export 和 import。

sqoop 基本命令
使用 sqoop 可以将数据库中的数据导入到 hdfs 中。 在使用之前, 应该将对应的数
据库驱动拷贝到 sqoop 下的 lib 目录下。 以下示例, 都将使用 mysql 数据库, 所以,
必须要将 mysql 数据库的驱动包放到 sqoop 下的 lib 目录下。
一般情况下, sqoop 的命令, 都会比较长, 所以以下多数命令使用 shell 脚本的方
式实现, 在脚本中直接输入\(斜线) 表示命令并没有结束, 此处为一个换行。 关于脚
本的编写读者可以自行研读 Linux 的相关教程。 同时, 以下的示例中读者要根据自己
的具体情况修改数据连接的 ip 地址及用户名和密码。
同时为了便于操作, 建议将 sqoop 配置到环境变量中, 配置如下:
$sudo vim /etc/profile.d/sqoop.sh
添加以下的内容
#!/bin/sh
export ZOOKEEPER_HOME=/cluster/zookeeper-3.4.10
export SQOOP_HOME=/cluster/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
1) 、 list-databases
list-databases 用于显示某个连接上所有数据库
sqoop list-databases \
--connect jdbc:mysql://192.168.56.1:3306/ \
--username root \
--password 1234
也可以直接使用 sqoop-list-databases 命令:
#!/bin/bash
#使用 sqoop 命令
./sqoop-list-databases \
--connect jdbc:mysql://192.168.56.1:3306/ \
--username root \
--password 1234
2) 、 list-tables
list-tables 用于显示某个数据库中的所有表:
#!/bin/bash
./sqoop list-tables \
--connect jdbc:mysql://192.168.56.1:3306/weric \
--username root \
--password 1234
3) 、 eval
eval 用于执行一个 sql 语句, 并将结果输出到控制台, 请自行修改查询的表名。
#!/bin/bash
sqoop eval \
--connect jdbc:mysql://192.168.56.1:3306/weric \
--username root \
--password 1234 \
--query "select * from users"

导入导出命令
1) 、 import
import 命令, 用于将数据库中的数据导入到 hdfs。 其中--table 参数用于将一个
表中的数据全部的导入到 hdfs 中去。
1.1) 、 --table 指定导出的表:
#!/bin/bash
./sqoop import \
--connect \
jdbc:mysql://192.168.56.1:3306/weric?characterEncoding=UTF-8 \
--username root \
--password 1234 \
--table studs \ #指定表名
-m 2 \ #指定 mapper 的个数, 不能超过集群节点的数量, 默认为 4
--split-by "id" \ #只要-m 不是 1 必须要指定分组的字段名称
--where "age>100 and sex='1'" \ #指定 where 条件, 可以使用 “” 双引号
--target-dir /out001 #指定导入到 hdfs 以后目录
默认导出到 hdfs 的数据以, (逗号) 分开如下所示:
$ hdfs dfs -cat /out001/*
2a56b3536b544f289ba79b2b5c1196c4,Jerry,89e4a3e..3ee3e03946d85d
cc645dc7811740fc9856b1c7c8e19e89,Alex,c924e3..5a0487e23207986189d
U001,Jack,1234
U002,Mike,1234
可 以 使 用 --fields-terminated-by 参 数 , 指 定 分 割 符 号 , 如
--fields-terminated-by “\t” 将侵害符号设置为制表符。
1.2) 、 --query 指定查询语句
如果在 import 中已经使用了--query 语句则--where 和--table 将被忽略。 在
--query 所指定的语句中, 必须要将$CONDITIONS 做为条件添加到 where 子句中。 如果
--query 使用后面使用” ” 又引号则应该使用\$CONDITIONS。 注意前面的\(斜线) 。
#!/bin/bash
sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/qlu?characterEncoding=UTF-8 \
--username root \
--password 1234 \
#注意以下使用的 SQL 语句, 如果使用” ” 双引号则必须要添加\在$CONDITIONS 前面
--query "select name,sex,age,addr from studs where sex='0' and addr like '
山东%' and \$CONDITIONS" \
--split-by "name" \
--fields-terminated-by "\t" \ #使用制表符号进行数据分隔
--target-dir /out002 \
-m 2
--query 参数的 SQL 可以写的很复杂, 如下面的示例, 将是一个关联的查询语句:
#!/bin/bash
sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/studs?characterEncoding=UTF-8 \
--username root \
--password 1234 \
--query \
"select s.stud_id,s.stud_name as sname,c.course_name as cname \
from studs s inner join sc on s.stud_id=sc.sid \
inner join courses c on c.course_id=sc.cid where \$CONDITIONS" \
--target-dir /out004 \
--split-by "s.stud_id" \ #根据某个列进行分组
-m 2
2) 、 export 导出到关系型数据库中去
使用 sqoop export 命令可以将 hdfs 数据导出到关系型数据库中去。
#!/bin/bash
sqoop export \
- -connect \
jdbc:mysql://192.168.56.1:3306/weric?characterEncoding=UTF-8 \
--username root \
--password 1234 \
--export-dir /out001 \ #指定导出的目录
--table "studs" \ #指定 hdfs 中数据与数据库中表列的对应关系
--columns "stud_id,stud_age,stud_name" \#指定 hdfs 中数据进行进行分隔
- -fields-terminated-by "\t" \
-m 2








猜你喜欢

转载自www.cnblogs.com/rongby/p/9594420.html