楼主: 苦苣苔
61 0

[其他] hive和hadoop如何部署 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-12-10
最后登录
2018-12-10

楼主
苦苣苔 发表于 2025-12-9 07:03:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

快速部署 Hive 环境的两种方案

在使用 Apache Hive 进行大数据处理时,通过 Docker 快速搭建环境是一种高效的方式。以下是两种常见的部署方式,适用于不同场景。

一、单容器极简部署(内置 Hadoop)

适合用于本地测试、SQL 编写和 Hive 功能体验,无需复杂的分布式配置。

推荐镜像:bde2020/hive:2.3.2 —— 该镜像已集成 Hadoop 3.x 环境,开箱即用。

启动步骤:

  1. 拉取镜像并创建专用网络(确保组件间通信):
    docker pull bde2020/hive:2.3.2
    docker network create hadoop-network
  2. 运行容器,映射必要端口并设置元数据服务地址:
    docker run -d --name hive \
    --network hadoop-network \
    -p 10000:10000 -p 9083:9083 \
    -e HIVE_METASTORE_URI=thrift://localhost:9083 \
    bde2020/hive:2.3.2

进入容器并使用 Hive:

docker exec -it hive bash
hive
hive> CREATE TABLE t(id INT);
hive> INSERT INTO t VALUES(1),(2);
hive> SELECT * FROM t;

停止服务:

docker stop hive && docker rm hive
[此处为图片1]

二、完整三节点架构(Hadoop + Hive + 外置 Metastore)

适用于深入学习 HDFS、YARN 和 Hive 的全流程协作,支持持久化存储,避免数据丢失。

配置文件:docker-compose.yml(更新于 2025-02)

version: "3.8"
services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: namenode
    ports:
      - "9870:9870"
      - "9000:9000"
    environment:
      - CLUSTER_NAME=hive
      - CORE_CONF_fs_defaultFS=hdfs://0.0.0.0:9000
    volumes:
      - namenode:/hadoop/dfs/name

  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    ports:
      - "9866:9866"
    environment:
      - DATANODE_CONF_dfs_datanode_hostname=121.43.141.135
      - HDFS_CONF_dfs_namenode_datanode_registration_ip_hostname_check=false
      - HDFS_CONF_dfs_client_use_datanode_hostname=true
      - DATANODE_CONF_dfs_datanode_address=0.0.0.0:9866
      - DATANODE_CONF_dfs_datanode_http_address=0.0.0.0:9864
    volumes:
      - datanode:/hadoop/dfs/data

  hive-metastore:
    image: bde2020/hive:2.3.2
    container_name: hive-metastore

  hive-server:
    image: bde2020/hive:2.3.2
    container_name: hive-server
    depends_on:
      - hive-metastore
    ports:
      - "10000:10000"
    environment:
      - HIVE_METASTORE_URI=thrift://hive-metastore:9083

说明:

  • Namenode:负责 HDFS 主控管理,暴露 Web UI 和文件系统接口。
  • Datanode:实际存储数据节点,注意网络配置以保证外部可访问性。
  • Hive Metastore:独立元数据服务,便于解耦与维护。
  • Hive Server:对外提供 Hive 查询接口,依赖 Metastore 启动。
[此处为图片2]

常见问题与注意事项

  • 官方镜像无 latest 标签:apache/hive 和 apache/hadoop 官方仓库未提供 latest 镜像,需明确指定版本号。
  • Hadoop 不建议单独运行:若涉及 HDFS 集群功能,必须使用 docker-compose 构建多容器环境,参考官方文档进行配置。
  • 直接关联方式失效:使用 --link 启动独立容器的方式可能无法满足服务发现需求,推荐统一通过自定义网络管理通信。

原始命令示例(不推荐):

docker run -d --name hadoop -p 9000:9000 -p 8088:8088 -v /your/path/hadoop:/hadoop apache/hadoop:3.4.1

此命令难以维持稳定集群状态,应改用 compose 方式部署。

替代方案中使用的 bde2020/hive 系列镜像经过良好封装,极大简化了配置流程,是目前较为可靠的实践选择。

