Presto 安装和简单使用

0. 集群工具脚本

ccmd.sh 集群命令执行

cd && cat > ccmd.sh << 'EOF'
#!/bin/bash
if((0==$#)); then
  echo no args;
  echo "Usage: $0 cmd1; cmd2; cmd3"  # 多个命令用分号隔开
  exit;
fi

# cd -P 透过软连接获取绝对路径
pdir=`cd -P . ; pwd`

# 修改seq 范围以覆盖更多节点
for i in $(seq 102 105); do
  host="hadoop$i"
  # 对于本机的命令最后再执行
  if [ $host = $(hostname) ]; then continue; fi
  echo -e "====================\t\t$host\t\t===================="
  echo -e "$pdir    $*"
  ssh $host "cd $pdir ; $*"
done
# 最后执行本机的命令
echo -e "====================\t\t$(hostname)\t\t===================="
echo -e "$pdir    $*"
ssh $(hostname) "cd $pdir ; $*"
EOF

# 赋予脚本执行权限
chmod +x ccmd.sh
# 移到随时可以调用的目录
sudo mv ccmd.sh /usr/local/bin/

xsync.sh 集群文件同步

cd && cat > xsync.sh << 'EOF'
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
  echo no args;
  exit;
fi

#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 获取当前用户名称
user=`whoami`

#5 循环分发,跳过本机,一般是102~104 做集群
for((host=102; host<105; host++)); do
  echo ------------------- hadoop$host ----------------
  if [ hadoop$host != $(hostname) ]; then
    rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
  fi
done
EOF

# 赋予脚本执行权限
chmod +x xsync.sh
# 移到随时可以调用的目录
sudo mv xsync.sh /usr/local/bin/

1. Presto 下载安装

官网地址:https://prestodb.github.io/

# 1. 下载Presto
cd && wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.196/presto-server-0.196.tar.gz

# 2. 解压Presto
cd && tar -xf presto-server-0.196.tar.gz -C /opt/modules
cd /opt/modules && mv presto-server-0.196 presto-0.196

# 3. 创建文件夹保存数据和配置
mkdir -p /opt/modules/presto-0.196/{data,etc/catalog}

# 4. 创建JVM 配置文件
cat > /opt/modules/presto-0.196/etc/jvm.config << 'EOF'
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
EOF

# 5. 创建Presto 的数据源Catalog
cat > /opt/modules/presto-0.196/etc/catalog/hive.properties << 'EOF'
# hive-hadoop2 是Presto 的数据源类型
connector.name=hive-hadoop2
# 指定Hive 的metastore 服务地址
hive.metastore.uri=thrift://hadoop113:9083
EOF

# 6. 创建节点属性配置文件
## 每个节点的id 都不一样,后面分发完再修改
cat > /opt/modules/presto-0.196/etc/node.properties << 'EOF'
node.id=xxxx
node.environment=production
node.data-dir=/opt/modules/presto-0.196/data
EOF

# 7. 创建coordinator 配置
cat > /opt/modules/presto-0.196/etc/config.properties.co << 'EOF'
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery-server.enabled=true
discovery.uri=http://hadoop112:8881
EOF

# 8. 创建worker 配置
cat > /opt/modules/presto-0.196/etc/config.properties.wo << 'EOF'
coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery.uri=http://hadoop112:8881
EOF

# 9. 复制lzo 压缩支持包,重要!!!
## 注意!放到hive-hadoop2 目录下,这是数据源类型,否则HDFS 中用lzo 压缩的文件无法读取
cp /opt/modules/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar /opt/modules/presto-0.196/plugin/hive-hadoop2/
## 另外,Presto 不能直接读取纯lzo 文件,但可以读取parquet 存储的lzo 文件,当然orc 存储的也可以
## 据说Presto 对orc 这种列式存储进行了优化,推荐使用orc+lzo 的方式存储数据

# 10. 分发Presto 程序到集群其他节点
xsync.sh /opt/modules/presto-0.196

# 11. 修改集群中各Presto 节点ID 为该节点的主机名
ccmd.sh 'sed -i "/node.id/d; 1 i node.id=$(hostname)" /opt/modules/presto-0.196/etc/node.properties'

# 12. 指定Presto 的coordinator
ssh hadoop112 'cd /opt/modules/presto-0.196/etc &&
               cp config.properties.co config.properties'

# 13. 指定Presto 的worker
for host in hadoop113 hadoop114; do
  ssh $host 'cd /opt/modules/presto-0.196/etc &&
             cp config.properties.wo config.properties' 
done

2. Presto 集群启停

# 0. 启动Hive MetaStore 服务
## 这里以Hive 装在hadoop113 为例
ssh hadoop113 'nohup /opt/modules/hive-2.3.6/bin/hive --service metastore &> /opt/modules/hive-2.3.6/log/metasotre.log &'

# 1. 启动Presto 集群
## /opt/modules/presto-0.196/bin/launcher run  # 为前台运行,可查看日志
ccmd.sh '/opt/modules/presto-0.196/bin/launcher start'
## 日志目录,/opt/modules/presto-0.196/data/var/log

# 2. 停止Presto 集群
ccmd.sh '/opt/modules/presto-0.196/bin/launcher stop'

3. Presto 集群脚本

# 指定Presto 版本
_VERSION=0.196

# 创建Presto 脚本
cd && cat > presto.sh << EOF
#!/bin/bash

_usage="Usage: \$0 <start|stop|status|restart>"
if [ \$# -lt 1 ]; then echo "\$_usage"; exit 1; fi

for host in hadoop112 hadoop113 hadoop114; do
  echo "================ \$host ===================="
  ssh \$host "cd /opt/modules/presto-$_VERSION && bin/launcher \$1"
done
EOF

# 赋予脚本执行权限x
cd && chmod +x presto.sh

# 使用样例
./presto.sh start   # 启动Presto
./presto.sh stop    # 停止Presto
./presto.sh status  # 查看Presto

4. Presto 简单使用

Presto CLI

安装Presto CLI
# 1. 下载Presto 客户端
cd && wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.196/presto-cli-0.196-executable.jar

# 2. 给客户端程序赋权
mv presto-cli-0.196-executable.jar prestocli.jar && chmod +x $_

# 3. 启动Presto 客户端
## 连上Presto 的coordinator
./prestocli --server hadoop112:8881 --catalog hive --schema default
使用Presto CLI
-- 0. 显示当前有多少schema
show schemas;

-- 1. 切换schema 即数据库
use gmall;

-- 2. 显示当前数据库的表
show tables;

-- 3. 查询表数据
select * from dwd_fact_cart_info;
-- 或者用schema.tablename
select * from gmall.dwd_fact_cart_info;
-- 注意!查询结果按q 键退出,按/ 键还可以查询

-- 4. 退出客户端
quit
-- 或者
exit

Presto Web

编译yanagishima

最好专门准备一台编译用的机器

# 0. 安装编译相关工具
## 注意各个软件的具体版本
## 0.1 JDK 8 java version "1.8.0_241"
## 0.2 编译工具,Ubuntu 14.04.6
sudo apt install git gcc g++ make unzip build-essential -y
## 0.3 NodeJS 8.16.2
wget https://nodejs.org/dist/v8.16.2/node-v8.16.2-linux-x64.tar.gz -P /tmp
cd /tmp && tar -xf node-v8.16.2-linux-x64.tar.gz && rm node-v8.16.2-linux-x64.tar.gz
export PATH=$PATH:/tmp/node-v8.16.2-linux-x64/bin
node -v  # 查看nodejs 版本,v8.16.2

# 1. 下载yanagishima 源码
wget https://github.com/yanagishima/yanagishima/archive/18.0.zip -P /tmp

# 2. 解压yanagishima 源码
unzip /tmp/18.0.zip -d /tmp

# 3. 编译yanagishima 源码
cd /tmp/yanagishima-18.0 && ./gradlew clean && ./gradlew distZip

# 4. 上传yanagishima 编译好的程序
cd build/distributions && sftp hadoop112 <<< 'put yanagishima-18.0.zip'
安装yanagishima
# 0. 安装unzip
sudo apt install unzip -y

# 1. 解压yanagishima
cd && unzip yanagishima-18.0.zip -d /opt/modules
## 添加lzo 压缩支持
cp /opt/modules/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar /opt/modules/yanagishima-18.0/lib/

# 2. 配置yanagishima
## 2.1 备份配置文件
cd /opt/modules/yanagishima-18.0/conf && \
[ -f yanagishima.properties.bak ] || \
cp yanagishima.properties yanagishima.properties.bak
## 2.2 还原配置文件
cd /opt/modules/yanagishima-18.0/conf && \
cp yanagishima.properties.bak yanagishima.properties
## 2.3 追加配置内容
cat >> /opt/modules/yanagishima-18.0/conf/yanagishima.properties << 'EOF'

# === 追加内容如下 ===
jetty.port=7080
presto.datasources=atguigu-presto
presto.coordinator.server.atguigu-presto=http://hadoop112:8881
catalog.atguigu-presto=hive
schema.atguigu-presto=default
sql.query.engines=presto
EOF
使用yanagishima
# 3. 启动yanagishima
## 将所有日志信息都放到y.log 中,&> 表stdout 和stderr 两种输出
cd /opt/modules/yanagishima-18.0 && bin/yanagishima-start.sh &> y.log

# 4. 访问yanagishima
## 浏览器,http://hadoop112:7080/
## 注意!查询语句不能以分号; 结束

# 5. 停止yanagishima
cd /opt/modules/yanagishima-18.0 && bin/yanagishima-shutdown.sh