【AI大数据工程师特训笔记】第16讲:大数据环境安装

目录

第一章:WSL与Java环境安装

第二章:Hadoop安装与配置

第三章:Hive安装与配置

第四章:Spark安装与配置

第五章:Flink安装与配置

第六章:DolphinScheduler安装与配置

第七章:DataX安装

第八章:Kafka安装

第九章:FlinkCDC安装

第十章:Iceberg安装

第十一章:大数据组件完整卸载脚本


下面是一份面向零基础的全流程安装指南。带你一步步完成WSL与Java的配置,并依次安装Hadoop、Hive、Spark、Flink和DolphinScheduler,最后用一个整合案例来验证所有组件是否已正确安装和配置。

第一章:WSL与Java环境安装

步骤 1:启用WSL

以管理员身份打开PowerShell或命令提示符,输入:

复制代码
wsl --install

这条命令会自动启用WSL功能并安装默认的Ubuntu发行版。如果命令无效,可以手动启用虚拟化功能:

复制代码
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

安装完成后,根据提示重启电脑。重启后打开Ubuntu应用,设置一个纯英文的用户名和密码。

步骤 2:更新软件包并安装Java 8

注意:其它版本的java版本和部分大数据组件会出现 兼容性 问题,所以我们安装java 8

打开Ubuntu终端,执行以下命令:

复制代码
# 用于更新软件源并升级所有已安装软件到最新版;
sudo apt update && sudo apt upgrade -y

# 用于安装 Java 8 开发环境,为后续大数据组件提供运行基础。
# 卸载所有与 openjdk 相关的包(包括 JDK、JRE、headless 等)
sudo apt purge -y 'openjdk-*'

# 清理不再需要的依赖
sudo apt autoremove -y

# 验证是否卸载干净(应该没有输出)
dpkg -l | grep openjdk

# 下载 jdk 8
sudo apt install -y openjdk-8-jdk

执行成功后显示如下内容:

验证Java是否安装成功:

复制代码
java -version

输出如下内容,即表示安装成功:

配置JAVA_HOME环境变量,编辑 ~/.bashrc 文件:

复制代码
nano ~/.bashrc

在文件末尾添加以下内容:

复制代码
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

如图所示:

在 nano 编辑器中,按 Ctrl+O 回车保存,再按 Ctrl+X 退出。

**注意:**在 nano 编辑器的"File Name to Write"提示下,直接按 回车键 (Enter) 即可保存文件,然后再按 Ctrl+X 退出编辑器。

执行 如下命令使配置生效

复制代码
source ~/.bashrc

第二章:Hadoop安装与配置

步骤 1:下载并解压 Hadoop

复制代码
# 创建一个bigdata文件夹
mkdir bigdata

# :切换到bigdata目录中。
cd bigdata

# :从 Apache 官网下载 Hadoop 3.3.6 的压缩包。
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz

# :解压下载的 Hadoop 压缩包(-x 解压,-z 处理 gzip,-v 显示详情,-f 指定文件)。
tar -xzvf hadoop-3.3.6.tar.gz

步骤 2:配置 环境变量

编辑 ~/.bashrc,在末尾添加:

复制代码
# 配置环境变量
nano ~/.bashrc

# 在文件末尾添加以下两行(注意路径要指向你当前的 bigdata 目录):
export HADOOP_HOME=/home/tianpeng/bigdata/hadoop-3.3.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin


# 保存(Ctrl+O,回车,Ctrl+X),然后执行:
source ~/.bashrc

# 验证安装
hadoop version

执行 source ~/.bashrc 使配置生效,输出如下内容:

步骤 3:配置 Hadoop 核心文件

1、修改 hadoop-env.sh 中的 JAVA_HOME

复制代码
nano /home/tianpeng/bigdata/hadoop-3.3.6/etc/hadoop/hadoop-env.sh

找到 export JAVA_HOME 行,修改为:

复制代码
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

2、编辑 core-site.xml

复制代码
nano /home/tianpeng/bigdata/hadoop-3.3.6/etc/hadoop/core-site.xml

在 <configuration> 内添加:

复制代码
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
</property>

3、编辑 hdfs-site.xml

复制代码
nano /home/tianpeng/bigdata/hadoop-3.3.6/etc/hadoop/hdfs-site.xml

在 <configuration> 内添加:

复制代码
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

4、编辑 yarn-env.sh

复制代码
nano $HADOOP_HOME/etc/hadoop/yarn-env.sh

在文件末尾添加以下内容 找到(或新增)YARN_RESOURCEMANAGER_OPTS 和 YARN_NODEMANAGER_OPTS 变量,并添加 --add-opens 参数:

复制代码
# 为 ResourceManager 和 NodeManager 开放 java.lang 模块,允许反射访问
export YARN_RESOURCEMANAGER_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED"
export YARN_NODEMANAGER_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED"

这些参数会告诉 JVM 允许未命名模块(比如 Hadoop 的 jar 包)访问 java.lang、java.util 等包内的受保护方法。

步骤四:格式化 NameNode 并启动 Hadoop

复制代码
# 格式化(仅首次执行)
hdfs namenode -format

# 安装 SSH 服务并启动
sudo apt update
sudo apt install openssh-server -y
sudo service ssh start

# 配置无密码 SSH 登录(本地)
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh-keyscan -H localhost >> ~/.ssh/known_hosts

# 测试 SSH 连接
ssh localhost

# 启动 HDFS 和 YARN
start-dfs.sh
start-yarn.sh

显示如下内容,即表示安装成功:

如果提示命令未找到,请确保已执行 source ~/.bashrc 或使用绝对路径:

复制代码
/home/tianpeng/bigdata/hadoop-3.3.6/sbin/start-dfs.sh
/home/tianpeng/bigdata/hadoop-3.3.6/sbin/start-yarn.sh

检查进程:

复制代码
jps

应该看到 NameNode、DataNode、ResourceManager、NodeManager。如果 jps 不存在,执行:

复制代码
sudo apt install openjdk-11-jdk-headless -y

步骤 5:验证 Hadoop 安装

在 Windows 浏览器中访问:

复制代码
# HDFS NameNode : 显示 Hadoop 概述页面,含集群 ID、存储容量等信息
http://localhost:9870

看到 Hadoop Web 界面即成功。

复制代码
# YARN ResourceManager : 显示集群资源管理和应用列表
http://localhost:8088

附:停止服务命令

复制代码
stop-dfs.sh
stop-yarn.sh

现在你可以继续后续 Hive、Spark 等组件的安装了。

第三章:Hive安装与配置

好的,根据你之前成功连接 WSL 中 MySQL 的经验,我重新编写了 步骤 1:安装并配置 MySQL 作为 Hive 元数据库,确保你能在 Windows 的 DBeaver 中顺利连接。

步骤 1:安装并配置 MySQL(供 Hive 使用)

1、在 WSL 中安装 MySQL

复制代码
# 更新软件包列表并安装 MySQL 服务器
sudo apt update
sudo apt install mysql-server -y

# 启动 MySQL 服务
sudo service mysql start

# 检查 MySQL 运行状态
sudo service mysql status

2、设置 root 密码并完成安全配置

复制代码
# 进入mysql数据库 (没有设置密码的情况下)
sudo mysql
# 设置密码的情况下执行
mysql -u root -p

# 执行语句修改root账户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
EXIT;

# 验证密码是否生效
mysql -u root -p

3、配置 MySQL 允许远程连接

编辑 MySQL 配置文件:

复制代码
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 bind-address = 127.0.0.1,将其注释或改为 0.0.0.0:

复制代码
# bind-address = 127.0.0.1
bind-address = 0.0.0.0

保存(Ctrl+O,回车,Ctrl+X),然后重启 MySQL:

复制代码
sudo service mysql restart

4、创建允许远程连接的用户

为了安全,建议创建一个专门用于远程连接的用户(例如 dbeaver),并授予所有权限。

复制代码
# 登录 MySQL(使用 root 密码)
mysql -u root -p

在 MySQL 命令行中执行:

复制代码
-- 为现有的 root 用户添加远程访问权限(允许从任何主机连接)
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

如果你更习惯使用 root 远程连接,也可以创建 'root'@'%',但生产环境不推荐。

5、在 Windows 的 DBeaver 中连接

(1)新建 MySQL 连接

通过命名查看WSL的IPv4地址:

复制代码
ip addr show eth0 | grep inet

输出如下内容:

配置连接:

(2)配置驱动属性

切换到 驱动属性 标签页,添加以下两个属性:

属性名 值
allowPublicKeyRetrieval true
useSSL false

(3)测试连接

点击 测试连接,如果提示下载驱动,允许下载。成功后会显示"已连接"。

(4)验证数据库

连接成功后,执行 SHOW DATABASES;,应该能看到默认数据库(如 information_schema、mysql、sys 等)。

注意: hive_metastore 是后续初始化后才会显示出来,可以用来验证mysql数据库与Hive是否连通

步骤 2:在 ~/bigdata 目录下下载并解压 Hive

复制代码
# 下载Hive安装包(使用华为镜像下载)
wget https://mirrors.huaweicloud.com/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz

# 解压
tar -xzvf apache-hive-3.1.3-bin.tar.gz

此时 Hive 的安装路径为:/home/tianpeng/bigdata/hive-3.1.3

步骤 3:配置 Hive 环境变量

编辑 ~/.bashrc,执行如下命令:

复制代码
nano ~/.bashrc

添加以下两行:

复制代码
export HIVE_HOME=/home/tianpeng/bigdata/apache-hive-3.1.3-bin
export PATH=$PATH:$HIVE_HOME/bin

保存后执行:

复制代码
source ~/.bashrc

根据你当前的目录结构(~/bigdata/apache-hive-3.1.3-bin/conf 中已存在 hive-default.xml.template)。

步骤4:配置 Hive(使用最小配置文件)

1 进入 Hive 配置目录

复制代码
cd $HIVE_HOME/conf

2 删除可能存在的旧配置文件(避免冲突)

复制代码
rm -f hive-site.xml

3 使用 cat 命令创建 hive-site.xml 并写入内容

直接复制以下整段命令到终端执行:

复制代码
cat > hive-site.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExist=true</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
    </property>
</configuration>
EOF

注意 :请将 <value>123456</value> 中的 123456 替换为你的 MySQL root 实际密码。

4 验证文件内容是否正确

复制代码
cat hive-site.xml

应该看到以 <?xml version="1.0" encoding="UTF-8"?> 开头的完整 XML 内容。