services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: namenode
    ports:
      - "9870:9870"
      - "9000:9000"
    volumes:
      - namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test-cluster
    env_file:
      - ./hadoop.env

  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: datanode
    ports:
      - "9864:9864"
    volumes:
      - datanode:/hadoop/dfs/data
    environment:
      SERVICE_PRECONDITION: namenode:9000
    env_file:
      - ./hadoop.env

  hive-metastore-postgresql:
    image: postgres:15
    container_name: postgres-hive
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: hive
      POSTGRES_USER: hive
      POSTGRES_PASSWORD: hive
    volumes:
      - postgres:/var/lib/postgresql/data

  hive-metastore:
    image: apache/hive:4.0.0-beta-1
    container_name: hive-metastore
    ports:
      - "9083:9083"
    environment:
      HIVE_METASTORE_DB: postgres
      HIVE_METASTORE_USER: hive
      HIVE_METASTORE_PASS: hive
      HIVE_METASTORE_JDBC_URL: jdbc:postgresql://postgres-hive:5432/hive
    depends_on:
      - hive-metastore-postgresql
    command: |
      sh -c '
      bin/schematool -dbType postgres -initSchema &
      wait $!
      bin/hive --service metastore'

  hive-server:
    image: apache/hive:4.0.0-beta-1
    container_name: hive-server
    ports:
      - "10000:10000"
      - "10002:10002"
    environment:
      HIVE_SERVER2_THRIFT_BIND_HOST: 0.0.0.0
    depends_on:
      - hive-metastore
    command: | 
      sh -c '
      bin/hive --service hiveserver2'
volumes:
  namenode:
  datanode:
  postgres:

一键启动服务

使用以下命令在后台拉取镜像并启动所有容器:

docker compose up -d

确认所有服务状态是否正常运行:

docker compose ps

当显示全部五个服务为 Running 状态时,表示集群已成功部署。

服务访问方式

  • NameNode Web UI:可通过浏览器访问 http://localhost:9870 查看 HDFS 集群状态。
  • HiveServer2 连接:使用 Beeline 客户端连接 Hive 服务:
    beeline -u jdbc:hive2://localhost:10000

停止与清理

关闭所有容器并移除相关数据卷(谨慎操作):

docker compose down -v

其中 -v 参数会同时删除具名卷中的持久化数据;若仅停止而不删除数据,可省略该参数。

方案中各容器的作用说明

“方案 2”通过 docker-compose 启动了五个独立容器,分别承担不同角色:

  1. namenode:作为 HDFS 的主节点,负责管理文件系统的命名空间、元数据及块的位置信息,并提供 Web 管理界面(端口 9870)。
  2. datanode:HDFS 的工作节点,实际存储数据块,定期向 NameNode 汇报状态,支持通过 9864 端口查看本地存储详情。
  3. postgres:运行 PostgreSQL 数据库,用于持久化存储 Hive Metastore 的元数据,包括表结构、分区定义和字段类型等信息。相比 MySQL,Postgres 更便于本地开发且无需额外授权配置。
  4. hive-metastore:将 Postgres 中的元数据封装为 Thrift 接口服务(监听 9083 端口),供 HiveServer2 或其他计算引擎(如 Spark、Trino)查询元数据。
  5. hive-server:对外提供 HiveServer2 服务,支持 JDBC/ODBC 访问,允许用户执行 HiveQL 查询,是上层应用接入 Hive 的主要入口点。

数据卷挂载位置解析

本方案采用具名卷(named volumes)实现数据持久化,Docker 自动管理其物理存储路径。具体映射关系如下表所示:

服务名称 容器内路径 卷名称(具名卷) 宿主机默认路径(Docker 原生管理区)
namenode /hadoop/dfs/name namenode /var/lib/docker/volumes/<compose_dir>_namenode/_data
datanode /hadoop/dfs/data datanode /var/lib/docker/volumes/<compose_dir>_datanode/_data
postgres /var/lib/postgresql/data postgres /var/lib/docker/volumes/<compose_dir>_postgres/_data

注:<compose_dir> 表示当前 docker-compose.yml 所在目录的名称,Docker 会自动以此作为前缀生成卷名。

在 Windows 或 macOS 平台,由于 Docker 运行于虚拟机内部,上述路径位于 VM 中,宿主机无法直接浏览。如需在本地文件系统中查看或备份数据,建议改用绑定挂载(bind mount)方式。

如何将数据保存到本地可见目录(可选优化)

