欢迎光临
我们一直在努力

【教程】Centos7的Docker环境下MySQL和Hive的配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

如果遇到问题可以在评论区提出

基于你当前的实际环境:

  • MySQL:mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
  • MySQL 驱动:mysql-connector-java-5.1.46.tar.gz
  • Hive:apache-hive-1.2.2-bin.tar.gz

任务一:安装与配置 MySQL(在 master1 容器内操作)

Hive 默认使用 Derby 数据库,但 Derby 不支持多用户并发,因此我们需要将 Hive 的元数据存储在 MySQL 中。

1. 准备安装包(在宿主机执行)

上传三个tar包

在这里插入图片描述 在查看里面,找到文件管理器选项,点击进入 在这里插入图片描述 界面的右侧会出现文件管理器,双击即可列出远程文件 在这里插入图片描述 进到opt目录里面,直接从本地把三份文件拉进去(一定要一个一个拉,等下面的绿条跑完才能拉下一个) 在这里插入图片描述 进到opt目录里面,直接从本地把三份文件拉进去(一定要一个一个拉,等下面的绿条跑完才能拉下一个)

在宿主机(新开一个终端,不要退出容器)执行:

# 复制 MySQL 安装包 (5.7.36)
docker cp /opt/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz master1:/opt/

# 复制 MySQL 驱动包 (5.1.46)
docker cp /opt/mysql-connector-java-5.1.46.tar.gz master1:/opt/

# 复制 Hive 安装包 (注意是 1.2.2)
docker cp /opt/apache-hive-1.2.2-bin.tar.gz master1:/opt/

回到 master1 容器内继续操作:

# 进入master1容器
docker exec -it master1 bash

cd /opt
ll

你应该能看到 mysql-5.7.36…tar.gz、mysql-connector-java-5.1.46.tar.gz 和 apache-hive-1.2.2-bin.tar.gz。

2. 安装依赖软件

yum install -y initscripts libaio numactl

3. 解压 MySQL 并重命名

# 创建 simple 目录
mkdir /simple

# 解压 MySQL 到 /simple 目录 (注意文件名是 5.7.36)
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /simple

# 进入 /simple 目录并重命名
cd /simple
mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql

4. 配置 MySQL 环境变量

vi ~/.bashrc

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

export MYSQL_HOME=/simple/mysql
PATH=$PATH:$MYSQL_HOME/bin

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存退出(先按esc,然后输入:wq,回车)后,使环境变量生效:

source ~/.bashrc

5. 创建 MySQL 用户和组,并修改权限

# 创建 mysql 组和用户
groupadd mysql
useradd -r -g mysql mysql

# 进入 mysql 目录,更改所属组和用户
cd /simple/mysql
chgrp -R mysql .
chown -R mysql .

6. 初始化 MySQL 数据库

注意: 这一步会生成临时密码,请务必复制并保存下来!