5 保存并退出(无需额外操作, cat 命令已自动保存)

步骤5:下载 MySQL JDBC 驱动并初始化元数据库

复制代码
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar

cp mysql-connector-java-8.0.16.jar $HIVE_HOME/lib/

初始化 Hive 元数据库:

复制代码
# 配置环境变量
export PATH=$PATH:$HIVE_HOME/bin

# 初始化元数据库
schematool -dbType mysql -initSchema

看到输出 schemaTool completed 表示成功,如下图所示:

验证mysql数据库中hive的元数据是否配置成功:

步骤6:验证 Hive 是否可用

启动 Hive 命令行:

复制代码
hive

在 hive> 提示符下执行:

复制代码
show databases;

如果能正常显示,说明 Hive 安装配置成功。

步骤7:使用 DBeaver 去连接 Hive :

在 DBeaver 中连接 Hive 需要先启动 HiveServer2 服务(默认端口 10000),然后在 DBeaver 中配置 Hive 驱动和连接参数。以下是完整步骤。

1、禁用 HiveServer2 的代理用户模拟

在 hive-site.xml 中添加配置

复制代码
nano $HIVE_HOME/conf/hive-site.xml

在 <configuration> 中添加:

复制代码
<property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
    <description>Disable impersonation, all queries run as the HiveServer2 process user (tianpeng).</description>
</property>

2、在 WSL 中启动 HiveServer2

HiveServer2 是 Hive 提供的 JDBC 服务,允许外部工具(如 DBeaver)连接。

复制代码
# 进入 Hive 安装目录
cd $HIVE_HOME

# 后台启动 Metastore 服务
nohup bin/hive --service metastore &

# 启动 HiveServer2(后台运行)
nohup bin/hive --service hiveserver2 &

验证是否启动成功:

复制代码
ss -tlnp | grep -E "9083|10000"

输出如下内容,即表示启动成功:

2、在 DBeaver 中创建 Hive 连接

(1)点击 数据库 → 新建连接 → 选择 Hive JDBC(刚创建的驱动)。

(2)填写连接参数:

通过输入如下命令查询WSL的IPv4地址:

  • 端口 :10000

  • 数据库 :default(可留空)

  • 用户名 :当前 WSL 用户名(如:tianpeng),因为 Hive 默认使用操作系统用户认证

  • 密码:通常为空(如果未配置认证)

(3)点击 测试连接,如果提示下载驱动,允许下载。

(4)连接成功后,即可在 DBeaver 中浏览 Hive 的表和执行 SQL。

3、验证连接

连接成功后,在 DBeaver 的 SQL 编辑器中执行:

复制代码
SHOW DATABASES;

应该能看到 default 和你之前创建的 test 等数据库。如果之前创建了 hive_metastore 数据库,那是元数据内部库,通常不会在 Hive 中显示

第四章:Spark安装与配置

步骤 1:下载并解压 Spark(在用户目录)

复制代码
# 进入 bigdata 目录(如果不存在则创建)
cd ~/bigdata

# 使用华为云镜像下载 Spark 3.4.3(与 Hadoop 3.3 兼容)
wget https://mirrors.huaweicloud.com/apache/spark/spark-3.4.3/spark-3.4.3-bin-hadoop3.tgz

# 解压
tar -xzvf spark-3.4.3-bin-hadoop3.tgz

解压后会得到目录:~/bigdata/spark-3.4.3-bin-hadoop3。

后续路径将使用 /home/tianpeng/bigdata/spark-3.4.3(假设你的用户名为 tianpeng)。

步骤 2:配置 Spark 环境变量

编辑 ~/.bashrc 文件,将 Spark 的路径添加到环境变量中。

复制代码
nano ~/.bashrc

在文件末尾添加以下两行(注意路径是你的实际解压目录):

复制代码
export SPARK_HOME=/home/tianpeng/bigdata/spark-3.4.3-bin-hadoop3
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

保存:Ctrl+O → 回车 → Ctrl+X。

然后执行以下命令使配置立即生效:

复制代码
source ~/.bashrc

验证:

复制代码
echo $SPARK_HOME
which spark-shell

输出如下内容:

步骤 3:配置 Spark 与 Hadoop 集成

Spark 需要知道 Hadoop 的配置目录(core-site.xml、hdfs-site.xml 等),以便访问 HDFS 和 YARN。

首先,复制 Spark 的环境配置文件模板:

复制代码
cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh

然后编辑该文件:

复制代码
nano $SPARK_HOME/conf/spark-env.sh

在文件末尾添加以下两行(注意 Hadoop 路径是你的实际安装位置):

复制代码
export HADOOP_CONF_DIR=/home/tianpeng/bigdata/hadoop-3.3.6/etc/hadoop
export SPARK_MASTER_HOST=localhost

保存并退出。

如果你之前已将 Hadoop 移动到 /usr/local/hadoop,则 HADOOP_CONF_DIR 应改为 /usr/local/hadoop/etc/hadoop。这里以你之前的 ~/bigdata/hadoop-3.3.6 为例。

步骤 5:配置与 MySQL 集成,访问 Hive 的元数据库

将mysql的驱动复制一份到spark的路径下:

复制代码
# 确认 Spark 的 jars 目录路径
ls -ld $SPARK_HOME/jars

# 复制驱动文件(选择一个,比如 mysql-connector-java-8.0.16.jar)
cp /home/tianpeng/bigdata/mysql-connector-java-8.0.16.jar $SPARK_HOME/jars/

# 验证复制成功
ls -l $SPARK_HOME/jars/mysql-connector-java-*.jar

步骤 6:启动 Spark 并验证

Spark 支持独立集群模式(Standalone),我们启动一个 Master 和一个 Worker 进程。

复制代码
# 1. 停止所有 Spark 进程(Master、Worker、Thrift Server)
cd ~/bigdata/spark-3.4.3-bin-hadoop3
./sbin/stop-master.sh
./sbin/stop-worker.sh
./sbin/stop-thriftserver.sh

# 强制清理残留(如果有)
jps | grep -E "Master|Worker|HiveThriftServer2" | awk '{print $1}' | xargs kill -9

# 3. 验证 Master 监听状态 应该显示 172.25.234.166:7077 或 0.0.0.0:7077,不是 127.0.0.1:7077。
sudo netstat -tlnp | grep 7077

# 4. 启动 Worker
./sbin/start-worker.sh spark://172.25.234.166:7077

# 5. 重新启动 Spark Thrift Server(连接到 Master,使用 10003 端口)
./sbin/start-thriftserver.sh \
  --master spark://172.25.234.166:7077 \
  --hiveconf hive.server2.thrift.port=10003 \
  --hiveconf hive.server2.thrift.bind.host=0.0.0.0

执行如下命令,验证是否连接成功:

复制代码
jps

输出如下内容:

验证 Master Web UI

打开 Windows 浏览器,访问:http://localhost:8080

应该能看到 Spark Master 的 Web 界面,显示 Worker 资源等信息。

验证 Spark Shell

另开一个终端,执行:

复制代码
spark-shell

如果能进入 Scala 交互式环境(出现 scala> 提示符),说明 Spark 安装成功:如下图收所示:

补充说明

  • 停止 Spark 服务:

复制代码
  $SPARK_HOME/sbin/stop-master.sh $SPARK_HOME/sbin/stop-worker.sh
  • 提交任务到 YARN(可选):

如果你希望 Spark 任务运行在 Hadoop YARN 上,可以修改 spark-env.sh 并确保 Hadoop 已启动。但单机学习环境下,Standalone 模式足够。

步骤 7:通过Dbeaver去连接SparkSQL完成开发

1、在 DBeaver 中配置并连接 Spark

(1)创建新的数据库连接

1)在 DBeaver 中,点击 数据库 -> 新建数据库连接。

2)在 通用 或 All 标签页中,搜索你创建的驱动名称(如 Apache Spark SQL),选中它,然后点击 下一步。

复制代码
jdbc:hive2://172.25.234.166:10003/default?auth=noSasl
# 如果认证报错,可以尝试:
jdbc:hive2://172.25.234.166:10003/default?auth=user

(2)配置连接参数

在连接设置窗口中,填写以下信息:

参数 说明 示例值
主机 WSL 的 IP 地址。你可以通过 WSL 终端命令 `ip addr show eth0 grep inet` 查看。
端口 Spark Thrift Server 的默认端口是 1000 3 ,不是 10000。如果启动时修改了端口,请填写你指定的端口。 10003
数据库 目标数据库名称,例如 default。也可以留空,连接后再选择。 default
用户名 如果未配置认证,可随意填写。在启用了代理用户(impersonation)的环境下,建议填写你的 WSL 用户名,如 tianpeng。 tianpeng
密码 如果未配置认证,可以留空。 (留空)
URL (可选)如果你更习惯使用完整的 JDBC URL,可以切换到此模式,URL 格式通常为 jdbc:hive2://<host>:<port>/<database>。 jdbc:hive2://172.25.234.166:10002/default

(3)测试并完成连接

1)点击 测试连接 按钮。

2)如果是第一次连接,DBeaver 会提示你下载驱动文件,点击 下载 即可。首次连接可能需要一点时间,请耐心等待。

3)测试成功后,点击 完成。此时,DBeaver 的数据库导航器中就会出现你的 Spark SQL 连接。

**注意:**因为 DBeaver 用了 Hive 的驱动来连接 Spark,而 Spark 读取的又是 Hive 的元数据,所以界面上显示为 Hive 是完全正常的。这本质上就是通过 Spark 引擎来执行 Hive 上的任务,也就是我们常说的 "Spark on Hive" 架构。

有一点需要明确,"Spark on Hive" 和 "Hive on Spark" 是两个不同的概念:

  • Spark on Hive:指的是 Spark 作为 SQL 引擎,读取 Hive Metastore 中的元数据来操作数据。

  • Hive on Spark:指的是 Hive 原本的 MapReduce 执行引擎被替换成了更快的 Spark 引擎。

因为无论是 Spark(启用 Hive 支持)还是 Hive 客户端,它们操作的都是同一份元数据。当你在 Spark 中执行 CREATE DATABASE ... 或 CREATE TABLE ... 时,对应的库、表的定义信息(字段、类型、HDFS 路径等)会被写入共享的 Hive Metastore 数据库。Hive 客户端在读取元数据时,自然也能看到这些新增的对象。

3、在 DBeaver 中执行 Spark SQL 查询