若希望数据落盘至项目目录下以便查看或调试,可将原具名卷改为 bind mount 挂载形式。修改 docker-compose.yml 相关部分如下:

services:
  namenode:
    ...
    volumes:
      - ./data/namenode:/hadoop/dfs/name   # 映射至当前目录下的 data/namenode

  datanode:
    ...
    volumes:
      - ./data/datanode:/hadoop/dfs/data

  postgres:
    ...
    volumes:
      - ./data/postgres:/var/lib/postgresql/data

此方式使得数据直接存储在宿主机指定路径中,便于管理和迁移,但需注意权限设置与跨平台兼容性问题。

[此处为图片1]

对外提供 JDBC/ODBC 接口(端口 10000),支持接收如 “select * from …” 类型的 SQL 查询请求。系统解析 SQL 后,会将其转换为 MapReduce 或 Tez 任务,并提交至 YARN 进行调度执行。该过程复用了 Hive 镜像中内置的简易 MR 框架,最终从 HDFS 上读取数据并返回查询结果。

五个容器通过共享一个名为 hadoop-network 的自定义网络实现互联,需按顺序启动:先启动 Postgres → metastore → server;与此同时,namenode 与 datanode 容器负责提供分布式文件存储能力。这一组合构成了一个最小化的“Hadoop + Hive”学习与开发环境。

问题记录:为何出现多个 128MB 的文件?

128 MB 是 HDFS 默认的块大小(block size),与用户上传文件的实际大小无关。只要文件大小超过 1 字节,HDFS 就会为其分配至少一个 128 MB 的逻辑块空间。因此:

  • 你上传的每个 .json 文件实际可能只有几 KB;
  • 但在 HDFS 中,每个文件都会占用一个完整的 128 MB 块(逻辑上显示为 128 MB,物理存储仅使用实际字节数,不会真正浪费磁盘空间)。

查看真实文件大小的方法

WebUI 方式:
点击文件名进入详情页,在右侧信息栏中,Block Size 显示的是 128 MB,而 File Size 才是文件的真实字节大小。

命令行方式(CLI):

docker exec namenode hdfs dfs -du -h /user/hive/warehouse/reco.db/user_behavior/dt=2025-12-07/03

输出示例:

3.2 K  3.2 K  /user/…/behavior_xxx.json

其中第一列即为文件的真实占用空间。

测试环境下调整块大小(节省内存)

若希望在本地测试时减小块大小以节约资源,可在 NameNode 的 hdfs-site.xml 配置文件中添加以下内容:

<property>
  <name>dfs.blocksize</name>
  <value>8m</value>
</property>

修改后重启整个集群,新上传的文件将按 8 MB 进行切块存储。生产环境中建议保持默认的 128 MB,有利于提升整体性能。

本地开发写入失败问题排查

某些镜像未正确读取主机 hostname 配置,导致内部通信依赖局域网 IP 地址。因此,在本地开发时虽然可以正常创建目录,但实际写入操作可能失败。

路径处理注意事项:

使用如下代码获取文件所在目录路径时,应确保遵循 HDFS 路径规范(使用正斜杠 / 分隔):

// 获取文件路径中的最后一个 '/' 位置
lastSlashIndex := strings.LastIndex(filePath, "/")
if lastSlashIndex <= 0 {
    return fmt.Errorf("invalid HDFS file path: %s", filePath)
}
dirPath := filePath[:lastSlashIndex]

// 确保路径以 '/' 开头
if !strings.HasPrefix(dirPath, "/") {
    dirPath = "/" + dirPath
}

注意:避免使用 filepath.Dir() 方法,因其在 Windows 系统下会生成反斜杠 \ 作为分隔符,导致 Linux 环境下的 HDFS 路径解析错误。

[此处为图片1]

三、生产级拆分架构部署方案(支持自行编译与配置挂载)

适用场景:企业内网部署、需集成 Kerberos 认证、Ranger 权限控制、Tez 引擎等高级功能。