mysqld –initialize –user=mysql –basedir=/simple/mysql –datadir=/simple/mysql/data

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在输出结果的最后一行,你会看到类似 [Note] A temporary password is generated for root@localhost: wj(_gG-f=5:h 的信息。就比如我的图片wj(_gG-f=5:h 这个密码记下来,一定要记下来!!!,下面会用到。

7. 修改目录所有者

cd /simple/mysql
chown -R root .
chown -R mysql data

8. 配置 MySQL 启动文件

# 复制启动脚本
cp support-files/mysql.server /etc/init.d/mysql

# 编辑启动脚本
vi /etc/init.d/mysql

在文件中找到 basedir 和 datadir,修改为以下内容(如果找不到,直接在文件开头添加):

basedir=/simple/mysql
datadir=/simple/mysql/data

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

改成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存退出(先按esc,然后输入:wq,回车)。

9. 启动 MySQL 并修改密码

# 启动 MySQL 服务
service mysql start

# 登录 MySQL (使用刚才记下的临时密码)
mysql -uroot -p
# 输入临时密码,回车(就是刚才上面保存的那个,这里是没有回显了,直接粘贴进去就行)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 MySQL 命令行中执行:

— 修改 root 密码为 123456
set password for 'root'@'localhost'=password('123456');

— 创建 Hive 使用的数据库
create database myhive;

— 刷新权限
flush privileges;

— 退出 MySQL
exit;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

10. 验证 MySQL

mysql -uroot -p
# 输入 123456
# 看到 mysql> 提示符即成功
exit;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


任务二:基于 HDFS 和 MySQL 的 Hive 环境搭建(在 master1 容器内操作)

(一) Hive 的本地配置

1. 解压 Hive 安装包

cd /opt

# 解压 Hive 到 /simple 目录 (注意是 1.2.2)
tar -zxvf apache-hive-1.2.2-bin.tar.gz -C /simple

# 进入 /simple 目录,重命名 (注意是 hive1.2.2)
cd /simple
mv apache-hive-1.2.2-bin hive1.2.2

2. 配置 Hive
(1) 复制 MySQL 驱动包

# 解压 MySQL 驱动包 (注意是 5.1.46)
cd /opt
tar -zxvf mysql-connector-java-5.1.46.tar.gz

# 复制驱动 jar 包到 Hive 的 lib 目录 (注意驱动包和 hive 目录版本)
cp /opt/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar /simple/hive1.2.2/lib/

(2) 配置 hive-env.sh

cd /simple/hive1.2.2/conf

# 复制模板文件
cp hive-env.sh.template hive-env.sh

# 编辑 hive-env.sh
vi hive-env.sh

找到 HADOOP_HOME 这一行,修改为(如果被注释了,去掉 #):

HADOOP_HOME=/usr/local/hadoop

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存退出。

(3) 配置 hive-site.xml

# 进入 Hive 配置目录(注意你的版本是 hive1.2.2)
cd /simple/hive1.2.2/conf

# 直接用 cat 和 EOF 写入完整配置,一步到位
cat > hive-site.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true&amp;useSSL=false</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

3. 修改 Hive 配置文件 hive-config.sh

# 进入 Hive 的 bin 目录 (注意是 hive1.2.2)
cd /simple/hive1.2.2/bin

# 编辑 hive-config.sh
vi hive-config.sh

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

export JAVA_HOME=/usr/lib/jdk1.8.0
export HIVE_HOME=/simple/hive1.2.2
export HADOOP_HOME=/usr/local/hadoop

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存退出。

4. 配置系统环境变量

vi ~/.bashrc

在末尾追加(注意是 hive1.2.2):

export HIVE_HOME=/simple/hive1.2.2
export PATH=$PATH:$HIVE_HOME/bin

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存退出,并生效:

source ~/.bashrc

5. 启动 Hive 并验证

前提: 确保 Hadoop 集群已经启动。在 master1 执行 start-all.sh,然后 jps 确认进程都在。

# 启动hadoop
start-all.sh

# 启动 Hive Shell
hive

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果一切正常,你会看到 hive> 提示符。

测试 Hive 基本操作:

— 查看所有数据库
show databases;

— 创建测试表
create table test_table(id int, name string);

— 查看表结构
describe test_table;

— 退出 Hive
exit;



(二) Hive 的远程配置(HiveServer2 + Beeline)

说明: 本地 hive CLI 只能在 master1 上使用,其他节点(slave1、slave2)以及 IDEA 需要通过 HiveServer2 服务来远程访问 Hive。本节配置 HiveServer2 服务端。

1. 配置 Hadoop 代理用户权限

Beeline / JDBC 连接 HiveServer2 时,Hadoop 会检查代理用户权限。需要在 core-site.xml 中放行。

在 master1 上执行:

cd /usr/local/hadoop/etc/hadoop
vi core-site.xml

再修改<configuration> 为以下内容(之前configuration的内容全部删掉,包括两个尖角标签,然后直接替换成下面的):

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data/tmp</value>
<description>Abase for other temporary directories.</description>
</property>

<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>

说明: 这里配置的是 root 用户,因为我们的 HiveServer2 是以 root 身份启动的。* 表示允许所有主机和用户组,实验环境用这个即可。

保存退出后,重启 Hadoop 集群使配置生效:

stop-all.sh
start-all.sh

2. 在 hive-site.xml 中配置 HiveServer2 相关参数

编辑 master1 上的 hive-site.xml:

cd /simple/hive1.2.2/conf
vi hive-site.xml

替换 <configuration> 标签内配置(把之前的configuration全删掉,替换成以下内容):

<configuration>
<!– ==================== MySQL 元数据库连接配置 ==================== –>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true&amp;useSSL=false</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>

<!– ==================== HiveServer2 远程连接配置 ==================== –>
<!– HiveServer2 绑定的主机名 –>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>master1</value>
</property>

<!– HiveServer2 监听端口 –>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!– 关闭 HA 模式(单机实验环境) –>
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>false</value>
</property>

<!– 允许模拟用户,避免 JDBC 连接时权限报错 –>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>

<!– 指定 Hive 在 HDFS 上的仓库目录 –>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>

保存退出。

3. 启动 HiveServer2 服务

# 后台启动(这里要先看看hadoop和mysql有没有启动再执行,执行完要等待30s左右)
hiveserver2 &

验证 HiveServer2 是否启动成功:

# 查看进程
jps
# 应该能看到 RunJar 进程(HiveServer2 的主进程)

# 查看 10000 端口是否监听
netstat -anp | grep 10000
# 应该能看到 LISTEN 状态

请添加图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4. 在 master1 本地验证 Beeline 连接

# 在 master1 上测试
beeline -u "jdbc:hive2://master1:10000/default" -n root

成功后会进入 0: jdbc:hive2://master1:10000/> 提示符。测试:

show databases;
!quit

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意: 第一次执行 SQL 时可能会比较慢,因为 HiveServer2 要初始化会话,稍等片刻即可。


(三) 在 slave1 和 slave2 使用 Beeline 进行远程连接

说明: slave1 和 slave2 默认没有安装 Hive,我们需要把 master1 上的 Hive 环境分发过去。分发完成后,这两个节点就可以作为客户端,通过 Beeline 远程连接 master1 的 HiveServer2。

1. 前置准备:把 Hive 分发到 slave1 和 slave2

在 master1 上执行以下命令(由于 master1 已经配置了免密登录,可以直接使用 scp 和 ssh):

# 1. 确认 slave1 和 slave2 上的 /simple 目录存在(不存在则创建)
ssh slave1 "mkdir -p /simple"
ssh slave2 "mkdir -p /simple"

# 2. 分发 Hive 安装目录到 slave1 和 slave2
scp -r /simple/hive1.2.2 slave1:/simple/
scp -r /simple/hive1.2.2 slave2:/simple/

# 3. 分发环境变量配置文件(这样 slave 节点就有了 HIVE_HOME)
scp ~/.bashrc slave1:~/.bashrc
scp ~/.bashrc slave2:~/.bashrc

2. 在 slave1 上让环境变量生效并验证

# 进入 slave1 容器
docker exec -it slave1 bash

# 生效环境变量
source ~/.bashrc

# 验证 beeline 是否可用
which beeline
# 预期输出:/simple/hive1.2.2/bin/beeline

3. 在 slave2 上让环境变量生效并验证

# 进入 slave2 容器
docker exec -it slave2 bash

# 生效环境变量
source ~/.bashrc

# 验证 beeline 是否可用
which beeline
# 预期输出:/simple/hive1.2.2/bin/beeline

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4. 在slave2使用 Beeline 远程连接 HiveServer2

前提: master1 上的 HiveServer2 必须在运行状态(hiveserver2 &)。

在 slave2 上执行:

beeline -u "jdbc:hive2://master1:10000/default" -n root

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参数说明:

  • -u:JDBC 连接 URL,格式为 jdbc:hive2://<主机名>:<端口>/<数据库>
  • 10000:HiveServer2 的默认端口
  • -n root:指定用户名
5. 验证连接(在任意 slave 节点测试)

成功连接后,Beeline 会出现 0: jdbc:hive2://master1:10000/> 提示符。在 slave1 或 slave2 的 Beeline 中执行测试:

— 查看数据库列表
show databases;

— 退出 Beeline
!quit

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预期结果: 能看到 master1 上 Hive 的所有数据库和表。由于元数据是共享的(都存在 master1 的 MySQL 里),你在 slave1 或 slave2 上通过 Beeline 创建的表,回到 master1 用 hive 命令行或 beeline 也能立刻看到。

(四)做端口转发

1. 在宿主机重建docker容器实现转发

端口转发点击蓝字跳转根据另外一篇文章配置端口转发 **端口转发方案:**端口转发方案-使用容器重建的方式加入端口转发

3. 在 Windows 本地测试连通性

打开你 Windows 电脑的 PowerShell,测试宿主机 IP(192.168.196.101)的 10000 端口是否打通(这里要稍微等一会):

Test-NetConnection –ComputerName 192.168.xxx.xxx –Port 10000

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 如果最后一行显示 TcpTestSucceeded : True,说明网络彻底打通,可以前往 IDEA 配置连接。
  • 注意:在 IDEA 里配置时,Host 必须填宿主机的 IP(这里我的是192.168.196.101),端口填 10000,不要填容器内部的 IP 或 master1。
!!!!!!注意注意注意注意注意注意注意!!!!!!

如果上面端口转发失败(Windows的powershell测试结果是false):

1.检查测试IP是否是你自己的IP

在这里插入图片描述

2.在master1容器内hiveserver2启动成功(两个标志)

在这里插入图片描述 如果有RunJar,但是ss -ltnp | grep 10000之后没有红框内容(是空的) 在这里插入图片描述 则需要做以下操作: 1.先jps查看RunJar的进程号(每个人每次启动进程号都不一样),然后杀死进程

kill -9 你的进程号

在这里插入图片描述

2.启动mysql

service mysql start

在这里插入图片描述

3.启动hiveserver2

hiveserver2 &

在这里插入图片描述 4.查看结果 在这里插入图片描述

(五) 使用idea进行远程的数据库连接(专业版IDEA)

⚠️⚠️注意:这里我使用的是2025的专业版,如果你们使用的是社区版(2025.3前的社区版)可能会没有数据库这个功能,如果没有数据库这个database选项则需要卸载之前的IDEA,重新下载IDEA2025.3之后的版本,链接如下

IDEA最新版下载官网链接

在这里插入图片描述

第一步:在 IDEA 中打开 Database 窗口
  • 打开 IDEA,在顶部菜单栏点击 View -> Tool Windows -> Database。
  • 或者点击 IDEA 界面最右侧边栏的 Database 图标,打开数据库管理面板。
  • 第二步:新建 Hive 数据源
  • 点击面板左上角的 + 号。
  • 选择 Data Source -> Apache Hive。
  • 第三步:填写连接配置

    在弹出的配置窗口中,填写以下信息:

    字段填写内容说明
    Name Hive-Master1 自定义名称,随便写
    Host 192.168.xxx.xxx 重要:填你宿主机的静态 IP(我这里是192.168.196.101)
    Port 10000 HiveServer2 的默认端口(一般都是10000不用修改)
    User root 用户名(一般都是root不用修改)
    Password (留空) 实验环境通常不需要密码
    default 默认数据库

    第四步:设置Hive驱动

    下载所需驱动和所需依赖:

  • Hive JDBC 驱动

    地址:https://repo1.maven.org/maven2/org/apache/hive/hive-jdbc/1.2.2/hive-jdbc-1.2.2-standalone.jar 点击下载:hive-jdbc-1.2.2-standalone.jar下载

  • hadoop-common包 地址:https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-common/2.7.7/hadoop-common-2.7.7.jar 点击下载:hadoop-common-2.7.7.jar下载

  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    在刚才数据库配置的界面,在顶部找到Drivers,然后在左侧栏找到Apache Hive,然后点击加号添加刚才下载的两份驱动,然后点击Apply然后OK

    第五步:刷新懒加载

    在数据库界面店家刷新按钮,等待加载即可,有看到default数据库即为成功。

    结合你这次实验中实际踩过的坑(比如 MySQL 没启动、PID 残留、HiveServer2 找不到类、IDEA 驱动版本不匹配等),我帮你把“常见问题排查”重写了一份更全面、更贴合实战的版本:


    任务三:Hive 表的创建、加载与查询

    ⚠️ 执行前请确认

  • Hadoop 已启动:在 master1 执行 jps 能看到 NameNode、SecondaryNameNode、ResourceManager。如果没有,启动hadoop命令start-all.sh.
  • MySQL 已启动:在 master1 执行 service mysql status 正常,否则 Hive 元数据操作会失败。如果没开,启动命令service mysql start
  • HiveServer2 已启动(如果用 beeline/IDEA):netstat -anp | grep 10000 有监听,且宿主机端口转发已做好。如果没有,启动命令hiveserver2 &
  • 0.文件准备

    第一步将文件拖拽到CentOS7宿主机上

    # 在宿主机下面执行,如果还在容器master1里面要exit退出来
    cd /opt

    在xshell里面打开文件管理器,在右边的侧边栏里面打开/opt目录,然后把作业中的course.txt、sc.txt、student_info、students.txt、jizhan_information.csv五份文件从本地Windows拖拽到xshell文件管理器的/opt目录即可

    第二步:将文件从宿主机复制到 master1 容器

    # 在宿主机终端执行
    docker cp /opt/course.txt master1:/opt/
    docker cp /opt/sc.txt master1:/opt/
    docker cp /opt/student_info.txt master1:/opt/
    docker cp /opt/students.txt master1:/opt/
    docker cp /opt/jizhan_information.csv master1:/opt/

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    第三步:进入容器验证文件

    # 进入 master1 容器
    docker exec -it master1 bash

    # 查看文件是否都在容器内的 /opt 目录下
    cd /opt
    ll

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    1. 使用 location 创建外部表 student_info

    假设你已经把 student_info.txt 上传到了 HDFS 的 /user/hive/warehouse/student_info/ 目录。

    在容器内执行以下命令上传到 HDFS:

    # 执行前一定要确认hadoop(start-all.sh)、mysql(service mysql start)已经启动
    hdfs dfs -mkdir -p /user/hive/warehouse/student_info/
    hdfs dfs -put /opt/student_info.txt /user/hive/warehouse/student_info/

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    进入 Hive 命令行后建表:

    # 进入hive界面
    hive

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    创建student_info外部表

    CREATE EXTERNAL TABLE student_info (
    id INT,
    name STRING,
    age INT,
    gender STRING
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    STORED AS TEXTFILE
    LOCATION '/user/hive/warehouse/student_info/';

    说明:字段定义需根据 student_info.txt 的实际列来调整。LOCATION 指向 HDFS 上数据文件所在的目录,外部表删除时只删元数据,不删数据。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    2. 创建 student、course、sc 三张表并 load 数据

    — 学生表
    CREATE TABLE student (
    sno STRING,
    sname STRING,
    ssex STRING,
    sage INT,
    sdept STRING
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

    — 课程表
    CREATE TABLE course (
    cno STRING,
    cname STRING,
    cpno STRING,
    ccredit INT
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

    — 选课表
    CREATE TABLE sc (
    sno STRING,
    cno STRING,
    grade INT
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

    — 加载数据(这里的路径是 master1 容器内的 /opt 目录)
    LOAD DATA LOCAL INPATH '/opt/students.txt' INTO TABLE student;
    LOAD DATA LOCAL INPATH '/opt/course.txt' INTO TABLE course;
    LOAD DATA LOCAL INPATH '/opt/sc.txt' INTO TABLE sc;

    注意:这里用的是 LOCAL INPATH,表示从容器本地文件系统(即容器内的 /opt)加载数据,而不是从 HDFS 加载。

    在这里插入图片描述

    3. 用 join + where 查询

    查询选修了课程的学生姓名:

    SELECT DISTINCT s.sname
    FROM student s
    JOIN sc ON s.sno = sc.sno;

    在这里插入图片描述

    查询 2 号课程分数大于 90 的学生姓名:

    SELECT s.sname
    FROM student s
    JOIN sc ON s.sno = sc.sno
    WHERE sc.cno = '2' AND sc.grade > 90;

    在这里插入图片描述

    4. 查询选修了 3 门以上课程的学生学号

    SELECT sno
    FROM sc
    GROUP BY sno
    HAVING COUNT(cno) > 3;

    在这里插入图片描述


    任务四:掉话率 Top20 基站统计

    1. 上传 jizhan_information.csv 至 HDFS

    前面已经通过 docker cp 把文件放到了 master1 容器的 /opt 目录下。现在在容器内把它上传到 HDFS:

    # 执行以下命令要先退出hive回到master1的命令界面
    exit;
    hdfs dfs -mkdir -p /user/hive/warehouse/jizhan/
    hdfs dfs -put /opt/jizhan_information.csv /user/hive/warehouse/jizhan/

    在这里插入图片描述

    2. 在 myhive 数据库中创建 jizhan 表

    进入hive:

    hive

    先创建和切换数据库:

    CREATE DATABASE IF NOT EXISTS myhive;
    USE myhive;

    在这里插入图片描述

    创建表(字段需根据 CSV 实际列名和类型调整,这里假设包含基站 ID、掉话总时长、通话持续总时长等字段):

    CREATE TABLE jizhan (
    record_time STRING,
    imei STRING,
    cell STRING,
    ph_num INT,
    call_num INT,
    drop_num INT,
    duration INT,
    drop_rate DOUBLE,
    net_type STRING,
    erl DOUBLE
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    STORED AS TEXTFILE
    TBLPROPERTIES ("skip.header.line.count"="1");

    注:skip.header.line.count 会自动跳过你 CSV 的第一行英文表头。

    在这里插入图片描述

    3. 装载数据到 jizhan 表

    因为文件已经上传到了 HDFS,使用非 LOCAL 的方式加载:

    LOAD DATA INPATH '/user/hive/warehouse/jizhan/jizhan_information.csv' INTO TABLE jizhan;

    在这里插入图片描述

    4. 创建 jizhan_result 表

    用于存储统计好的基站 ID 和掉话率结果:

    CREATE TABLE jizhan_result (
    cell STRING,
    drop_rate DOUBLE
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

    在这里插入图片描述

    5. 统计掉话率并取 Top20

    根据公式 掉话率 = 掉话总次数 / 呼叫总次数,我们需要先按基站分组,算出每个基站的掉话总数和呼叫总数,再进行除法计算。

    SELECT
    cell,
    SUM(drop_num) / SUM(call_num) AS drop_rate
    FROM jizhan
    WHERE call_num > 0
    GROUP BY cell
    ORDER BY drop_rate DESC
    LIMIT 20;


    常见问题排查

    结合本次实验的完整流程,以下是在搭建 HDFS、MySQL、Hive 以及远程连接 IDEA 时最容易遇到的报错及解决方案。

    1. 数据库与元数据相关报错

    • 现象: 在 MySQL 里手动执行了 CREATE DATABASE myhive;,但在 Hive 里执行 SHOW DATABASES; 只有 default,找不到 myhive。
      • 原因: Hive 的数据库必须在 Hive 命令行里创建(或者在 Hive 建表时自动创建),Hive 才会在 MySQL 的 DBS 系统表中写入记录。直接在 MySQL 里建库,Hive 是不认的。
      • 解决: 进入 hive 命令行,执行 CREATE DATABASE IF NOT EXISTS myhive;,然后再 USE myhive;。
    • 现象: 启动 hive 或 hiveserver2 时报错 ClassNotFoundException: com.mysql.jdbc.Driver。
      • 原因: MySQL 驱动包没有放到 Hive 的 lib 目录下。
      • 解决: 确保已将 mysql-connector-java-5.1.46-bin.jar 复制到了 /simple/hive1.2.2/lib/ 目录下。
    • 现象: service mysql start 报错 ERROR! MySQL is not running, but PID file exists。
      • 原因: MySQL 之前异常退出,残留了进程文件(.pid)。
      • 解决: 执行 rm -f /simple/mysql/data/*.pid 删除残留文件,再次启动即可。

    2. HiveServer2 与端口转发失败(重点)

    • 现象: 在宿主机(或 Windows 本地)通过 Test-NetConnection 测试 10000 端口不通(TcpTestSucceeded : False),但容器内 netstat -anp | grep 10000 明明显示在监听。
      • 原因: 这是 Docker 环境的常见坑。Docker 启动时会自动开启宿主机转发,并把 iptables 的 FORWARD 链默认策略改为 DROP。你手动加的 iptables 转发规则只改了目标地址(DNAT),但数据包到了 FORWARD 链被拦截了。
      • 解决: 在宿主机上执行 iptables -P FORWARD ACCEPT 临时放行转发流量。为了防止重启 Docker 后失效,推荐将 docker0 网桥加入防火墙信任区:firewall-cmd –permanent –zone=trusted –add-interface=docker0 然后 firewall-cmd –reload。
    • 现象: 执行 hiveserver2 & 后,查看 10000 端口无监听,服务启动失败。
      • 原因 1:MySQL 没启动。 HiveServer2 启动需要立刻连上 MySQL,否则直接崩溃。
      • 原因 2:内存不足。 默认堆内存太小导致 OOM。
      • 解决: 确保 service mysql start 已运行。若内存不够,可在 hive-env.sh 中追加 export HADOOP_HEAPSIZE=2048 和 export HIVE_SERVER2_HEAPSIZE=2048。

    3. IDEA 远程连接 Hive 失败

    • 现象: 报错 User: root is not allowed to impersonate root。
      • 原因: Hadoop 代理权限未配置,HiveServer2 模拟用户被拒绝。
      • 解决: 检查 master1 的 core-site.xml,确保包含 hadoop.proxyuser.root.hosts 和 hadoop.proxyuser.root.groups 配置(值均设为 *),修改后必须重启 Hadoop 和 HiveServer2。
    • 现象: 报错 Required field 'client_protocol' is unset、TCLIService$Iface not found 或者 没有此对象的驱动程序类。
      • 原因: IDEA 自动下载的 JDBC 驱动版本太高,与老旧的 Hive 1.2.2 不兼容;或者没有正确指定驱动类。
      • 解决:
      • 不要用 IDEA 自动下载的驱动。手动下载 hive-jdbc-1.2.2-standalone.jar 和 hadoop-common-2.7.7.jar 并在 Drivers 中导入。
      • 在“类”选项的下拉框中,手动填入 org.apache.hive.jdbc.HiveDriver(不要选列表里默认的 Derby 驱动)。

    4. Hadoop 集群与 HDFS 异常

    • 现象: jps 发现 DataNode 没起来,或者 Hive 建表/查询一直卡住。
      • 原因: 多次执行 hdfs namenode -format 导致 master1 和 slave 节点之间的 clusterID 不一致。
      • 解决: 停止集群(stop-all.sh),清理所有节点的 data 和 logs 目录(如 /usr/local/hadoop/data/tmp/*),在 master1 上仅格式化一次(hdfs namenode -format),然后重新启动。
    • 现象: 启动 hive 报错 Connection refused(连接 master1:9000 失败)。
      • 原因: Hadoop 集群没有启动。
      • 解决: 在 master1 执行 start-all.sh,用 jps 确认 NameNode 和 SecondaryNameNode和ResourceManager已经启动。

    5. 数据加载与查询错位

    • 现象: 建完表后执行 SELECT * FROM 表名;,发现数据全错位或者全是 NULL。
      • 原因: 建表语句中的 FIELDS TERMINATED BY 分隔符,与你文本文件中实际使用的分隔符不一致;或者字段的数据类型不匹配(比如把带 +08 的时间直接定义为 TIMESTAMP)。
      • 解决: 仔细核对 CSV/TXT 文件的表头。带有时区的日期统一定义为 STRING;确认文件是用逗号 , 还是制表符 \\t 分割的。对于 jizhan_information.csv 记得加上 TBLPROPERTIES ("skip.header.line.count"="1") 跳过表头。

    6. Hive 建表/加载数据相关新坑

    • 现象:在执行任务四建表时,提示 FAILED: SemanticException [Error 10001]: Table not found myhive.jizhan。
      • 原因:没有切换到 myhive 数据库,Hive 默认把表建到了 default 库里。
      • 解决:在 Hive 命令行里先执行 USE myhive;,然后再执行 CREATE TABLE …。
    • 现象:执行 LOAD DATA INPATH … 报错 Invalid path 或找不到文件。
      • 原因:INPATH 后面跟的是 HDFS 上的路径,如果你要用容器本地的文件,必须用 LOAD DATA **LOCAL** INPATH '/opt/xxx.txt',漏写 LOCAL 会导致 Hive 去 HDFS 里找,自然找不到。
      • 解决:确认文件是在容器本地还是 HDFS,本地一定要加 LOCAL。另外,LOAD 操作完成后,原文件会被移动到 Hive 的仓库目录下,所以如果重复执行会提示文件不存在。
    赞(0)
    未经允许不得转载:171主机测评 » 【教程】Centos7的Docker环境下MySQL和Hive的配置
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址