自动配置Presto查询引擎的脚本

wen 实用脚本 23

本文目录导读:

自动配置Presto查询引擎的脚本

  1. 基础自动配置脚本
  2. 使用示例
  3. 更高级的自动化脚本 (带交互式配置)
  4. 使用说明

基础自动配置脚本

#!/bin/bash
# Presto自动配置脚本
# 使用方法: ./configure_presto.sh [presto_home] [coordinator|worker]
set -e
# 默认值
PRESTO_HOME=${1:-"/opt/presto"}
NODE_TYPE=${2:-"coordinator"}
# 配置参数 - 根据您的环境修改
DISCOVERY_URI="http://localhost:8080"
HTTP_PORT=8080
NODE_ENVIRONMENT="production"
LOG_LEVEL="INFO"
MAX_MEMORY="8GB"
QUERY_MAX_MEMORY="4GB"
# 检查Presto目录是否存在
if [ ! -d "$PRESTO_HOME" ]; then
    echo "错误: Presto目录 $PRESTO_HOME 不存在"
    exit 1
fi
# 创建配置目录
CONFIG_DIR="$PRESTO_HOME/etc"
mkdir -p "$CONFIG_DIR"
mkdir -p "$CONFIG_DIR/catalog"
echo "正在配置Presto ($NODE_TYPE)..."
# 1. 配置 node.properties
cat > "$CONFIG_DIR/node.properties" << EOF
node.environment=$NODE_ENVIRONMENT
node.id=$(uuidgen)
node.data-dir=$PRESTO_HOME/data
EOF
# 2. 配置 jvm.config
cat > "$CONFIG_DIR/jvm.config" << EOF
-server
-Xmx$MAX_MEMORY
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
EOF
# 3. 配置 config.properties (根据节点类型)
if [ "$NODE_TYPE" == "coordinator" ]; then
    cat > "$CONFIG_DIR/config.properties" << EOF
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=$HTTP_PORT
query.max-memory=$QUERY_MAX_MEMORY
query.max-memory-per-node=$QUERY_MAX_MEMORY
discovery-server.enabled=true
discovery.uri=$DISCOVERY_URI
EOF
else
    cat > "$CONFIG_DIR/config.properties" << EOF
coordinator=false
http-server.http.port=$HTTP_PORT
query.max-memory=$QUERY_MAX_MEMORY
query.max-memory-per-node=$QUERY_MAX_MEMORY
discovery.uri=$DISCOVERY_URI
EOF
fi
# 4. 配置 log.properties
cat > "$CONFIG_DIR/log.properties" << EOF
io.prestosql=$LOG_LEVEL
EOF
# 5. 创建根目录数据目录
mkdir -p "$PRESTO_HOME/data"
# 6. 配置示例目录连接器
cat > "$CONFIG_DIR/catalog/tpch.properties" << EOF
connector.name=tpch
tpch.splits-per-node=4
EOF
# 7. 配置JMX连接器 (监控用)
cat > "$CONFIG_DIR/catalog/jmx.properties" << EOF
connector.name=jmx
EOF
echo "✅ Presto ($NODE_TYPE) 配置完成!"
echo "配置文件位置: $CONFIG_DIR"
echo ""
echo "启动命令:"
if [ "$NODE_TYPE" == "coordinator" ]; then
    echo "  $PRESTO_HOME/bin/launcher run"
else
    echo "  $PRESTO_HOME/bin/launcher run"
fi
# 显示配置内容
echo ""
echo "=== 配置摘要 ==="
echo "类型: $NODE_TYPE"
echo "端口: $HTTP_PORT"
echo "内存: $MAX_MEMORY (节点) / $QUERY_MAX_MEMORY (查询)"
echo "发现URI: $DISCOVERY_URI"

使用示例

# 保存脚本为 configure_presto.sh
chmod +x configure_presto.sh
# 配置协调节点
./configure_presto.sh /opt/presto coordinator
# 配置工作节点
./configure_presto.sh /opt/presto worker

更高级的自动化脚本 (带交互式配置)

#!/bin/bash
# 交互式Presto配置脚本
# 支持多种数据源和高级选项
set -e
PRESTO_HOME=${1:-"/opt/presto"}
echo "=== Presto 交互式配置工具 ==="
echo ""
# 检查目录
if [ ! -d "$PRESTO_HOME" ]; then
    read -p "Presto目录 $PRESTO_HOME 不存在,是否创建?(y/n): " CREATE_DIR
    if [ "$CREATE_DIR" == "y" ]; then
        mkdir -p "$PRESTO_HOME"
        echo "目录已创建"
    else
        exit 1
    fi
fi
# 节点类型
echo "选择节点类型:"
echo "1) 协调节点 (Coordinator)"
echo "2) 工作节点 (Worker)"
read -p "选择 (1-2): " NODE_CHOICE
case $NODE_CHOICE in
    1) NODE_TYPE="coordinator" ;;
    2) NODE_TYPE="worker" ;;
    *) echo "无效选择"; exit 1 ;;
esac
# 基本配置
read -p "HTTP端口 [8080]: " HTTP_PORT
HTTP_PORT=${HTTP_PORT:-8080}
read -p "节点内存 (8GB) [8GB]: " MAX_MEMORY
MAX_MEMORY=${MAX_MEMORY:-"8GB"}
read -p "查询最大内存 (4GB) [4GB]: " QUERY_MAX_MEMORY
QUERY_MAX_MEMORY=${QUERY_MAX_MEMORY:-"4GB"}
# 协调节点
if [ "$NODE_TYPE" == "coordinator" ]; then
    DISCOVERY_URI="http://localhost:$HTTP_PORT"
