本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan 。该系列课程是应邀实验楼整理编写的,这里需要赞一下实验楼提供了学习的新方式,可以边看博客边上机实验,课程地址为 https://www.shiyanlou.com/courses/237
【注】该系列所使用到安装包、测试数据和代码均可在百度网盘下载,具体地址为 http://pan.baidu.com/s/10PnDs ,下载该 PDF 文件
部署节点操作系统为 CentOS ,防火墙和 SElinux 禁用,创建了一个 shiyanlou 用户并在系统根目录下创建 /app 目录,用于存放 Hadoop 等组件运行包。因为该目录用于安装 hadoop 等组件程序,用户对 shiyanlou 必须赋予 rwx 权限(一般做法是 root 用户在根目录下创建 /app 目录,并修改该目录拥有者为 shiyanlou(chown – R shiyanlou:shiyanlou /app )。
Hadoop 搭建环境:
l 虚拟机操作系统: CentOS6.6 64 位,单核, 1G 内存
l JDK : 1.7.0_55 64 位
l Hadoop : 1.1.2
Sqoop 即 SQL to Hadoop ,是一款方便的在传统型数据库与 Hadoop 之间进行数据迁移的工具,充分利用 MapReduce 并行特点以批处理的方式加快数据传输,发展至今主要演化了二大版本, Sqoop1 和 Sqoop2 。
Sqoop 工具是 hadoop 下连接关系型数据库和 Hadoop 的桥梁,支持关系型数据库和 hive 、 hdfs , hbase 之间数据的相互导入,可以使用全表导入和增量导入。
那么为什么选择 Sqoop 呢?
l 高效可控的利用资源,任务并行度,超时时间。
l 数据类型映射与转化,可自动进行,用户也可自定义
l 支持多种主流数据库, MySQL,Oracle , SQL Server , DB2 等等
l 两个不同的版本,完全不兼容
l 版本号划分区别, Apache 版本: 1.4.x(Sqoop1); 1.99.x(Sqoop2) CDH 版本 : Sqoop-1.4.3-cdh4(Sqoop1) ; Sqoop2-1.99.2-cdh4.5.0 (Sqoop2)
l Sqoop2 比 Sqoop1 的改进
(1) 引入 Sqoop server ,集中化管理 connector 等
(2) 多种访问方式: CLI,Web UI , REST API
(3) 引入基于角色的安全机制
Sqoop 架构图 1
Sqoop 架构图 2
比较 | Sqoop1 | Sqoop2 |
架构 | 仅仅使用一个 Sqoop 客户端 | 引入了 Sqoop server 集中化管理 connector ,以及 rest api , web , UI ,并引入权限安全机制 |
部署 | 部署简单,安装需要 root 权限, connector 必须符合 JDBC 模型 | 架构稍复杂,配置部署更繁琐 |
使用 | 命令行方式容易出错,格式紧耦合,无法支持所有数据类型,安全机制不够完善,例如密码暴漏 | 多种交互方式,命令行, web UI , rest API , conncetor 集中化管理,所有的链接安装在 Sqoop server 上,完善权限管理机制, connector 规范化,仅仅负责数据的读写 |
3 、 安装部署 Sqoop
可以到 apache 基金 sqoop 官网 http://hive.apache.org/ ,选择镜像下载地址: http://mirror.bit.edu.cn/apache/sqoop/ 下载一个稳定版本,如下图所示下载支持 Hadoop1.X 的 1.4.5 版本 gz 包:
也可以在 /home/shiyanlou/install-pack 目录中找到该安装包,解压该安装包并把该安装包复制到 /app 目录中
cd /home/shiyanlou/install-pack
tar -xzf sqoop-1.4.5.bin__hadoop-1.0.0.tar.gz
mv sqoop-1.4.5.bin__hadoop-1.0.0 /app/sqoop-1.4.5
ll /app
编辑 /etc/profile 文件,加入 sqoop 的 Home 路径和在 PATH 加入 bin 的路径:
export SQOOP_HOME=/app/sqoop-1.4.5
export PATH=$PATH:$SQOOP_HOME/bin
编译配置文件 /etc/profile ,并确认生效
source /etc/profile
echo $PATH
修改 bin/configure-sqoop 配置文件
cd /app/sqoop-1.4.5/bin
sudo vi configure-sqoop
注释掉 HBase 和 Zookeeper 等检查(除非使用 HBase 和 Zookeeper 等 HADOOP 上的组件)
如果不存在 sqoop-env.sh 文件,复制 sqoop-env-template.sh 文件,然后修改 sqoop-env.sh 配置文件
cd /app/sqoop-1.4.5/conf
cp sqoop-env-template.sh sqoop-env.sh
sudo vi sqoop-env.sh
设置 hadoop 运行程序所在路径和 hadoop-*-core.jar 路径( Hadoop1.X 需要配置)
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/app/hadoop-1.1.2
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/app/hadoop-1.1.2
编译配置文件 sqoop-env.sh 使之生效
输入如下命令验证是否正确安装 sqoop ,如果正确安装则出现 sqoop 提示
sqoop help
如果没有安装 MySql ,请参照第 8 课 3.1 进行安装
到 MySql 官网进入下载页面: http://dev.mysql.com/downloads/connector/j/ ,选择所需要的版本进行下载,这里下载的 zip 格式的文件,然后在本地解压:
也可以在 /home/shiyanlou/install-pack 目录中找到该安装包,把 MySql 驱动包使用如下命令放到 Sqoop 的 lib 目录下
cd /home/shiyanlou/install-pack
cp mysql-connector-java-5.1.22-bin.jar /app/sqoop-1.4.5/lib
查看 MySql 服务并查看状态,如果没有启动则启动服务
sudo service mysql status
sudo service mysql start
进入 MySql 数据库,选择有数据的一张表查看内容,比较导出结果是否正确,输入如下命令:
mysql -uhive -phive
mysql>show databases;
mysql>use hive;
mysql>show tables;
mysql>select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;
使用如下命令列出 MySql 中所有数据库:
sqoop list-databases --connect jdbc:mysql://hadoop:3306/ --username hive --password hive
使用如下命令把 hive 数据库 TBLS 表数据导入到 HDFS 中:
sqoop import --connect jdbc:mysql://hadoop:3306/hive --username hive --password hive --table TBLS -m 1
l --username 数据库用户名
l --password 连接数据库密码
l --table 表名
l -m 1 表示 map 数
使用如下命令查看导出到 HDFS 结果,文件路径在当前用户 hadoop 目录下增加了 TBLS 表目录,查看 part-m-00000 文件:
hadoop fs -ls /user/shiyanlou/TBLS
hadoop fs -cat /user/shiyanlou/TBLS/part-m-00000
在使用 hive 之前需要启动 metastore 和 hiveserver 服务,通过如下命令启用:
hive --service metastore &
hive --service hiveserver &
启动用通过 jps 命令可以看到两个进行运行在后台
使用如下命令到把 MySql 中 TBLS 表数据导入到 Hive 中:
sqoop import --connect jdbc:mysql://hadoop:3306/hive --username hive --password hive --table TBLS --hive-table MySql2Hive --hive-import -m 1
l -- username 为 mysql 中的数据库连接用户名
l --password 为 mysql 中的数据库连接密码
l --table 为导出表
l --hive-table test1 为导出表在 Hive 中的名称
l -m 1 表示 map 数
从运行的日志可以看到,这个过程有两个阶段:
1. 第一个阶段是从 MySql 中把数据到 HDFS 文件中
2. 第二个阶段是从 HDFS 中把数据写入到 MySql 中
登录 hive ,在 hive 创建表并查看该表,命令如下:
hive
hive>show tables;
hive>desc MySql2Hive;