未记录事实核验 · 状态:维护中

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适合学习以Presto 0.279为例的单机、主机集群及容器部署配置组织,不是可直接照抄执行的完整生产方案。当前Compose仍让两个Worker共用同一份node.properties,三个节点共用运行数据卷,且未完整交付Docker构建上下文、各容器节点配置及容器网络内可达的发现服务地址;实际部署需补齐材料并保证节点标识唯一、运行数据隔离。集群示例的16GB每节点查询总内存上限与16GB JVM堆没有留下堆内余量,不能直接叠加2GB堆预留;最低8GB物理内存主机也不宜照抄8GB堆配置。Hive练习要求已有MetaStore、Hadoop配置及存储访问条件,不具备时应仅使用memory连接器验证基础查询;主机集群及服务管理另需准备远程访问、Java、presto运行账户和目录权限,部署脚本不包含服务启动与验证。安全及事件监听器片段仅展示配置方向,认证器、证书、凭据和插件材料须另行准备。本次仅作正文结构与配置一致性审阅,未进行外部事实、版本兼容性或实际部署核验。

Presto环境搭建 - 从单机到集群的完整部署指南

abstract 📋 本节概览

  • 🎯 学习目标:掌握Presto的完整安装和配置过程,搭建可用的开发和生产环境
  • 📚 前置知识:Presto架构 和 Linux基础操作
  • ⏱️ 预计用时:90分钟

🛠️ 环境准备

📋 系统要求

硬件要求:

  • CPU:至少4核,推荐8核以上
  • 内存:最小8GB,推荐16GB以上
  • 磁盘:SSD推荐,至少100GB可用空间
  • 网络:千兆以太网,低延迟

软件要求:

操作系统: Linux (CentOS 7+, Ubuntu 18.04+)
Java版本: OpenJDK 11+ 或 Oracle JDK 11+
Python版本: Python 2.7+ 或 Python 3.6+

🔧 环境检查清单

# 1. 检查操作系统版本
cat /etc/os-release

# 2. 检查Java版本
java -version

# 3. 检查内存和CPU
free -h
lscpu

# 4. 检查磁盘空间
df -h

# 5. 检查网络连接
ping -c 3 google.com

☕ Java环境配置

📦 安装OpenJDK 11

CentOS/RHEL:

# 安装OpenJDK 11
sudo yum install -y java-11-openjdk java-11-openjdk-devel

# 设置JAVA_HOME
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

Ubuntu/Debian:

# 安装OpenJDK 11
sudo apt-get update
sudo apt-get install -y openjdk-11-jdk

# 设置JAVA_HOME
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

✅ Java配置验证

# 验证Java安装
java -version
javac -version
echo $JAVA_HOME

# 预期输出示例
# openjdk version "11.0.x" 2021-xx-xx
# OpenJDK Runtime Environment (build 11.0.x+x)

🚀 Presto单机安装

📥 下载Presto

# 创建安装目录
sudo mkdir -p /opt/presto
cd /opt/presto

# 下载Presto服务器包 (以0.279版本为例)
sudo wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.279/presto-server-0.279.tar.gz

# 下载Presto CLI
sudo wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.279/presto-cli-0.279-executable.jar

# 解压服务器包
sudo tar -xzf presto-server-0.279.tar.gz
sudo mv presto-server-0.279 server

# 配置CLI
sudo mv presto-cli-0.279-executable.jar presto-cli
sudo chmod +x presto-cli

📁 目录结构说明

路径 说明
/opt/presto/server/ Presto 服务器目录
/opt/presto/server/bin/ 启动脚本
/opt/presto/server/lib/ 依赖库
/opt/presto/server/plugin/ 插件目录
/opt/presto/server/etc/ 配置文件目录
/opt/presto/presto-cli CLI 工具

⚙️ 基础配置

1. 创建配置目录:

sudo mkdir -p /opt/presto/server/etc
sudo mkdir -p /opt/presto/server/etc/catalog
sudo mkdir -p /opt/presto/data

2. 节点配置 (node.properties):

sudo tee /opt/presto/server/etc/node.properties > /dev/null << 'EOF'
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/opt/presto/data
EOF

3. JVM配置 (jvm.config):

sudo tee /opt/presto/server/etc/jvm.config > /dev/null << 'EOF'
-server
-Xmx8G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-Djdk.attach.allowAttachSelf=true
EOF

4. 配置属性 (config.properties):

sudo tee /opt/presto/server/etc/config.properties > /dev/null << 'EOF'
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://localhost:8080
EOF

5. 日志配置 (log.properties):