else
    read -p "协调节点地址 (http://coordinator:8080): " DISCOVERY_URI
fi
# 数据源配置
echo ""
echo "选择要配置的数据源 (多个用空格分隔, 'mysql postgresql hive'):"
echo "可选: mysql postgresql hive kafka redis elasticsearch"
read -p "数据源: " DATA_SOURCES
# 执行配置
configure_presto() {
    CONFIG_DIR="$PRESTO_HOME/etc"
    mkdir -p "$CONFIG_DIR"
    mkdir -p "$CONFIG_DIR/catalog"
    # node.properties
    cat > "$CONFIG_DIR/node.properties" << EOF
node.environment=production
node.id=$(uuidgen)
node.data-dir=$PRESTO_HOME/data
EOF
    # jvm.config
    cat > "$CONFIG_DIR/jvm.config" << EOF
-server
-Xmx$MAX_MEMORY
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
EOF
    # config.properties
    if [ "$NODE_TYPE" == "coordinator" ]; then
        cat > "$CONFIG_DIR/config.properties" << EOF
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=$HTTP_PORT
query.max-memory=$QUERY_MAX_MEMORY
query.max-memory-per-node=$QUERY_MAX_MEMORY
discovery-server.enabled=true
discovery.uri=$DISCOVERY_URI
EOF
    else
        cat > "$CONFIG_DIR/config.properties" << EOF
coordinator=false
http-server.http.port=$HTTP_PORT
query.max-memory=$QUERY_MAX_MEMORY
query.max-memory-per-node=$QUERY_MAX_MEMORY
discovery.uri=$DISCOVERY_URI
EOF
    fi
    # log.properties
    cat > "$CONFIG_DIR/log.properties" << EOF
io.prestosql=INFO
EOF
    # 数据源配置
    for source in $DATA_SOURCES; do
        case $source in
            mysql)
                read -p "MySQL主机: " MYSQL_HOST
                read -p "MySQL端口 [3306]: " MYSQL_PORT
                MYSQL_PORT=${MYSQL_PORT:-3306}
                read -p "MySQL用户名: " MYSQL_USER
                read -s -p "MySQL密码: " MYSQL_PASS
                echo ""
                cat > "$CONFIG_DIR/catalog/mysql.properties" << EOF
connector.name=mysql
connection-url=jdbc:mysql://$MYSQL_HOST:$MYSQL_PORT
connection-user=$MYSQL_USER
connection-password=$MYSQL_PASS
EOF
                ;;
            postgresql)
                read -p "PostgreSQL主机: " PG_HOST
                read -p "PostgreSQL端口 [5432]: " PG_PORT
                PG_PORT=${PG_PORT:-5432}
                read -p "PostgreSQL用户名: " PG_USER
                read -s -p "PostgreSQL密码: " PG_PASS
                echo ""
                cat > "$CONFIG_DIR/catalog/postgresql.properties" << EOF
connector.name=postgresql
connection-url=jdbc:postgresql://$PG_HOST:$PG_PORT
connection-user=$PG_USER
connection-password=$PG_PASS
EOF
                ;;
            hive)
                read -p "Hive Metastore URI (thrift://host:9083): " HIVE_URI
                cat > "$CONFIG_DIR/catalog/hive.properties" << EOF
connector.name=hive-hadoop2
hive.metastore.uri=$HIVE_URI
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
EOF
                ;;
            kafka)
                read -p "Kafka节点 (host:port): " KAFKA_NODES
                cat > "$CONFIG_DIR/catalog/kafka.properties" << EOF
connector.name=kafka
kafka.nodes=$KAFKA_NODES
kafka.table-names=
EOF
                ;;
            *)
                echo "未知数据源: $source"
                ;;
        esac
    done
    # 始终配置TPC-H和JMX
    cat > "$CONFIG_DIR/catalog/tpch.properties" << EOF
connector.name=tpch
tpch.splits-per-node=4
EOF
    cat > "$CONFIG_DIR/catalog/jmx.properties" << EOF
connector.name=jmx
EOF
    # 创建数据目录
    mkdir -p "$PRESTO_HOME/data"
}
configure_presto
echo ""
echo "✅ 配置完成!"
echo "配置文件位置: $PRESTO_HOME/etc"
echo ""
echo "启动命令:"
echo "$PRESTO_HOME/bin/launcher run"

使用说明

快速配置

# 下载并解压Presto
wget https://repo1.maven.org/maven2/io/prestosql/presto-server/350/presto-server-350.tar.gz
tar -xzf presto-server-350.tar.gz -C /opt/
# 运行配置脚本
chmod +x configure_presto.sh
sudo ./configure_presto.sh /opt/presto-server-350 coordinator
# 启动Presto
/opt/presto-server-350/bin/launcher run

集群配置

  1. 协调节点: 运行 ./configure_presto.sh /opt/presto coordinator
  2. 工作节点: 运行 ./configure_presto.sh /opt/presto worker
    • 确保 DISCOVERY_URI 指向协调节点的地址

注意事项

  • 需要安装Java 8或11
  • 确保端口未被占用
  • 生产环境中调整内存和并发参数
  • 使用 launcher start 后台启动

这个脚本会自动创建所有必要的配置文件和目录,大大简化了Presto的部署过程。

抱歉,评论功能暂时关闭!