本文目录导读:

基础自动配置脚本
#!/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
集群配置
- 协调节点: 运行
./configure_presto.sh /opt/presto coordinator - 工作节点: 运行
./configure_presto.sh /opt/presto worker- 确保
DISCOVERY_URI指向协调节点的地址
- 确保
注意事项
- 需要安装Java 8或11
- 确保端口未被占用
- 生产环境中调整内存和并发参数
- 使用
launcher start后台启动
这个脚本会自动创建所有必要的配置文件和目录,大大简化了Presto的部署过程。