核心步骤概要(详细可进一步咨询):

  1. 基于官方 hadoop:3.3.6 镜像,自行编译 Hive 4.0.0 源码,生成 tar 包;
  2. 编写多阶段 Dockerfile,分层构建包含 Hadoop、Hive、Tez 和 MySQL Connector 的定制镜像;
  3. 使用 docker-compose 将服务拆分为独立组件:
    • zk(ZooKeeper)
    • hdfs-nn(NameNode)
    • hdfs-dn(DataNode)
    • yarn-rm(ResourceManager)
    • yarn-nm(NodeManager)
    • hms(Hive Metastore)
    • postgres(元数据库)
    • hiveserver2(Hive Server)
  4. 将关键配置文件(如 hive-site.xml、core-site.xml、yarn-site.xml)通过 ConfigMap 或 Volume 外挂,支持热更新;
  5. 设置资源限制与日志收集机制:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
    
    日志统一输出到 stdout,由 filebeat 采集并发送至 Elasticsearch;
  6. 安全增强措施:
    • 启用 Kerberos 实现身份认证;
    • 部署 Ranger-Hive 插件,实现列级别权限控制;
    • SSL 终端终止于 Traefik 层;
  7. 监控体系搭建:
    • 通过 JMX 暴露 Hive Metastore 指标,接入 Prometheus;
    • 使用 Grafana 模板 ID:15334 进行可视化展示。

常见问题:docker exec namenode netstat -tnlp | grep 9000 无输出

如果该命令没有任何返回,说明 NameNode 进程并未监听 9000 端口,外部即使开放端口也无法连接——问题根源在于容器内部进程状态或配置。

快速排查步骤:
进入容器后,首先检查启动脚本中是否正确设置了 RPC 监听端口:

bash

确认配置项 fs.defaultFS 及相关 RPC 参数是否指向 9000 端口,例如:

hdfs://namenode:9000

若配置错误或被覆盖,则需修正配置文件并重启服务。

docker exec -it namenode bash
grep 9000 $HADOOP_HOME/etc/hadoop/core-site.xml

正常情况下应显示:

hdfs://0.0.0.0:9000

若配置中的 value 为 localhost 或 127.0.0.1,则需将其绑定更改为 0.0.0.0(具体操作见下文)。
若文件中端口并非 9000,则需要将端口号恢复为 9000,或通过环境变量进行调整。

使用官方镜像时,推荐通过环境变量方式修改,最为简便。只需在 docker-compose.yml 文件的 namenode 服务中添加如下配置项:

namenode:
  image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
  container_name: namenode
  ports:
    - "9870:9870"
    - "9000:9000"
  environment:
    - CLUSTER_NAME=hive
    - CORE_CONF_fs_defaultFS=hdfs://0.0.0.0:9000   # 显式设置默认文件系统地址
  volumes:
    - namenode:/hadoop/dfs/name

完成修改后,重启容器以应用变更:

docker compose down
docker compose up -d

随后检查端口监听状态:

docker exec namenode netstat -tnlp | grep 9000

预期输出结果为:

tcp  0  0 0.0.0.0:9000  0.0.0.0:*  LISTEN  /java

此时可从本地或远程进行连接测试:

Test-NetConnection 121.43.141.135 -Port 9000

当返回信息中包含 TcpTestSucceeded : True 时,表示网络链路已完全打通。

核心要点总结

若执行 netstat 命令无输出,说明进程未监听 9000 端口。解决方法:在 docker-compose 中添加环境变量 CORE_CONF_fs_defaultFS=hdfs://0.0.0.0:9000,重启服务后即可看到监听出现,外部连接也随之生效。

常见问题与注意事项

  • Windows 用户注意:请进入 Docker Desktop 设置界面,选择 Settings → Resources → File Sharing,并将当前项目目录加入共享路径,否则可能导致卷挂载失败。
  • M1/M2 芯片 Mac 设备:需确保所用镜像支持 linux/arm64 架构;若拉取的是 x86 架构镜像,运行时会出现兼容性错误。
  • 端口冲突处理:如宿主机 10000 端口被占用,可将 docker-compose.yml 中对应映射修改为 "10001:10000" 即可规避。
  • Hive Metastore 初始化:首次启动 metastore 容器时会自动初始化数据库 schema,需等待日志中出现 “schemaTool completed” 才代表初始化成功。

方案选择建议

  • 仅需编写 SQL 查询任务 → 推荐使用方案一
  • 希望完整体验 Hadoop 与 Hive 集成环境 → 选择方案二
  • 计划部署至生产环境 → 采用方案三,并可根据需求进一步获取优化版 Dockerfile 与 compose 模板

祝您使用顺利!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Hadoop Hive Had HIV registration

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-23 20:26