Sqoop 快速入门

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

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

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

或在 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




sql

 





转载于:https://www.cnblogs.com/rongby/p/9594420.htmlshell