连接成功后,你就可以像操作传统数据库一样,在 DBeaver 中编写和执行 Spark SQL 了。

示例:使用 Spark SQL 处理销售数据

复制代码
-- 创建一个新数据库,用于存放本次示例表
CREATE DATABASE IF NOT EXISTS sales_db;


-- 创建销售数据表 sales_data
CREATE TABLE IF NOT EXISTS sales_db.sales_data (
    order_id        BIGINT,
    product_category STRING,
    sale_amount     DECIMAL(10,2),
    customer_id     BIGINT,
    sale_date       DATE
);
-- 插入示例数据
INSERT INTO sales_db.sales_data VALUES
(1, 'Electronics', 299.99, 101, date_add(current_date(),1)),
(2, 'Clothing',     49.99, 102, date_add(current_date(),2)),
(3, 'Electronics', 599.00, 101, date_add(current_date(),3)),
(4, 'Books',        19.99, 103, date_add(current_date(),4)),
(5, 'Clothing',     89.99, 104, date_add(current_date(),5)),
(6, 'Electronics', 199.99, 105, date_add(current_date(),6)),
(7, 'Books',        29.99, 103, date_add(current_date(),7)),
(8, 'Clothing',     39.99, 106, date_add(current_date(),8)),
(9, 'Electronics', 899.00, 107, date_add(current_date(),9)),
(10, 'Books',       15.99, 108, date_add(current_date(),10));

-- 验证数据
SELECT * FROM sales_db.sales_data LIMIT 5;

这个查询会交给 Spark 引擎去执行,DBeaver 会负责展示最终的计算结果。

配置端口转发

(1)Spark 应用的 Driver UI 默认绑定到了 WSL 2 的虚拟 IP(10.255.255.254),而不是 0.0.0.0 或 Windows 可访问的地址。

(2)Windows 宿主机无法直接访问 WSL 2 的私网 IP(WSL 2 使用 NAT 网络,IP 会变化且不对外路由)。

在 Windows 管理员 PowerShell 中执行:

复制代码
# 获取当前 WSL 的 IP
$wsl_ip = wsl hostname -I
# 添加端口转发规则
netsh interface portproxy add v4tov4 listenport=4040 listenaddress=0.0.0.0 connectport=4040 connectaddress=$wsl_ip
# (可选)开放防火墙
New-NetFirewallRule -DisplayName "Spark 4040" -Direction Inbound -LocalPort 4040 -Protocol TCP -Action Allow

完成后访问 http://localhost:4040 即可。即可看到我们每次跑的SparkSQL任务

性能优化建议

  • 使用执行计划分析:DBeaver 提供了可视化执行计划的功能,可以帮助你理解 Spark SQL 是如何被执行的,从而找出性能瓶颈。

  • 善用 Spark SQL 特有函数 :Spark SQL 拥有丰富的内置函数,如 approx_percentile, collect_list 等,可以在查询中充分利用它们来简化逻辑。

  • 调整查询以利用 Spark 优化:例如,在多表 JOIN 时,合理调整 JOIN 顺序,使用 Broadcast Join 来优化小表与大表的关联,可以显著提升性能。

第五章:Flink安装与配置

步骤 1:下载并解压 Flink

复制代码
# 切换到当前用户主目录下的 bigdata 文件夹。
cd ~/bigdata

# 从华为云镜像站下载 Flink 1.18.1 的安装包。
wget https://mirrors.huaweicloud.com/apache/flink/flink-1.18.1/flink-1.18.1-bin-scala_2.12.tgz

# 解压下载的 Flink 压缩包(-x 解压,-z 处理 gzip,-v 显示详情,-f 指定文件)。
tar -xzvf flink-1.18.1-bin-scala_2.12.tgz

此时 Flink 的安装路径为:/home/tianpeng/bigdata/flink-1.18.1

步骤 2:配置 Flink 环境变量

执行如下的命令:

复制代码
nano ~/.bashrc

编辑 ~/.bashrc 文件,在末尾添加以下两行:

复制代码
export FLINK_HOME=/home/tianpeng/bigdata/flink-1.18.1
export PATH=$PATH:$FLINK_HOME/bin

保存后执行:

复制代码
source ~/.bashrc

验证环境变量:

复制代码
echo $FLINK_HOME

步骤 3:修改 Flink 配置

修改 Flink 配置文件

复制代码
nano $FLINK_HOME/conf/flink-conf.yaml

在文件中找到或添加以下几行(如果已存在则修改值):

复制代码
rest.bind-address: 0.0.0.0
rest.bind-port: 8083

taskmanager.numberOfTaskSlots: 5
parallelism.default: 3

注意:Spark Worker默认端口是8081,我们将其更改为8083。避免端口冲突。

将下面两个参数的数据调整为5和3:

保存:Ctrl+O → 回车 → Ctrl+X。

重启 Flink 集群

复制代码
$FLINK_HOME/bin/stop-cluster.sh
$FLINK_HOME/bin/start-cluster.sh

验证监听地址

复制代码
ss -tlnp | grep 8083

现在应该显示 0.0.0.0:8081 或 *:8083。

在 Windows 浏览器中访问

打开浏览器,访问 http://localhost:808``3,应该能看到 Flink Dashboard。

注意事项:

  • 所有文件均保留在 ~/bigdata 下,与 Hadoop、Hive、Spark 等保持一致,无需 sudo 权限。

  • 如果后续需要升级 Flink 版本,只需下载新版本解压并修改 FLINK_HOME 环境变量即可。

  • 启动 Flink 前无需启动 Hadoop,Flink 可以独立运行(Standalone 模式)。如果需要访问 HDFS,则需确保 Hadoop 已启动并配置好 HADOOP_HOME。

这样,你的 Flink 就安装在了用户目录下,与其他大数据组件统一管理。

步骤 4:案例演示

下面给出一个 Flink SQL 实时统计案例 ,使用内置的 datagen 数据源生成模拟数据,进行简单的聚合计算,并将结果输出到控制台。这个案例无需依赖 Kafka、MySQL 等外部组件,只要 Flink 集群正常运行即可执行,非常适合快速验证和学习。

1. 启动 Flink 集群

确保 Flink 已启动:

复制代码
$FLINK_HOME/bin/start-cluster.sh

访问 http://localhost:808``3 确认 Web UI 正常。

2. 启动 Flink SQL Client

复制代码
$FLINK_HOME/bin/sql-client.sh embedded -D rest.address=localhost -D rest.port=8083

进入 Flink SQL> 提示符后,可以执行以下 SQL。

3. 创建 数据源 表(模拟订单流)

复制代码
-- 创建一个 datagen 源表,每秒生成 2 条订单数据
CREATE TABLE orders_source (
    order_id INT,
    product_name STRING,
    amount DECIMAL(10,2),
    event_time TIMESTAMP(3),
    WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
    'connector' = 'datagen',
    'rows-per-second' = '2',
    'fields.order_id.kind' = 'sequence',
    'fields.order_id.start' = '1',
    'fields.order_id.end' = '1000000',
    'fields.product_name.length' = '5',
    'fields.amount.min' = '10',
    'fields.amount.max' = '500'
);

输出如下内容:

4. 创建数据结果表(打印到控制台)

复制代码
CREATE TABLE order_stats_sink (
    window_start TIMESTAMP(3),
    product_name STRING,
    total_amount DECIMAL(10,2),
    order_count BIGINT
) WITH (
    'connector' = 'print'
);

输出如下内容:

5. 执行统计查询并写入结果表

复制代码
INSERT INTO order_stats_sink
SELECT
    TUMBLE_START(event_time, INTERVAL '1' MINUTE) AS window_start,
    product_name,
    SUM(amount) AS total_amount,
    COUNT(*) AS order_count
FROM orders_source
GROUP BY
    TUMBLE(event_time, INTERVAL '1' MINUTE),
    product_name;

输出如下内容:

6. 观察输出

提交后,Flink 作业会开始运行。在 SQL Client 中,你会看到类似以下的打印输出(每 1 分钟输出一次):

复制代码
+I[2025-04-22 10:15:00.000, product_abc, 1240.50, 8]
+I[2025-04-22 10:15:00.000, product_xyz, 980.00, 6]
...

在 SQL Client 中执行如下SQL, 应看到生成的模拟数据:

复制代码
SET 'parallelism.default' = '1';

SELECT * FROM orders_source LIMIT 5;

注意:

  • 你的 TaskManager 有 5 个 slots,INSERT 作业默认的并行度通常是 parallelism.default(在 Flink 1.18.1 中默认为 3)。如果作业使用了 3 个 slot,那么剩余 2 个 slot。

  • SELECT * FROM orders_source LIMIT 5; 也是一个独立的流查询作业,默认也会尝试申请相同数量的 slot(3 个),但可用 slot 可能不足(例如只剩 2 个),就会报资源不足。

所以我们在执行select查询前 ,先执行 SET 'parallelism.default' = '1';

7. 停止作业

在 SQL Client 中,按 Ctrl+C 退出客户端,或者通过 Web UI 取消作业。

**总结:**这个案例展示了 Flink SQL 的核心能力:

  • 使用 datagen 生成测试数据(无需外部数据源)

  • 定义水位线(WATERMARK)处理乱序数据

  • 使用滚动窗口(TUMBLE)进行时间窗口聚合

  • 将结果输出到 print 连接器(控制台)

在你的 Flink SQL 小案例中,数据是实时流动的,并没有像传统数据库那样被"存储"在一个持久化的位置。具体来说:

  • 源表 orders_source 使用了 datagen 连接器。这个连接器只在内存中模拟生成数据,数据不会落盘,一旦 Flink 作业停止,所有生成的数据就消失了。

  • 结果表 order_stats_sink 使用了 print 连接器。它会将计算结果直接输出到 Flink TaskManager 的 标准输出 (通常是日志文件),例如在 $FLINK_HOME/log/ 目录下的 .out 文件中,也不会持久化保存。

因此,整个案例中没有数据被永久存储 。你执行的 INSERT INTO ... SELECT 实际上启动了一个持续运行的流计算作业,它实时读取源表生成的数据、按分钟窗口聚合、并将每个窗口的结果实时打印到控制台(或日志)。当你停止作业或退出 SQL Client 时,所有中间状态和结果都会丢失。

如果你希望数据能被持久化,可以使用 Kafka 、JDBC 或 FileSystem 等连接器来定义源表和结果表。

