Skip to content

Instantly share code, notes, and snippets.

@kangvcar
Created June 14, 2025 09:57
Show Gist options
  • Select an option

  • Save kangvcar/95092e244da4be4e5f9f68f7198372d7 to your computer and use it in GitHub Desktop.

Select an option

Save kangvcar/95092e244da4be4e5f9f68f7198372d7 to your computer and use it in GitHub Desktop.

云上Hadoop集群Sqoop部署实战教程

环境信息

  • 集群节点: Master、Slave1、Slave2
  • 操作系统: CentOS 7
  • Hadoop版本: 3.3.6
  • 安装目录: /opt
  • 软件下载目录: /opt/software

第一部分:MySQL安装与配置

1.1 在Master节点安装MySQL

说明: MySQL作为关系型数据库,用于存储测试数据。我们选择在Master节点安装以简化集群配置。

# 下载MySQL官方yum源
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 安装yum源
rpm -ivh mysql80-community-release-el7-3.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

# 安装MySQL服务器
yum install mysql-server -y

# 启动MySQL服务
systemctl start mysqld
systemctl enable mysqld

# 查看MySQL状态
systemctl status mysqld

1.2 MySQL初始配置

说明: MySQL安装后需要进行安全配置,包括设置root密码和删除不必要的默认设置。

# 查看临时密码
grep 'temporary password' /var/log/mysqld.log

# 安全配置MySQL
mysql_secure_installation

注意: 这一步需要手动输入临时密码,并设置新的root密码(如:Qwer@321),删除匿名用户,禁止远程root登录,删除测试数据库,重新加载权限表。

1.3 创建测试数据库和数据

说明: 创建专门的测试数据库和用户,用于Sqoop数据导入导出实验。这里创建员工表作为典型的业务场景。

-- 登录MySQL
mysql -u root -pQwer@321

-- 创建测试数据库
CREATE DATABASE sqoop_test;
USE sqoop_test;

-- 创建员工表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    department VARCHAR(50),
    salary DECIMAL(10,2),
    hire_date DATE
);

-- 插入测试数据
INSERT INTO employees (name, department, salary, hire_date) VALUES
('张三', 'IT', 8000.00, '2020-01-15'),
('李四', 'HR', 6000.00, '2019-03-20'),
('王五', 'Finance', 7500.00, '2021-06-10'),
('赵六', 'IT', 9000.00, '2020-11-05'),
('孙七', 'Marketing', 5500.00, '2022-02-28'),
('小八', 'IT', 8500.00, '2021-09-15'),
('小九', 'HR', 6200.00, '2021-12-01'),
('小十', 'Finance', 7800.00, '2022-03-10');

-- 创建Sqoop用户并授权
CREATE USER 'sqoop'@'%' IDENTIFIED BY 'Sqoop@123';
GRANT ALL PRIVILEGES ON sqoop_test.* TO 'sqoop'@'%';
FLUSH PRIVILEGES;

-- 验证数据
SELECT * FROM employees;
exit;

第二部分:Sqoop安装与配置

2.1 下载和安装Sqoop

说明: Sqoop 1.4.7是目前稳定版本,选择与Hadoop 2.6.0兼容的版本。实际使用中Sqoop向下兼容较新的Hadoop版本。

# 在Master节点下载Sqoop
cd /opt/software
wget https://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

# 解压到/opt目录
tar -xzf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt

# 进入/opt目录并重命名
cd /opt
mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop

2.2 配置环境变量

说明: 配置系统环境变量使Sqoop命令在任何位置都可以执行。CLASSPATH配置确保Sqoop能找到必要的依赖库。

# 编辑系统环境变量
vim /etc/profile

# 添加以下内容
export SQOOP_HOME=/opt/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib

# 使环境变量生效
source /etc/profile

2.3 配置Sqoop环境

说明: sqoop-env.sh配置文件用于指定Sqoop运行时需要的Hadoop环境路径,确保Sqoop能正确调用Hadoop组件。

# 进入Sqoop配置目录
cd $SQOOP_HOME/conf

# 复制配置文件模板
cp sqoop-env-template.sh sqoop-env.sh

# 编辑配置文件
vim sqoop-env.sh

sqoop-env.sh 文件中添加以下内容:

# 设置Hadoop环境变量
export HADOOP_COMMON_HOME=/opt/hadoop
export HADOOP_MAPRED_HOME=/opt/hadoop

2.4 安装MySQL JDBC驱动