sudo tee /opt/presto/server/etc/log.properties > /dev/null << 'EOF'
com.facebook.presto=INFO
com.facebook.presto.server.PluginManager=DEBUG
EOF

🗄️ Hive连接器配置

创建Hive连接器:

sudo tee /opt/presto/server/etc/catalog/hive.properties > /dev/null << 'EOF'
connector.name=hive-hadoop2
hive.metastore.uri=thrift://localhost:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
hive.allow-drop-table=true
hive.allow-rename-table=true
EOF

💾 内存连接器配置

创建内存连接器用于测试:

sudo tee /opt/presto/server/etc/catalog/memory.properties > /dev/null << 'EOF'
connector.name=memory
EOF

🚀 启动Presto服务

🔧 启动脚本

# 启动Presto服务器
sudo /opt/presto/server/bin/launcher start

# 检查服务状态
sudo /opt/presto/server/bin/launcher status

# 查看日志
tail -f /opt/presto/data/var/log/server.log

🌐 Web UI访问

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

Web UI界面包含:

  • 概览页面:集群状态和查询统计
  • 查询页面:正在运行和历史查询
  • 工作节点:节点状态和资源使用
  • 连接器:已配置的数据源连接器

🖥️ CLI连接测试

# 连接到Presto
/opt/presto/presto-cli --server localhost:8080

# 测试基本查询
presto> SELECT 'Hello, Presto!' as greeting;
presto> SHOW CATALOGS;
presto> SHOW SCHEMAS FROM memory;

🏢 Presto集群部署

📊 集群架构规划

%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TB
    subgraph "Presto集群架构"
        subgraph "Coordinator节点"
            A[presto-coordinator<br/>🎯 10.0.0.10<br/>• 查询调度<br/>• Web UI<br/>• 元数据管理]
        end
        subgraph "Worker节点集群"
            B[presto-worker-1<br/>⚙️ 10.0.0.11<br/>• 数据处理<br/>• 任务执行]
            C[presto-worker-2<br/>⚙️ 10.0.0.12<br/>• 数据处理<br/>• 任务执行]
            D[presto-worker-3<br/>⚙️ 10.0.0.13<br/>• 数据处理<br/>• 任务执行]
        end
        subgraph "共享存储"
            E[HDFS/S3<br/>💾 分布式存储]
            F[Hive MetaStore<br/>📋 元数据服务]
        end
    A --> B
    A --> C
    A --> D
    B --> E
    C --> E
    D --> E
    A --> F
    style A fill:#ff6b6b,color:#fff
    style B fill:#4ecdc4,color:#fff
    style C fill:#4ecdc4,color:#fff
    style D fill:#4ecdc4,color:#fff

    end

🎯 Coordinator节点配置

config.properties:

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-total-memory=100GB
query.max-memory-per-node=8GB
query.max-total-memory-per-node=16GB
discovery-server.enabled=true
discovery.uri=http://10.0.0.10:8080

node.properties:

node.environment=production
node.id=coordinator-1
node.data-dir=/opt/presto/data

jvm.config:

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-Djdk.attach.allowAttachSelf=true

⚙️ Worker节点配置

config.properties:

coordinator=false
http-server.http.port=8080
query.max-memory-per-node=8GB
query.max-total-memory-per-node=16GB
discovery.uri=http://10.0.0.10:8080

node.properties (每个Worker节点唯一):

node.environment=production
# 每个Worker使用唯一标识,例如worker-1、worker-2、worker-3
node.id=worker-1
node.data-dir=/opt/presto/data

🔄 集群部署脚本

#!/bin/bash
# deploy-presto-cluster.sh

COORDINATOR_IP="10.0.0.10"
WORKER_IPS=("10.0.0.11" "10.0.0.12" "10.0.0.13")
PRESTO_VERSION="0.279"

# 函数:部署到单个节点
deploy_node() {
    local ip=$1
    local node_type=$2
    local node_id=$3
    
    echo "部署Presto到节点: $ip ($node_type)"
    
    # 复制Presto包到目标节点
    scp presto-server-${PRESTO_VERSION}.tar.gz root@$ip:/tmp/
    
    # 远程执行安装命令
    ssh root@$ip << EOF
        # 创建目录
        mkdir -p /opt/presto
        cd /opt/presto
        
        # 解压安装包
        tar -xzf /tmp/presto-server-${PRESTO_VERSION}.tar.gz
        mv presto-server-${PRESTO_VERSION} server
        
        # 创建配置目录
        mkdir -p server/etc/catalog
        mkdir -p data
        
        # 生成节点配置
        cat > server/etc/node.properties << EOL
node.environment=production
node.id=$node_id
node.data-dir=/opt/presto/data
EOL

        # 生成JVM配置
        cat > server/etc/jvm.config << EOL
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-Djdk.attach.allowAttachSelf=true
EOL

        # 生成主配置文件
        if [ "$node_type" = "coordinator" ]; then
            cat > server/etc/config.properties << EOL
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-total-memory=100GB
query.max-memory-per-node=8GB
query.max-total-memory-per-node=16GB
discovery-server.enabled=true
discovery.uri=http://$COORDINATOR_IP:8080
EOL
        else
            cat > server/etc/config.properties << EOL
coordinator=false
http-server.http.port=8080
query.max-memory-per-node=8GB
query.max-total-memory-per-node=16GB
discovery.uri=http://$COORDINATOR_IP:8080
EOL
        fi
        
        # 生成日志配置
        cat > server/etc/log.properties << EOL
com.facebook.presto=INFO
EOL
        
        # 创建Hive连接器配置
        cat > server/etc/catalog/hive.properties << EOL
connector.name=hive-hadoop2
hive.metastore.uri=thrift://your-hive-metastore:9083
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
EOL
EOF
    
    echo "节点 $ip 部署完成"
}

# 部署Coordinator
deploy_node $COORDINATOR_IP "coordinator" "coordinator-1"

# 部署Worker节点
for i in "${!WORKER_IPS[@]}"; do
    worker_id=$((i + 1))
    deploy_node ${WORKER_IPS[$i]} "worker" "worker-$worker_id"
done

echo "集群部署完成!"

🔧 高级配置选项

⚡ 性能调优配置

查询优化配置:

# 启用基于成本的优化器
optimizer.join-reordering-strategy=COST_BASED
optimizer.join-distribution-type=AUTOMATIC

# 启用动态过滤
enable-dynamic-filtering=true
dynamic-filtering.max-per-driver-row-count=2000
dynamic-filtering.max-per-driver-size=100MB

# 查询资源限制
query.max-run-time=24h
query.max-execution-time=1h
query.max-planning-time=10m

内存管理配置:

# 内存池配置
memory.heap-headroom-per-node=2GB
query.max-memory=50GB
query.max-total-memory=100GB
query.max-memory-per-node=8GB
query.max-total-memory-per-node=16GB

# 溢出到磁盘配置
spill-enabled=true
spill-compression-enabled=true
spill-encryption-enabled=false
spiller-spill-path=/tmp/presto-spill
spiller-threads=4

🔐 安全配置

HTTPS配置:

http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/path/to/keystore.jks
http-server.https.keystore.key=keystore-password

认证配置:

http-server.authentication.type=PASSWORD
http-server.https.enabled=true
http-server.process-forwarded=true

📊 监控配置

JMX监控:

jmx.rmiregistry.port=9080
jmx.rmiserver.port=9081

事件监听器:

event-listener.name=event-logger
event-listener.log-file=/opt/presto/data/var/log/event.log

🐳 Docker容器化部署

📦 Dockerfile示例

FROM openjdk:11-jre-slim