在 Flink 中创建的表,其定义 和数据 是分开存储的。简单来说,数据的存储位置取决于创建表时指定的连接器(Connector) ,而表的定义则取决于你是否将其注册到了持久化的 Catalog 中。

🗄️ 表的数据存储在连接器定义的地方

Flink SQL 创建的表更像是一个"虚拟视图",它告诉 Flink 去哪里读取和写入数据。真正的数据存储在连接器定义的外部系统里。

连接器 (Connector) 存储位置
DataGen 数据在内存中即时生成,不持久化存储。用于测试。
Print 数据直接输出到 TaskManager 的日志文件(.out 或 .err),用于调试。
Kafka 数据存储在 Kafka Broker 中,Flink 负责生产和消费。
FileSystem ( HDFS /S3) 数据持久化到分布式文件系统。
JDBC ( MySQL / PostgreSQL ) 数据存储在关系型数据库中。
Hive 数据存储在 Hive 的 Metastore 中,可实现与 Hive 的互通。

📝 表的定义存储在 Catalog 中

  • 元数据默认不持久化:表的定义(Schema、Connector 配置等)默认存储在 Flink SQL Client 的临时内存中。因此,退出 Client 后表定义会丢失。

  • 使用 Catalog 持久化 :要持久化表定义,可以创建并使用一个持久化的 Catalog ,如 HiveCatalog。将表创建在持久化 Catalog 下,关闭 Client 后再打开,表定义依然存在。

💾 作业状态数据存储在状态后端

在执行有状态的流计算(如窗口聚合)时,作业的中间状态(State)会存储在 Flink 的状态后端中。可配置的状态后端如下:

状态后端 (State Backend) 存储位置
HashMapStateBackend 状态存储在 TaskManager 的 JVM 堆内存中。
RocksDBStateBackend 状态存储在 TaskManager 本地磁盘(如 SSD/HDD)上。
  • 持久化与恢复 :为防止作业崩溃时状态丢失,Flink 会定期将状态数据持久化到外部文件系统(如 HDFS、S3),生成 Checkpoint 。作业失败时,可以从最近的 Checkpoint 恢复状态。你也可以手动创建 Savepoint 来保存状态,用于作业升级或迁移。

**💎 总结:**总的来说,Flink 中的数据存储是一个分层、可插拔的系统,它允许你根据不同的需求和场景来选择合适的存储方式。

如果对某个特定连接器(比如 Kafka 或 HDFS)的数据存储细节感兴趣,随时可以继续问我。

步骤 5:通过 DBeaver 连接FlinkSQL

DBeaver 默认不包含 Flink 驱动,我们接下来要手动添加的步骤。这个过程其实很简单,本质就是为它配上一个专属的"翻译官"。你当前遇到的"No items found"是正常情况,这正是我们需要手动添加 Flink 驱动的原因。

1、在 DBeaver 中添加 Flink JDBC 驱动

我们需要先为 DBeaver 配置一个能"听懂" Flink 语言的新驱动。

(1)打开驱动管理器 :在 DBeaver 菜单栏点击 数据库(Database) -> 驱动管理器(Driver Manager)。

(2)新建驱动 :在驱动管理器窗口中,点击 新建(New) 按钮。

(3)填写驱动信息:在弹出的"创建新驱动"窗口中,按以下信息填写:

  • 驱动名称 (Driver Name) :Apache Flink (可自定义)

  • 类名 (Class Name) :org.apache.flink.table.jdbc.FlinkDriver

  • URL 模板 (URL Template) :jdbc:flink://{host}:{port}

  • 默认 端口 (Default Port) :8083 (这是 Flink SQL Gateway 的默认端口)

(4)添加驱动文件 (Libraries):

  • 切换到 库(Libraries) 标签页。

  • 点击 添加文件(Add File) 按钮。

  • 关键一步 :你需要一个专用的 flink-sql-jdbc-driver-bundle JAR 包。Flink 官方并没有将它打包在发行版里,需要我们手动获取。

  • 如何获取?

    • 你可以从 Maven 官方仓库下载:点击这里下载。

    • 选择与你 Flink 版本(如 1.18.1)匹配的 flink-sql-jdbc-driver-bundle-{VERSION}.jar 文件下载。

(5)保存驱动 :点击 确定(OK) 保存。

即表示配置成功:

2、启动 Flink SQL Gateway 服务

驱动配置好后,我们需要在 WSL 里把 Flink 的"服务端"启动起来,让 DBeaver 能找到它。

(1)打开一个新的 WSL 终端 ,并确保 Flink 集群本身已启动 ($FLINK_HOME/bin/start-cluster.sh)。

(2)启动 SQL Gateway:

复制代码
cd $FLINK_HOME
./bin/sql-gateway.sh start -Dsql-gateway.endpoint.rest.address=localhost -Dsql-gateway.endpoint.rest.port=8084

启动成功后,输入如下命令,验证端口(服务会监听在 8083 端口):

复制代码
ss -tlnp | grep 8084

3、在 DBeaver 中创建连接

现在万事俱备,可以创建连接了。

(1)新建连接 :在 DBeaver 主界面点击 新建连接 按钮。

(2)选择驱动 :在"通用"或"全部"分类下,找到你刚刚创建的 Apache Flink 驱动。

(3)配置连接:

  • 主机 (Host):WSL的IPv4地址来登录

  • 端口 (Port) :8083

  • 用户名/密码:当前版本可以留空。

(4)测试连接 :点击 测试连接(Test Connection)。如果一切顺利,你应该会看到"连接成功"的提示。

(5)完成 :点击 完成(Finish),连接就会出现在左侧的数据库导航器中。

4、连接后的功能与限制

成功连接后,你就可以像使用普通数据库一样,在 DBeaver 中编写和执行 Flink SQL 了。但需要了解以下几点:

  • 核心用途:在 DBeaver 中编写 Flink SQL 代码,并提交给 Flink 集群执行,非常方便。

  • 主要限制:

    • ⚠️ 流计算作业 :对于持续运行的流计算任务(比如 INSERT INTO ... SELECT ...),你可能需要在 Flink 的 Web UI (localhost:8081) 上手动取消作业,DBeaver 的"停止"按钮可能无法直接中断它。

    • 📄 结果集限制 :使用 SELECT 语句查询有限数据集 (如加了 LIMIT 子句)时,DBeaver 能正常返回结果。但对于无界的流式数据,查询会一直运行而不会自动返回,这时需要在 Web UI 上手动取消作业。

    • 🔧 功能 兼容性:DBeaver 可能不完全支持 Flink 的所有高级 SQL 特性。

我们在DBeaver中输入如下的查询语句,查看数据:

复制代码
SHOW CATALOGS;
SHOW DATABASES;
USE default_catalog.default_database;
SHOW TABLES;

如果上述脚本都能正常跑通,说明连接正常。

注意:此时执行如下命令可能会报错

复制代码

SELECT * FROM orders_source LIMIT 5;

查询失败原因:很可能是 datagen 表通过 JDBC 查询时不受支持。建议改用批式源表(如 filesystem、kafka 且消费有限数据)或使用 Flink SQL Client 执行流查询。

第六章:DolphinScheduler安装与配置

1、环境前提

  • ✅ WSL 中已有 Java 8(java -version 显示 1.8)

  • ✅ MySQL 服务已启动(sudo service mysql status)

  • ✅ 网络连接正常

2、下载与解压

复制代码
cd ~/bigdata

# 下载(使用华为云镜像,速度更快)
wget https://mirrors.huaweicloud.com/apache/dolphinscheduler/3.1.9/apache-dolphinscheduler-3.1.9-bin.tar.gz

# 解压
tar -xzvf apache-dolphinscheduler-3.1.9-bin.tar.gz

# 进入解压目录
cd apache-dolphinscheduler-3.1.9-bin

3、创建 MySQL 数据库和用户

复制代码
mysql -u root -p

在 MySQL 中执行:

复制代码
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'dolphin'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphin'@'%';
FLUSH PRIVILEGES;
EXIT;

如果用户已存在,可以先 DROP USER 'dolphin'@'%'; 再创建。

4、配置数据库连接(通过 环境变量 ,无需编辑复杂的 YAML )

(1)修改 bin/env/dolphinscheduler_env.sh ,在apache-dolphinscheduler-3.1.9-bin目录下进入。

复制代码
nano bin/env/dolphinscheduler_env.sh

在文件末尾添加以下内容(注意,不要修改已有的其他配置,只追加):

复制代码
export DATABASE=mysql
export SPRING_PROFILES_ACTIVE=mysql
export SPRING_DATASOURCE_URL="jdbc:mysql://localhost:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true"
export SPRING_DATASOURCE_USERNAME=dolphin
export SPRING_DATASOURCE_PASSWORD=123456

保存并退出(Ctrl+O, 回车, Ctrl+X)。

(2)下载并放置 MySQL JDBC 驱动