说明: Sqoop需要JDBC驱动来连接MySQL数据库。这是Sqoop与数据库通信的桥梁,必须放在Sqoop的lib目录下。

# 进入临时目录
cd /tmp

# 下载MySQL JDBC驱动
wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-j-8.0.33.tar.gz

# 解压并复制到Sqoop lib目录
tar -xzf mysql-connector-j-8.0.33.tar.gz
cp mysql-connector-j-8.0.33/mysql-connector-j-8.0.33.jar /opt/sqoop/lib/

# 下载必要的依赖库
wget -P /opt/sqoop/lib https://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar

2.6 验证Sqoop安装

说明: 通过查看版本和测试数据库连接来验证Sqoop是否正确安装和配置。

# 查看Sqoop版本
sqoop version

# 测试MySQL连接
sqoop list-databases \
--connect jdbc:mysql://master:3306/ \
--username sqoop \
--password Sqoop@123

第三部分:Sqoop数据导入操作(MySQL → HDFS)

3.1 导入整个表

说明: 这是最基本的导入方式,将MySQL表的所有数据导入到HDFS。使用单个mapper以避免数据分片问题。

# 导入employees表到HDFS
sqoop import \
--connect jdbc:mysql://master:3306/sqoop_test \
--username sqoop \
--password Sqoop@123 \
--table employees \
--target-dir /user/sqoop/employees \
--num-mappers 1

# 验证导入结果
hdfs dfs -ls /user/sqoop/employees
hdfs dfs -cat /user/sqoop/employees/part-m-00000

3.2 条件导入

说明: 使用WHERE条件可以只导入满足特定条件的数据,减少数据传输量和存储空间。

# 使用WHERE条件导入,例如导入薪资大于7000的员工数据到HDFS
sqoop import \
--connect jdbc:mysql://master:3306/sqoop_test \
--username sqoop \
--password Sqoop@123 \
--table employees \
--where "salary > 7000" \
--target-dir /user/sqoop/high_salary_employees \
--num-mappers 1

# 验证导入结果
hdfs dfs -ls /user/sqoop/high_salary_employees
hdfs dfs -cat /user/sqoop/high_salary_employees/part-m-00000

3.3 自定义查询导入

说明: 使用自定义SQL查询可以实现复杂的数据选择,包括多表关联、字段计算等。注意必须包含$CONDITIONS占位符以支持并行处理。

# 使用自定义SQL查询导入IT部门员工数据
sqoop import \
--connect jdbc:mysql://master:3306/sqoop_test \
--username sqoop \
--password Sqoop@123 \
--query "SELECT id, name, department, salary FROM employees WHERE department='IT' AND \$CONDITIONS" \
--target-dir /user/sqoop/it_employees \
--split-by id \
--num-mappers 2

# 验证导入结果
hdfs dfs -ls /user/sqoop/it_employees
hdfs dfs -cat /user/sqoop/it_employees/part-*

3.4 增量导入

说明: 增量导入只导入新增的数据,适用于定期同步场景。通过指定检查列和上次导入的最大值来实现。

# 基于递增列的增量导入
sqoop import \
--connect jdbc:mysql://master:3306/sqoop_test \
--username sqoop \
--password Sqoop@123 \
--table employees \
--target-dir /user/sqoop/employees_incremental \
--incremental append \
--check-column id \
--last-value 3 \
--num-mappers 1

# 验证增量导入结果
hdfs dfs -ls /user/sqoop/employees_incremental
hdfs dfs -cat /user/sqoop/employees_incremental/part-m-00000

第四部分:Sqoop数据导出操作(HDFS → MySQL)

4.1 创建目标表

-- 登录MySQL
mysql -u root -pQwer@321
USE sqoop_test;

-- 在MySQL中创建目标表
CREATE TABLE employees_export (
    id INT,
    name VARCHAR(50),
    department VARCHAR(50),
    salary DECIMAL(10,2),
    hire_date DATE
);

exit;

4.2 导出数据

# 将HDFS数据导出到MySQL
sqoop export \
--connect jdbc:mysql://master:3306/sqoop_test \
--username sqoop \
--password Sqoop@123 \
--table employees_export \
--export-dir /user/sqoop/employees \
--input-fields-terminated-by ',' \
--num-mappers 1

4.3 验证导出结果

-- 登录MySQL验证导出结果
mysql -u root -pQwer@321
USE sqoop_test;
SELECT * FROM employees_export;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment