- 集群节点: Master、Slave1、Slave2
- 操作系统: CentOS 7
- Hadoop版本: 3.3.6
- 安装目录: /opt
- 软件下载目录: /opt/software
说明: 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说明: MySQL安装后需要进行安全配置,包括设置root密码和删除不必要的默认设置。
# 查看临时密码
grep 'temporary password' /var/log/mysqld.log
# 安全配置MySQL
mysql_secure_installation注意: 这一步需要手动输入临时密码,并设置新的root密码(如:Qwer@321),删除匿名用户,禁止远程root登录,删除测试数据库,重新加载权限表。
说明: 创建专门的测试数据库和用户,用于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 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说明: 配置系统环境变量使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说明: 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说明: 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说明: 通过查看版本和测试数据库连接来验证Sqoop是否正确安装和配置。
# 查看Sqoop版本
sqoop version
# 测试MySQL连接
sqoop list-databases \
--connect jdbc:mysql://master:3306/ \
--username sqoop \
--password Sqoop@123说明: 这是最基本的导入方式,将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说明: 使用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说明: 使用自定义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-*说明: 增量导入只导入新增的数据,适用于定期同步场景。通过指定检查列和上次导入的最大值来实现。
# 基于递增列的增量导入
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-- 登录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;# 将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-- 登录MySQL验证导出结果
mysql -u root -pQwer@321
USE sqoop_test;
SELECT * FROM employees_export;