我之前的驱动下载到**~/bigdata/apache-hive-3.1.3-bin** 中,不在**~/bigdata/**目录下,需要根据自己安装时的位置来处理。

复制代码
# 复制驱动到 tools/libs(用于初始化数据库)
cp ~/bigdata/mysql-connector-java-8.0.16.jar tools/libs/

# 复制驱动到 standalone-server/libs/standalone-server(用于运行服务)
cd ~/bigdata/apache-dolphinscheduler-3.1.9-bin/standalone-server/libs/standalone-server
cp ~/bigdata/mysql-connector-java-8.0.16.jar .

4、初始化数据库表结构

复制代码
cd ~/bigdata/apache-dolphinscheduler-3.1.9-bin
bash tools/bin/upgrade-schema.sh

输出如下内容:

等待执行完成,看到类似 schema upgrade success 或没有 ERROR 即为成功。如果报错连接 PostgreSQL,说明环境变量未生效,请检查上一步是否正确设置并执行 source 命令(可选,但可执行:source bin/env/dolphinscheduler_env.sh 后再运行升级脚本)。

6、启动 Standalone Server

复制代码
bash bin/dolphinscheduler-daemon.sh start standalone-server

查看启动日志(等待约 30 秒):

复制代码
tail -f standalone-server/logs/dolphinscheduler-standalone.log

当看到 Started StandaloneServer in ... seconds 且日志中无 ERROR 时,表示启动成功。

7、访问 Web UI

默认端口为 12345。但是由于spark已经使用打开 Windows 浏览器访问:

复制代码
http://localhost:12345/dolphinscheduler/ui

如果无法访问,尝试使用 WSL 的 IP 地址(例如 http://172.25.234.166:12345/dolphinscheduler/ui)。

默认账号:

  • 用户名:admin

  • 密码:dolphinscheduler123

8、初次登录后的必要配置

(1)创建租户(必须!否则任务无法执行)

登录后,点击右上角用户名 → 安全中心 → 租户管理 → 创建租户。

  • 租户编码 :输入您的 WSL 用户名(例如 tianpeng,可通过 whoami 命令查看)

  • 租户名称:可同编码

  • 队列 :默认 default

  • 点击 提交

租户是 DolphinScheduler 执行任务时使用的 Linux 用户,必须与 WSL 用户名一致,否则任务会因权限不足失败。

(2)创建环境(可选但推荐,便于后续运行大数据任务)

安全中心 → 环境管理 → 创建环境:

  • 环境名称 :例如 bigdata-env

  • 环境配置:根据您的组件路径填写,例如:

    复制代码
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    export HADOOP_HOME=/home/tianpeng/bigdata/hadoop-3.3.6
    export HIVE_HOME=/home/tianpeng/bigdata/apache-hive-3.1.3-bin
    export SPARK_HOME=/home/tianpeng/bigdata/spark-3.4.3-bin-hadoop3
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$SPARK_HOME/bin
  • 点击 提交

9、停止服务

复制代码
cd ~/bigdata/apache-dolphinscheduler-3.1.9-bin
bash bin/dolphinscheduler-daemon.sh stop standalone-server

常见问题与排错

问题 原因与解决方法
upgrade-schema.sh 尝试连接 PostgreSQL 环境变量未生效。请确保 bin/env/dolphinscheduler_env.sh 中正确设置了 DATABASE=mysql 和 SPRING_PROFILES_ACTIVE=mysql。可以执行 source bin/env/dolphinscheduler_env.sh 后再运行升级脚本。
启动后没有监听 8080 端口 检查 standalone-server/logs/dolphinscheduler-standalone.log 中的错误。常见原因为 8080 端口被占用,可修改端口(见下方)。
访问 Web UI 时页面空白或 404 使用正确的路径 /dolphinscheduler/ui,不要只访问根路径。或尝试清除浏览器缓存。
租户创建后任务执行失败 确认租户编码与 WSL 用户名完全一致,并且该用户有执行命令的权限(如 hive、spark-submit 等)。
需要修改 Web 端口 在 standalone-server/conf/application.yaml 中创建(如不存在)并添加:server: port: 12345 然后重启。

验证安装成功:

(1)Web UI 能正常登录。

(2)创建一个测试工作流(例如 Shell 任务,输出 echo "Hello DolphinScheduler"),运行后查看日志输出正常。

至此,您已经成功安装了 DolphinScheduler 并完成了必要配置。可以开始使用它调度您的大数据任务了。

第七章:DataX安装

1、安装与配置 DataX

DataX 安装的核心就是"下载解压,开箱即用",非常方便,无需复杂编译。

(1)环境准备

  • Java: DataX 依赖 Java 8 运行,请确认 Java 环境已就绪。

  • Python : DataX 的启动脚本 datax.py 依赖于 Python 2.6+ 环境。如果你的默认 Python 是 Python 3,需确保 python 命令能指向 Python 2.x。

    Python3 的安装和配置

    sudo apt update
    sudo apt install python3 python3-pip -y

    确认python是否安装成功

    python3 --version

    查询安装路径

    which python3

注意:先检查Python是否安装,未安装的需要先安装Python3

(2)下载与解压DataX

在终端执行以下命令:

复制代码
cd ~/bigdata
wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz
tar -zxvf datax.tar.gz

解压完成后,得到一个 datax 目录,DataX 即安装完毕。

(3)验证安装

运行官方自带的测试任务,验证 DataX 是否可以正常工作。

复制代码
cd ~/bigdata/datax
python3 bin/datax.py job/job.json

如果看到任务成功结束的统计信息,说明 DataX 安装成功,如下图

(4)核心概念:DataX 任务配置文件 ( JSON )

DataX 通过 JSON 配置文件定义数据同步任务,文件结构如下:

复制代码
{
    "job": {
        "setting": { ... },    # 全局配置,如并发通道数(channel)
        "content": [           # 任务内容,可定义多个同步任务
            {
                "reader": {    # 读取端配置,指定数据源
                    "name": "mysqlreader", 
                    "parameter": { ... }
                },
                "writer": {    # 写入端配置,指定目标数据源
                    "name": "hdfswriter", 
                    "parameter": { ... }
                }
            }
        ]
    }
}

2、部署 DataX-Web (可视化界面)

DataX-Web 为 DataX 提供了一个 Web 操作界面,让创建、管理和监控同步任务变得更直观。

(1)环境准备

  • Java : DataX-Web 需要 Java 8。

  • MySQL : DataX-Web 的元数据需要依赖 MySQL 5.7+ 数据库。

  • Maven : DataX-Web 需要从源码编译构建,所以你需要提前在 WSL 中安装好 Maven 。可以在终端输入 mvn -version 检查 Maven 是否已安装。

注意:上面的需要安装好以后才继续往下安装,如果没有安装的问AI。

(2) 源码 获取与编译

DataX-Web 没有直接提供安装包,需要我们克隆其源码并使用 Maven 构建。

复制代码
cd ~/bigdata
git clone https://gitcode.com/gh_mirrors/da/datax-web
cd datax-web
mvn clean package -Dmaven.test.skip=true

从源码安装需要先打包。由于DataX-Web 是一个 Maven 多模块项目,所以 build 目录需要通过 mvn clean install 命令来生成

复制代码
# 执行Maven打包命令(会自动进行清理和安装步骤)
mvn clean install

编译成功后,会在 datax-web/build/ 目录下生成一个名为 datax-web-<version>.tar.gz 的安装包

(3)解压与一键安装

将生成的安装包解压,并使用其自带的一键安装脚本进行部署。

复制代码
# 进入 DataX-Web 源码编译后生成的构建输出目录
cd ~/bigdata/datax-web/build

# 解压生成的 DataX-Web 安装包(版本为 2.1.2)到 ~/bigdata 目录下
tar -zxvf datax-web-2.1.2.tar.gz -C ~/bigdata

(4)数据库配置与初始化

方法一:使用一键安装脚本进行交互式初始化(推荐)

如果你的 MySQL 和 DataX-Web 在同一台 WSL 环境中,这个方法最简单:

进入安装目录并执行脚本:

复制代码
cd /home/tianpeng/bigdata/datax-web-2.1.2
./bin/install.sh --force

回答脚本的交互式问题:

  1. 脚本执行后,会根据系统环境依次询问信息:

    • 是否初始化数据库 :当出现 Do you want to initialize database with sql: .../bin/db/datax-web.sql? (Y/N) 时,输入 Y。

    • 数据库 IP 地址 db host:直接按 回车 ,或输入 127.0.0.1。

    • 数据库 端口 db port:直接按 回车 ,使用默认的 3306。

    • 数据库用户名 db username:输入你之前创建的 MySQL 用户名,比如 dolphin 或 root。

    • 数据库密码 db password:输入该数据库用户的密码。

    • 数据库名称 db name:输入之前为 DataX-Web 创建的数据库名称,例如 datax_web。

成功的话,你会看到一条初始化成功的提示。

方法二:手动执行 SQL 脚本(通用)

如果自动脚本没有执行数据库初始化,或你需要手动操作,可以按以下步骤进行。

找到 SQL 脚本文件 :SQL脚本通常位于安装目录下的 bin/db/datax-web.sql。

登录 MySQL:

mysql -u root -p

执行 SQL 文件来初始化数据库:

USE datax_web; SOURCE /home/tianpeng/bigdata/datax-web-2.1.2/bin/db/datax-web.sql;

这个步骤会为你创建 DataX-Web 所需的所有表结构。

➡️ 修改配置文件

数据库初始化完成后,我们需要修改几个关键文件,告诉 DataX-Web 如何连接数据库,以及 DataX 在哪里。

设置 DataX 执行引擎的路径 :编辑 modules/datax-executor/bin/env.properties 文件,指定 Python 和 DataX 的路径。

复制代码
cd /home/tianpeng/bigdata/datax-web-2.1.2
nano modules/datax-executor/bin/env.properties

找到 PYTHON_PATH 这一行,将其修改为:

复制代码
PYTHON_PATH=/usr/bin/python3

保存并退出。

修改 datax-admin 数据库连接配置:

复制代码
cd /home/tianpeng/bigdata/datax-web-2.1.2
nano modules/datax-admin/conf/bootstrap.properties

找到并确认数据库连接信息与你创建的数据库信息一致:

复制代码
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=123456
DB_DATABASE=dataxweb

保存并退出。

▶️ 启动与停止服务

启动所有服务

进入启动脚本目录,一键启动所有服务:

复制代码
cd /home/tianpeng/bigdata/datax-web-2.1.2/bin && ./start-all.sh

启动成功后,你可以通过 jps 命令查看是否有 DataXAdminApplication 和 DataXExecutorApplication 这两个进程,以此确认服务是否正常运行。

访问 Web 界面:

  1. 服务启动后,在浏览器中访问 http://localhost:9527/index.html,登录 DataX-Web。

登录:

  • 用户名 : admin

  • 密码 : 123456

进行简单的连接测试:

  1. 登录后,建议立即前往 "执行器管理" 页面,你应该能看到一个自动注册的名为 datax-executor 的执行器,且其状态应为"在线"。如果状态不是"在线",请检查日志排查原因。

3、在 DataX-Web 中创建你的第一个任务

成功登录后,我们可以通过 Web 界面来创建一个任务,整个过程将取代手动编写 JSON 文件。

(1)配置执行器

  • 登录后,进入 执行器管理 页面。

  • 点击"新增执行器",AppName 填写 datax-executor,名称填写 default,注册方式选择"自动注册",然后保存。等待片刻,执行器状态会变为"在线"。

(2)配置 数据源

  • 进入 数据源 管理 页面,点击"新建数据源"。

  • 选择要连接的数据源类型,例如 MySQL,填写连接信息、用户名和密码。

  • 同理,创建另一个目标数据源,如 HDFS 或 Hive。

(3) 创建项目

(4)创建模板

(5)创建与配置任务

  • 进入 任务管理 页面,点击"新建任务"。

  • 选择任务类型为 DataX,然后选择你刚才创建的 Reader 和 Writer 数据源。

  • 在字段映射环节,页面会自动生成 Reader 和 Writer 之间的字段映射关系,你可以根据需要调整。

  • 确认无误后,保存任务。

(4)运行与监控任务

  • 在任务列表中,点击"运行"按钮即可手动触发一次同步任务。

  • 你可以在任务列表中查看任务的执行日志 和历史记录,获取详细的执行结果。

  • 如果需要定时同步,可以在"任务管理"中配置任务的调度策略,DataX-Web 集成了 XXL-JOB,支持 Cron 表达式来设置定时任务。

(5)停止所有服务

在 bin 目录下执行:

复制代码
cd /home/tianpeng/bigdata/datax-web-2.1.2/bin && ./stop-all.sh

至此,你已经完成了 DataX 和 DataX-Web 的完整安装,并成功通过 Web 界面创建并运行了一个数据同步任务。

第八章:Kafka安装

1. 检查 Java 版本

在终端中执行:

复制代码
java -version   # 或 java -version

根据输出结果,选择合适的 Kafka 版本:

Java 版本 推荐 Kafka 版本 模式 说明
Java 8 或 11 Kafka 3.5.x(3.x 系列) ZooKeeper 模式 稳定可靠,支持 Java 8+
Java 11+ Kafka 3.5.x 或 4.0.x KRaft 模式(3.x 实验性,4.x 稳定) 推荐后者,需 Java 17+
Java 17+ Kafka 4.0.x KRaft 模式 最新,去掉 ZooKeeper

根据你之前安装 Hadoop、Spark 等组件时使用的大概率是 Java 8(因为 Hive 3.1.3 需要 Java 8),所以下面以 Java 8 + Kafka 3.5.x(ZooKeeper 模式)为例给出安装步骤。如果你的 Java 版本更高,可以在后续步骤中切换到 KRaft 模式。

安装 Kafka 3.5.x( ZooKeeper 模式,兼容 Java 8/11)

第一步:下载与解压

复制代码
cd ~/bigdata
wget https://mirrors.huaweicloud.com/apache/kafka/3.9.0/kafka_2.12-3.9.0.tgz
tar -xzf kafka_2.12-3.9.0.tgz
cd kafka_2.12-3.9.0

第二步:启动 ZooKeeper 和 Kafka

ZooKeeper 是 Kafka 3.x 的元数据管理依赖,需要先启动。

复制代码
# 启动 ZooKeeper(后台运行)
./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

# 等待 3 秒,确保 ZooKeeper 启动
sleep 3

# 启动 Kafka Broker(后台运行)
./bin/kafka-server-start.sh -daemon config/server.properties

第三步:验证服务是否启动

复制代码
# 查看进程
jps

应该能看到 QuorumPeerMain(ZooKeeper)和 Kafka 两个进程。

第四步:创建主题并测试

复制代码
# 创建测试主题
bigdata/kafka_2.12-3.9.0/bin/kafka-topics.sh --create --topic test-topic \
    --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

# 启动生产者(键盘输入消息)
bigdata/kafka_2.12-3.9.0/bin/kafka-console-producer.sh --topic test-topic \
    --bootstrap-server localhost:9092

# 另开一个终端,启动消费者(会显示生产者输入的消息)
bigdata/kafka_2.12-3.9.0/bin/kafka-console-consumer.sh --topic test-topic \
    --bootstrap-server localhost:9092 --from-beginning

生产者中输入数据时,消费者既能接收到数据。

第五步:停止服务(可选)

复制代码
# 停止 Kafka
./bin/kafka-server-stop.sh

# 停止 ZooKeeper
./bin/zookeeper-server-stop.sh

备选:KRaft 模式(若 Java 版本 ≥ 17)

如果你检查 Java 版本是 17 或更高,可以使用 Kafka 4.0 的 KRaft 模式(无需 ZooKeeper)。安装步骤如下:

复制代码
cd ~/bigdata
wget https://downloads.apache.org/kafka/4.0.0/kafka_2.13-4.0.0.tgz
tar -xzf kafka_2.13-4.0.0.tgz
cd kafka_2.13-4.0.0

# 生成集群 UUID
UUID=$(./bin/kafka-storage.sh random-uuid)
echo $UUID

# 格式化日志目录
./bin/kafka-storage.sh format -t $UUID -c config/kraft/server.properties

# 启动 Kafka(不带 ZooKeeper)
./bin/kafka-server-start.sh config/kraft/server.properties

验证方式相同。

总结:

  • 先 java --version 确认版本。

  • 若 Java 8/11 → 安装 Kafka 3.5.x(ZooKeeper 模式)。

  • 若 Java 17+ → 安装 Kafka 4.0.x(KRaft 模式)。

请执行 java --version 并告诉我输出,我可以为你精确调整安装命令。如果已经明确,直接按上述对应方案安装即可。

第九章:FlinkCDC安装

要搭建 Flink CDC,需要先部署好 Apache Flink 环境,再把 CDC 组件接进去,它本身不是一个独立运行的程序。下面我会以一个清晰、通用的流程来介绍。

为了方便你快速安装,我把整个过程梳理成下面这张流程图:

复制代码
---
config:
  theme: forest
---
flowchart TD
    A[准备工作\n(JDK 11, Flink)] --> B[部署 Flink Standalone 集群]
    B --> C[下载并解压\nFlink CDC 发行包]
    C --> D[配置 Flink CDC 环境]
    D --> E{选择作业提交方式}
    E -- "DataStream API\n(Java/Scala 代码)" --> F[在 Flink 应用代码中\n添加 Maven 依赖]
    E -- "YAML Pipeline\n(推荐,Flink CDC 3.x)" --> G[编写 YAML 配置文件]
    F --> H[打包并提交 Flink 作业]
    G --> H
    H --> I[在 Flink Web UI \n监控作业运行状态]

下面我们来逐一拆解这张流程图里的关键步骤。

1. 准备工作

在开始前,请确保你的环境满足以下要求:

  • JDK :要求 JDK 11 或更高版本。

  • 操作系统:WSL(Ubuntu)完全可以,任何类 Unix 环境都适用。

2. 部署 Flink

Flink CDC 是运行在 Flink 之上的。在你刚刚配置好的 Flink 环境目录下,按顺序执行以下命令:

复制代码
# 进入 Flink 安装目录
cd ~/bigdata/flink-1.18.1

# 启动集群
./bin/start-cluster.sh

# 启动集群后,可以通过以下命令快速查看进程状态
ps aux | grep flink

你也可以访问 http://localhost:8081 查看 Flink Web UI,确认集群已正常运行。

3. 下载与安装 Flink CDC

Flink CDC 提供了一个独立的发行包,里面包含了运行所需的脚本和核心依赖。

复制代码
# 进入你的软件目录
cd ~/bigdata

# 下载 Flink CDC 安装包(示例版本为 3.5.0,建议访问 Apache 官网获取最新版本号)
wget https://dlcdn.apache.org/flink/flink-cdc-3.5.0/flink-cdc-3.5.0-bin.tar.gz

# 下载 jdk 11
# sudo apt install -y openjdk-11-jdk

# 解压
tar -zxvf flink-cdc-3.5.0-bin.tar.gz

4. ⚙️ 配置环境并放置连接器 JAR 包

你可能需要根据你的数据源和目标端,下载相应的连接器 JAR 包,并放到 Flink CDC 发行包的 lib/ 目录下。

复制代码
# 假设你的数据源是 MySQL
cd ~/bigdata/flink-cdc-3.5.0

# 下载 MySQL CDC Connector JAR(以 3.5.0 版本为例)
wget -P lib/ https://repo1.maven.org/maven2/org/apache/flink/flink-cdc-pipeline-connector-mysql/3.5.0/flink-cdc-pipeline-connector-mysql-3.5.0.jar

5. ✍️ 开发与提交数据同步作业

方式一(推荐):使用 YAML 文件提交

Flink CDC 的主流方式是编写一个简洁的 YAML 配置文件,然后通过 flink-cdc.sh 脚本提交。

1. 编写 YAML 配置文件

创建一个 mysql-to-kafka.yaml 文件,用于定义从 MySQL 到 Kafka 的数据同步任务:

复制代码
nano mysql-to-kafka.yaml

# mysql-to-kafka.yaml
source:
  type: mysql
  hostname: 172.25.234.166
  port: 3306
  username: root
  password: 123456
  tables: app_db.\.*          # 同步 app_db 库下的所有表
  server-id: 5400-5404        # 建议为 MySQL 同步任务配置一个唯一的 server-id 范围,避免与其它同步任务产生冲突

sink:
  type: kafka
  brokers: localhost:9092
  topic: mysql_${table_name}   # 将每张表的数据动态写入名为 "mysql_表名" 的 Kafka Topic 中

pipeline:
  name: mysql_to_kafka_pipeline
  parallelism: 2

2. 提交作业

复制代码
cd ~/bigdata/flink-cdc-3.5.0
./bin/flink-cdc.sh mysql-to-kafka.yaml

方式二:通过编程方式(DataStream API )

这种方式更适合需要复杂数据处理的场景。你需要在 Java/Scala 项目中引入 Flink CDC 的 Maven 依赖,来编写代码。

MySQL 用户须知

如果数据源是 MySQL,需要创建一个有特定权限的用户,并开启 Binlog。相关的 SQL 如下:

CREATE USER 'flinkcdc'@'%' IDENTIFIED BY 'your_password'; GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flinkcdc'@'%'; flush privileges;

同时,MySQL 的 Binlog 格式必须是 ROW。server-id 这个参数也很重要,如果同一个 MySQL 实例上有多个同步任务,每个任务都需要配置不同且全局唯一的 server-id 范围,以避免冲突。

🧪 步骤 6:验证同步结果

同步任务提交后,数据就会从 MySQL 实时流向 Kafka。要验证同步是否成功,可以检查 Flink Web UI(http://localhost:8081)上作业的运行状态。如果数据已成功写入,你应该能看到作业的 Records Sent 计数在增加。同时,也可以在 Kafka 中消费对应的 Topic(例如 mysql_表名)来确认消息。

🧹 环境清理(可选)

测试完成后,可以用下面的命令清理环境。

复制代码
# 停止 Flink 集群
cd ~/bigdata/flink-1.18.1
./bin/stop-cluster.sh

# (可选)删除 Flink CDC 安装目录
cd ~/bigdata
rm -rf flink-cdc-3.5.0

# (可选)删除 MySQL 测试用户
# mysql -u root -p -e "DROP USER IF EXISTS 'flinkcdc'@'%';"

💎 总结

整个 Flink CDC 的安装和基本使用,关键就这么几点:

  1. 核心架构:Flink CDC 必须运行在 Flink 集群之上,不是独立程序。

  2. 主流用法 :官方推荐使用 YAML 文件 + flink-cdc.sh 脚本来提交任务,非常直观。

  3. 关键前置准备:取决于你的数据源,需要提前做好配置,例如在 MySQL 中开启 Binlog 并创建合适的用户。

  4. 版本兼容:务必留意 Flink 和 Flink CDC 的版本对应关系,生产环境建议选用官方推荐的稳定版本。

为了能帮你出更合适的建议,方便告诉我你计划同步什么数据(比如从MySQL到Kafka,还是到HDFS)吗?我可以针对你的场景,给出一份具体的YAML配置示例。

第十章:Iceberg安装

一、在 WSL 中安装 Apache Iceberg 的详细步骤(与 Spark 集成)

1. 环境准备

确保已安装:

  • Java 11(推荐)或 17:sudo apt install openjdk-11-jdk

  • Spark 3.4+:下载解压到 ~/bigdata/spark-3.4.3-bin-hadoop3

  • 配置 $SPARK_HOME 环境变量:echo 'export SPARK_HOME=~/bigdata/spark-3.4.3-bin-hadoop3' >> ~/.bashrc && source ~/.bashrc

2. 下载 Iceberg Spark Runtime JAR

复制代码
cd $SPARK_HOME/jars

wget https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-spark-runtime-3.4_2.12/1.5.0/iceberg-spark-runtime-3.4_2.12-1.5.0.jar

版本号可根据需要调整:iceberg-spark-runtime-3.4_2.12 对应 Spark 3.4 + Scala 2.12。

3. 配置 Spark 的 spark-defaults.conf

创建或编辑配置文件:

复制代码
nano $SPARK_HOME/conf/spark-defaults.conf

添加以下内容(使用 HadoopCatalog,元数据存储在本地文件系统):

复制代码
spark.sql.extensions                   org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.iceberg_catalog      org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.iceberg_catalog.type hadoop
spark.sql.catalog.iceberg_catalog.warehouse file:///home/tianpeng/iceberg_warehouse

保存:Ctrl+O,回车;退出:Ctrl+X。

4. 创建 Iceberg 数据仓库 目录

复制代码
mkdir -p ~/iceberg_warehouse

5. 启动 Spark Shell 验证

复制代码
$SPARK_HOME/bin/spark-shell

在 Scala 中执行:

复制代码
spark.sql("CREATE TABLE iceberg_catalog.default.iceberg_test (id INT, name STRING) USING iceberg")
spark.sql("INSERT INTO iceberg_catalog.default.iceberg_test VALUES (1, 'Alice'), (2, 'Bob')")
spark.sql("SELECT * FROM iceberg_catalog.default.iceberg_test").show()

成功则显示数据。

二、使用 DBeaver 连接 Iceberg 的详细步骤(通过 Spark Thrift Server )

1. 配置 Spark Thrift Server 支持 Iceberg

编辑 Spark 配置文件,确保已包含 Iceberg 扩展(若未配置则添加):

复制代码
nano $SPARK_HOME/conf/spark-defaults.conf

确认存在以下配置(若已有则跳过):

复制代码
spark.sql.extensions                   org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.iceberg_catalog      org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.iceberg_catalog.type hadoop
spark.sql.catalog.iceberg_catalog.warehouse file:///home/tianpeng/iceberg_warehouse

2. 启动 Spark Thrift Server (使用 端口 10004)

复制代码
cd $SPARK_HOME
./sbin/start-thriftserver.sh \
  --master local[*] \
  --hiveconf hive.server2.thrift.port=10004 \
  --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
  --conf spark.sql.catalog.iceberg_catalog=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.iceberg_catalog.type=hadoop \
  --conf spark.sql.catalog.iceberg_catalog.warehouse=file:///home/tianpeng/iceberg_warehouse

检查进程:

复制代码
jps | grep HiveThriftServer2
netstat -tlnp | grep 10004

3. 在 DBeaver 中配置 Spark 驱动

  • 打开 DBeaver → 菜单栏"数据库" → "驱动管理器" → "新建"

  • 驱动名称:Spark Iceberg

  • 类名:org.apache.hive.jdbc.HiveDriver

  • URL 模板:jdbc:hive2://{host}:{port}/{database}

  • 默认端口:10004

  • 点击"库" → "添加文件" → 选择 $SPARK_HOME/jars/hive-jdbc-*.jar 和 $SPARK_HOME/jars/hive-service-*.jar(或下载 Hive JDBC 驱动包:https://repo1.maven.org/maven2/org/apache/hive/hive-jdbc/4.0.1/hive-jdbc-4.0.1-standalone.jar)

  • 点击"找到类" → 选择 org.apache.hive.jdbc.HiveDriver

  • 确定保存。

4. 创建 DBeaver 连接

  • 点击"新建数据库连接" → 选择 Spark Iceberg 驱动

  • 主机:localhost

  • 端口:10004

  • 数据库:default

  • 用户名:tianpeng(随意)

  • 点击"测试连接" → 应提示"已连接"

5. 查询 Iceberg 表

在 SQL 编辑器中执行:

复制代码
USE iceberg_catalog.default;
SHOW TABLES;
SELECT * FROM iceberg_test;

以上命令均包含具体的文件打开(nano)和修改内容,可直接复制执行。如需使用 HiveCatalog 或其他存储,可替换对应的配置项。

第十一章:大数据组件完整卸载脚本

将以下内容完整复制,保存为 uninstall_all.sh,放在用户主目录(~)下,执行 bash uninstall_all.sh 即可一键删除所有组件、安装包、数据库、环境变量。

复制代码
#!/bin/bash

# ============================================================
# 大数据组件完整卸载脚本
# 适用于:WSL Ubuntu 环境
# 作者:根据《第02讲:大数据环境安装》文档定制
# 用法:bash uninstall_all.sh
# 注意:此脚本会删除 ~/bigdata 下所有内容及相关数据库!
# ============================================================

set -e

USER_NAME=$(whoami)
USER_HOME="/home/${USER_NAME}"
BIGDATA_DIR="${USER_HOME}/bigdata"

echo "========================================="
echo "  大数据组件完整卸载脚本"
echo "  用户:${USER_NAME}"
echo "  目标目录:${BIGDATA_DIR}"
echo "  开始时间:$(date)"
echo "========================================="
echo ""
echo "警告:此脚本将删除所有大数据组件、安装包、数据库和环境变量!"
read -p "确认继续?(输入 YES 继续): " confirm
if [ "$confirm" != "YES" ]; then
    echo "已取消"
    exit 0
fi

# ============================================================
# 第一步:停止所有运行中的服务
# ============================================================
echo ""
echo "========================================="
echo "[1/8] 停止所有运行中的服务..."
echo "========================================="

# 停止 Crabc
if pgrep -f "crabc-admin" > /dev/null 2>&1; then
    echo "  - 停止 Crabc..."
    ps -ef | grep crabc-admin | grep -v grep | awk '{print $2}' | xargs kill 2>/dev/null || true
    echo "    ✓ 已停止"
else
    echo "  - Crabc 未运行"
fi

# 停止 DolphinScheduler
if [ -d "${BIGDATA_DIR}/apache-dolphinscheduler-3.1.9-bin" ]; then
    echo "  - 停止 DolphinScheduler..."
    cd ${BIGDATA_DIR}/apache-dolphinscheduler-3.1.9-bin 2>/dev/null && bash bin/dolphinscheduler-daemon.sh stop standalone-server 2>/dev/null || true
    echo "    ✓ 已停止"
else
    echo "  - DolphinScheduler 未安装"
fi

# 停止 DataX-Web
if [ -f "${BIGDATA_DIR}/datax-web-2.1.2/bin/stop-all.sh" ]; then
    echo "  - 停止 DataX-Web..."
    cd ${BIGDATA_DIR}/datax-web-2.1.2/bin 2>/dev/null && bash stop-all.sh 2>/dev/null || true
    echo "    ✓ 已停止"
else
    echo "  - DataX-Web 未安装"
fi

# 停止 Flink
if [ -d "${BIGDATA_DIR}/flink-1.18.1" ]; then
    echo "  - 停止 Flink..."
    cd ${BIGDATA_DIR}/flink-1.18.1 2>/dev/null && ./bin/stop-cluster.sh 2>/dev/null || true
    echo "    ✓ 已停止"
else
    echo "  - Flink 未安装"
fi

# 停止 Spark
if [ -d "${BIGDATA_DIR}/spark-3.4.3-bin-hadoop3" ]; then
    echo "  - 停止 Spark..."
    cd ${BIGDATA_DIR}/spark-3.4.3-bin-hadoop3 2>/dev/null
    sbin/stop-worker.sh 2>/dev/null || true
    sbin/stop-master.sh 2>/dev/null || true
    echo "    ✓ 已停止"
else
    echo "  - Spark 未安装"
fi

# 停止 HiveServer2 和 MetaStore
if pgrep -f "HiveServer2" > /dev/null 2>&1; then
    echo "  - 停止 HiveServer2..."
    kill $(pgrep -f "HiveServer2") 2>/dev/null || true
    echo "    ✓ 已停止"
fi
if pgrep -f "HiveMetaStore" > /dev/null 2>&1; then
    echo "  - 停止 HiveMetaStore..."
    kill $(pgrep -f "HiveMetaStore") 2>/dev/null || true
    echo "    ✓ 已停止"
fi
if ! pgrep -f "HiveServer2" > /dev/null 2>&1 && ! pgrep -f "HiveMetaStore" > /dev/null 2>&1; then
    echo "  - Hive 服务未运行"
fi

# 停止 Hadoop
if [ -d "${BIGDATA_DIR}/hadoop-3.3.6" ]; then
    echo "  - 停止 Hadoop..."
    export HADOOP_HOME=${BIGDATA_DIR}/hadoop-3.3.6
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
    ${HADOOP_HOME}/sbin/stop-yarn.sh 2>/dev/null || true
    ${HADOOP_HOME}/sbin/stop-dfs.sh 2>/dev/null || true
    echo "    ✓ 已停止"
else
    echo "  - Hadoop 未安装"
fi

# 停止 Kafka
if [ -d "${BIGDATA_DIR}/kafka_2.12-3.9.0" ]; then
    echo "  - 停止 Kafka..."
    cd ${BIGDATA_DIR}/kafka_2.12-3.9.0 2>/dev/null
    bin/kafka-server-stop.sh 2>/dev/null || true
    bin/zookeeper-server-stop.sh 2>/dev/null || true
    echo "    ✓ 已停止"
else
    echo "  - Kafka 未安装"
fi

# 确保 MySQL 运行以删除数据库
echo "  - 启动 MySQL(用于删除数据库)..."
sudo service mysql start 2>/dev/null || true
sleep 2

echo "  所有服务已停止。"

# ============================================================
# 第二步:删除 MySQL 数据库
# ============================================================
echo ""
echo "========================================="
echo "[2/8] 删除 MySQL 数据库..."
echo "========================================="

DB_LIST=("hive_metastore" "dolphinscheduler" "dataxweb" "crabc")
for db in "${DB_LIST[@]}"; do
    echo "  - 删除数据库 ${db}..."
    sudo mysql -u root -e "DROP DATABASE IF EXISTS ${db};" 2>/dev/null && echo "    ✓ 已删除" || echo "    - 不存在"
done

# 删除 MySQL 用户(可选)
echo "  - 删除专用用户..."
sudo mysql -u root -e "DROP USER IF EXISTS 'dolphin'@'%';" 2>/dev/null || true
sudo mysql -u root -e "DROP USER IF EXISTS 'crabc'@'localhost';" 2>/dev/null || true
sudo mysql -u root -e "DROP USER IF EXISTS 'devuser'@'%';" 2>/dev/null || true
sudo mysql -u root -e "DROP USER IF EXISTS 'flinkcdc'@'%';" 2>/dev/null || true
echo "    ✓ 用户已清理"

# 停止 MySQL
echo "  - 停止 MySQL..."
sudo service mysql stop 2>/dev/null || true

# ============================================================
# 第三步:删除 bigdata 目录(包括所有组件和安装包)
# ============================================================
echo ""
echo "========================================="
echo "[3/8] 删除 bigdata 目录(所有组件 + 安装包)..."
echo "========================================="

if [ -d "${BIGDATA_DIR}" ]; then
    echo "  准备删除以下目录:"
    echo "  ${BIGDATA_DIR}"
    echo "  包含的组件:"
    ls ${BIGDATA_DIR} 2>/dev/null | head -20
    echo ""
    read -p "  确认删除整个 bigdata 目录?(y/N): " confirm_dir
    if [ "$confirm_dir" = "y" ] || [ "$confirm_dir" = "Y" ]; then
        rm -rf ${BIGDATA_DIR}
        echo "    ✓ bigdata 目录已完全删除"
    else
        echo "    - 跳过目录删除"
    fi
else
    echo "  - bigdata 目录不存在"
fi

# ============================================================
# 第四步:清理环境变量
# ============================================================
echo ""
echo "========================================="
echo "[4/8] 清理环境变量..."
echo "========================================="

if [ -f ~/.bashrc ]; then
    # 备份
    BACKUP_FILE=~/.bashrc.bak.$(date +%Y%m%d_%H%M%S)
    cp ~/.bashrc ${BACKUP_FILE}
    echo "  - .bashrc 已备份到 ${BACKUP_FILE}"
    
    # 删除所有大数据组件相关的环境变量
    sed -i '/export JAVA_HOME=\/usr\/lib\/jvm\/java-11-openjdk-amd64/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export JAVA_HOME=\/usr\/lib\/jvm\/java-8-openjdk-amd64/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export JAVA_HOME=\/usr\/lib\/jvm\/java-17-openjdk-amd64/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export HADOOP_HOME=/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export HIVE_HOME=/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export SPARK_HOME=/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export FLINK_HOME=/d' ~/.bashrc 2>/dev/null || true
    
    # 删除包含 bigdata 的 PATH 行
    sed -i '/export PATH=.*bigdata/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export PATH=.*hadoop/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export PATH=.*hive/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export PATH=.*spark/d' ~/.bashrc 2>/dev/null || true
    sed -i '/export PATH=.*flink/d' ~/.bashrc 2>/dev/null || true
    
    echo "    ✓ 环境变量已清理"
fi

# ============================================================
# 第五步:清理 SSH 密钥
# ============================================================
echo ""
echo "========================================="
echo "[5/8] 清理 SSH 密钥..."
echo "========================================="

if [ -f ~/.ssh/id_rsa ]; then
    rm -f ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
    echo "    ✓ SSH 密钥已删除"
else
    echo "  - SSH 密钥不存在"
fi

if [ -f ~/.ssh/authorized_keys ]; then
    > ~/.ssh/authorized_keys
    echo "    ✓ authorized_keys 已清空"
fi

if [ -f ~/.ssh/known_hosts ]; then
    > ~/.ssh/known_hosts
    echo "    ✓ known_hosts 已清空"
fi

# ============================================================
# 第六步:清理临时文件
# ============================================================
echo ""
echo "========================================="
echo "[6/8] 清理临时文件..."
echo "========================================="

# Hadoop 临时文件
rm -rf /tmp/hadoop-${USER_NAME} 2>/dev/null || true
rm -rf /tmp/hadoop-* 2>/dev/null || true
echo "  ✓ Hadoop 临时文件"

# Flink 临时文件
rm -rf /tmp/flink-* 2>/dev/null || true
echo "  ✓ Flink 临时文件"

# Spark 临时文件
rm -rf /tmp/spark-* 2>/dev/null || true
echo "  ✓ Spark 临时文件"

# nohup 输出
rm -f ~/nohup.out 2>/dev/null || true
echo "  ✓ nohup 输出"

# MySQL JDBC 驱动残留
find /tmp -name "mysql-connector-java-*.jar" -delete 2>/dev/null || true
echo "  ✓ JDBC 驱动残留"

# ============================================================
# 第七步:清理 Maven 本地仓库(询问用户)
# ============================================================
echo ""
echo "========================================="
echo "[7/8] 清理 Maven 本地仓库..."
echo "========================================="

if [ -d ~/.m2/repository ]; then
    read -p "  是否清理 Maven 本地仓库 (~/.m2/repository)?所有缓存的依赖将被删除。(y/N): " clean_maven
    if [ "$clean_maven" = "y" ] || [ "$clean_maven" = "Y" ]; then
        rm -rf ~/.m2/repository
        echo "    ✓ Maven 本地仓库已清理"
    else
        echo "    - 跳过 Maven 清理"
    fi
else
    echo "  - Maven 本地仓库不存在"
fi

# ============================================================
# 第八步:验证清理结果
# ============================================================
echo ""
echo "========================================="
echo "[8/8] 验证清理结果..."
echo "========================================="

# 检查进程
echo "  检查残留 Java 进程..."
JPS_COUNT=$(jps 2>/dev/null | grep -v Jps | wc -l)
if [ "$JPS_COUNT" -gt 0 ]; then
    echo "  ⚠ 警告:仍有 Java 进程残留:"
    jps 2>/dev/null | grep -v Jps
    echo "  - 可手动执行 kill 命令清理"
else
    echo "  ✓ 无残留 Java 进程"
fi

# 检查 bigdata 目录
if [ -d "${BIGDATA_DIR}" ]; then
    REMAIN=$(ls ${BIGDATA_DIR} 2>/dev/null)
    if [ -z "$REMAIN" ]; then
        echo "  ✓ bigdata 目录已清空"
    else
        echo "  - bigdata 目录仍有残留内容:"
        echo "$REMAIN"
    fi
else
    echo "  ✓ bigdata 目录已不存在"
fi

# ============================================================
# 完成
# ============================================================
echo ""
echo "========================================="
echo "  卸载完成!"
echo "  结束时间:$(date)"
echo "========================================="
echo ""
echo "后续步骤:"
echo "  1. 执行 source ~/.bashrc 刷新环境变量"
echo "  2. 如需彻底重置 WSL 环境,在 Windows PowerShell 中执行:"
echo "     wsl --shutdown"
echo "  3. 重新打开 Ubuntu 终端即可"
echo ""
echo "如果卸载过程中有任何问题,可联系系统管理员。"
echo "========================================="

使用方法

复制全部内容,在 WSL 终端中执行:

复制代码
nano ~/uninstall_all.sh

粘贴内容后,按 Ctrl+O 回车保存,Ctrl+X 退出。

赋予执行权限:

复制代码
chmod +x ~/uninstall_all.sh

执行脚本:

复制代码
bash ~/uninstall_all.sh

完成后:

复制代码
source ~/.bashrc

此脚本会删除的内容

类别 具体内容
所有组件目录 Hadoop, Hive, Spark, Flink, Kafka, DataX, DataX-Web, DolphinScheduler, FlinkCDC, Crabc
所有安装包 *.tar.gz, *.tgz 压缩包
源码 目录 crabc, datax-web 等 git clone 的源码
MySQL 数据库 hive_metastore, dolphinscheduler, dataxweb, crabc
MySQL 用户 dolphin, crabc, devuser, flinkcdc
环境变量 JAVA_HOME, HADOOP_HOME, HIVE_HOME, SPARK_HOME, FLINK_HOME 及所有 PATH 引用
SSH 密钥 id_rsa, id_rsa.pub, authorized_keys, known_hosts
临时文件 /tmp/hadoop-*, /tmp/flink-*, /tmp/spark-*, 残留 JDBC 驱动
Maven 仓库(可选) ~/.m2/repository
相关推荐
微三云马玮均—GEO源码系统 私有化部署4 小时前
消费返物业费:消费+服务趋势的必然产物!
大数据·人工智能·物联网·区块链·生活
by209996 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
workflower6 小时前
AI system product quality model
大数据·人工智能·机器学习·云计算·无人机
yl45306 小时前
硫酸泄露处理生产商怎么选才够专业
大数据·人工智能·python
xianghongtao01166 小时前
麦肯锡2026技术趋势02_智能体AI_研究解读
大数据·人工智能
笑鸿的学习笔记7 小时前
C++笔记之大块顺序写
java·c++·笔记
数字化顾问7 小时前
(138页PPT)四大咨询矿业集团流程梳理与优化报告(附下载方式)
大数据·人工智能
yukai080088 小时前
【203篇系列】056 我的Agent系统
大数据·elasticsearch·搜索引擎
山岚的运维笔记8 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui
yuanxi20010 小时前
青海共和百万千瓦光伏光热项目并网发电:大客户销售如何用价值力抓住能源大单
大数据·职场和发展·能源·创业创新·学习方法