# 安装必要工具
RUN apt-get update && apt-get install -y \
    curl \
    python \
    && rm -rf /var/lib/apt/lists/*

# 创建presto用户
RUN groupadd -r presto && useradd -r -g presto presto

# 设置工作目录
WORKDIR /opt/presto

# 下载并安装Presto
RUN curl -L https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.279/presto-server-0.279.tar.gz \
    | tar -xz --strip-components=1

# 创建配置目录
RUN mkdir -p etc/catalog data

# 复制配置文件
COPY config.properties etc/
COPY node.properties etc/
COPY jvm.config etc/
COPY log.properties etc/
COPY catalog/ etc/catalog/

# 设置权限
RUN chown -R presto:presto /opt/presto

# 切换用户
USER presto

# 暴露端口
EXPOSE 8080

# 启动命令
CMD ["bin/launcher", "run"]

🚀 Docker Compose部署

version: '3.8'

services:
  presto-coordinator:
    build: .
    hostname: presto-coordinator
    ports:
      - "8080:8080"
    volumes:
      - ./coordinator/config.properties:/opt/presto/etc/config.properties
      - ./coordinator/node.properties:/opt/presto/etc/node.properties
      - presto-data:/opt/presto/data
    environment:
      - JAVA_TOOL_OPTIONS=-Xmx8G
    networks:
      - presto-network

  presto-worker-1:
    build: .
    hostname: presto-worker-1
    volumes:
      - ./worker/config.properties:/opt/presto/etc/config.properties
      - ./worker/node.properties:/opt/presto/etc/node.properties
      - presto-data:/opt/presto/data
    environment:
      - JAVA_TOOL_OPTIONS=-Xmx8G
    depends_on:
      - presto-coordinator
    networks:
      - presto-network

  presto-worker-2:
    build: .
    hostname: presto-worker-2
    volumes:
      - ./worker/config.properties:/opt/presto/etc/config.properties
      - ./worker/node.properties:/opt/presto/etc/node.properties
      - presto-data:/opt/presto/data
    environment:
      - JAVA_TOOL_OPTIONS=-Xmx8G
    depends_on:
      - presto-coordinator
    networks:
      - presto-network

volumes:
  presto-data:

networks:
  presto-network:
    driver: bridge

🔧 故障排查指南

📋 常见问题诊断

1. 服务启动失败:

# 检查Java版本
java -version

# 检查端口占用
netstat -tlnp | grep 8080

# 查看启动日志
tail -f /opt/presto/data/var/log/server.log

# 检查配置文件语法
/opt/presto/server/bin/launcher --config-check

2. 内存不足错误:

# 查看系统内存
free -h

# 检查JVM配置
cat /opt/presto/server/etc/jvm.config

# 调整内存配置
# 修改jvm.config中的-Xmx参数

3. 连接器配置问题:

# 检查连接器配置
ls -la /opt/presto/server/etc/catalog/

# 验证Hive MetaStore连接
telnet your-hive-metastore 9083

# 检查HDFS配置文件路径
ls -la /etc/hadoop/conf/

🔄 服务管理脚本

#!/bin/bash
# presto-service.sh

PRESTO_HOME="/opt/presto/server"
PRESTO_USER="presto"

case "$1" in
    start)
        echo "启动Presto服务..."
        sudo -u $PRESTO_USER $PRESTO_HOME/bin/launcher start
        ;;
    stop)
        echo "停止Presto服务..."
        sudo -u $PRESTO_USER $PRESTO_HOME/bin/launcher stop
        ;;
    restart)
        echo "重启Presto服务..."
        sudo -u $PRESTO_USER $PRESTO_HOME/bin/launcher restart
        ;;
    status)
        echo "检查Presto服务状态..."
        sudo -u $PRESTO_USER $PRESTO_HOME/bin/launcher status
        ;;
    logs)
        echo "查看Presto日志..."
        tail -f /opt/presto/data/var/log/server.log
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status|logs}"
        exit 1
        ;;
esac

✅ 环境验证清单

🎯 单机环境验证

  • [ ] Java环境正确配置,版本11或以上
  • [ ] Presto服务成功启动,端口8080可访问
  • [ ] Web UI正常显示集群信息
  • [ ] CLI可以连接并执行基本查询
  • [ ] 内存连接器正常工作
  • [ ] 日志文件正常生成,无错误信息

🏢 集群环境验证

  • [ ] 所有节点Java环境一致
  • [ ] Coordinator节点正常启动
  • [ ] 所有Worker节点成功注册到Coordinator
  • [ ] Web UI显示所有节点状态为Active
  • [ ] 集群间网络连通性正常
  • [ ] 共享存储(HDFS/S3)连接正常
  • [ ] Hive MetaStore连接正常

🚀 性能基准测试

# 创建测试数据
presto> CREATE TABLE memory.default.test_table AS
SELECT rand() as col1, 'test_data_' || cast(rand() * 1000 as varchar) as col2
FROM (VALUES (1)) t(x) CROSS JOIN UNNEST(sequence(1, 1000000)) t2(y);

# 执行性能测试查询
presto> SELECT count(*) FROM memory.default.test_table;
presto> SELECT col2, count(*) FROM memory.default.test_table GROUP BY col2 LIMIT 10;

🔗 学习连接

📚 本节核心技能

  • 环境搭建:Java配置、Presto安装、配置文件管理
  • 单机部署:基础配置、连接器设置、服务启动
  • 集群部署:多节点架构、网络配置、负载分布
  • 高级配置:性能调优、安全设置、监控配置

🎯 下一步学习

环境就绪检查:

  • ✅ Presto服务是否正常运行?
  • ✅ Web UI是否可以正常访问?
  • ✅ CLI是否能够执行查询?

继续学习路径:


tip 💡 部署成功要点

🛠️ 环境搭建核心要素:

  • ☕ Java环境 - 正确的JDK版本是基础
  • ⚙️ 内存配置 - 合理的JVM参数设置
  • 🌐 网络连通 - 集群节点间通信畅通
  • 📋 配置管理 - 统一的配置文件管理

🚀 开始查询:环境搭建完成后,立即进入 第一个Presto查询 体验查询的强大功能!