天天看點

【大資料】通過 docker-compose 快速部署 Presto(Trino)

作者:大資料老司機

一、概述

Presto是一個快速的分布式查詢引擎,最初由Facebook開發,目前歸屬于 Presto Software Foundation(由 Facebook、Teradata 和其他公司共同支援)。Presto的核心特點是支援遠端資料通路,可以查詢包括Hadoop、Cassandra、Relational databases、NoSQL databases在内的多個資料源。Presto支援标準的SQL文法,同時提供了一些擴充功能,如分布式查詢、動态分區、自定義聚合和分析函數等。

但是Presto目前有兩大分支:PrestoDB(背靠Facebook)和 PrestoSQL現在改名為Trino(Presto的創始團隊),雖然PrestoDB背靠Facebook,但是社群活躍度和使用群體還是遠不如Trino。是以這裡以Trino為主展開講解。

關于更多的Presto介紹可以參考我這篇文章:大資料Hadoop之——基于記憶體型SQL查詢引擎Presto(Presto-Trino環境部署)

【大資料】通過 docker-compose 快速部署 Presto(Trino)

二、前期準備

1)部署 docker

# 安裝yum-config-manager配置工具
yum -y install yum-utils

# 建議使用阿裡雲yum源:(推薦)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安裝docker-ce版本
yum install -y docker-ce
# 啟動并開機啟動
systemctl enable --now docker
docker --version
           

2)部署 docker-compose

curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose --version
           

三、建立網絡

# 建立,注意不能使用hadoop_network,要不然啟動hs2服務的時候會有問題!!!
docker network create hadoop-network

# 檢視
docker network ls
           

四、Trino 編排部署

1)下載下傳 trino

官方下載下傳位址:https://trino.io/download.html

# trino server
wget https://repo1.maven.org/maven2/io/trino/trino-server/416/trino-server-416.tar.gz

# trino Command line client
wget https://repo1.maven.org/maven2/io/trino/trino-cli/416/trino-cli-416-executable.jar

# jdk
wget https://cdn.azul.com/zulu/bin/zulu20.30.11-ca-jdk20.0.1-linux_x64.tar.gz
           

2)配置

首先建立etc和data目錄,後面配置檔案需要用到

mkdir -p etc/{coordinator,worker} etc/catalog/ images
           

1、coordinator 配置

  • node.properties
cat << EOF > etc/coordinator/node.properties
# 環境的名字。叢集中所有的Trino節點必須具有相同的環境名稱。
node.environment=test
# 此Trino安裝的唯一辨別符。這對于每個節點都必須是唯一的。
node.id=trino-coordinator
# 資料目錄的位置(檔案系統路徑)。Trino在這裡存儲日志和其他資料。
node.data-dir=/opt/apache/trino/data
EOF
           
  • jvm.config
cat << EOF > etc/coordinator/jvm.config
-server
-Xmx2G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics
# Disable Preventive GC for performance reasons (JDK-8293861)
-XX:-G1UsePreventiveGC
EOF
           
  • config.properties
cat << EOF > etc/coordinator/config.properties
# 設定該節點為coordinator節點
coordinator=true
# 允許在協調器上排程工作,也就是coordinator節點又充當worker節點用
node-scheduler.include-coordinator=false
# 指定HTTP伺服器的端口。Trino使用HTTP進行内部和外部web的所有通信。
http-server.http.port=8080
# 查詢可以使用的最大分布式記憶體。【注意】不能配置超過jvm配置的最大堆棧記憶體大小
query.max-memory=1GB
# 查詢可以在任何一台機器上使用的最大使用者記憶體。【注意】也是不能配置超過jvm配置的最大堆棧記憶體大小
query.max-memory-per-node=1GB
# hadoop-node1也可以是IP
discovery.uri=http://localhost:8080
EOF
           
  • log.properties
cat << EOF > etc/coordinator/log.properties
# 設定日志級别,有四個級别:DEBUG, INFO, WARN and ERROR
io.trino=INFO
EOF
           

2、worker 配置

  • node.properties
cat << EOF > etc/worker/node.properties
# 環境的名字。叢集中所有的Trino節點必須具有相同的環境名稱。
node.environment=test
# 此Trino安裝的唯一辨別符。這對于每個節點都必須是唯一的。
# node.id=trino-worker
# 資料目錄的位置(檔案系統路徑)。Trino在這裡存儲日志和其他資料。
node.data-dir=/opt/apache/trino/data
EOF
           
  • jvm.config
cat << EOF > etc/worker/jvm.config
-server
-Xmx2G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics
# Disable Preventive GC for performance reasons (JDK-8293861)
-XX:-G1UsePreventiveGC
EOF
           
  • config.properties
cat << EOF > etc/worker/config.properties
# 設定該節點為worker節點
coordinator=false
# 指定HTTP伺服器的端口。Trino使用HTTP進行内部和外部web的所有通信。
http-server.http.port=8080
# 查詢可以使用的最大分布式記憶體。【注意】不能配置超過jvm配置的最大堆棧記憶體大小
query.max-memory=1GB
# 查詢可以在任何一台機器上使用的最大使用者記憶體。【注意】也是不能配置超過jvm配置的最大堆棧記憶體大小
query.max-memory-per-node=1GB
# hadoop-node1也可以是IP
discovery.uri=http://trino-coordinator:8080
EOF
           
  • log.properties
cat << EOF > etc/worker/log.properties
# 設定日志級别,有四個級别:DEBUG, INFO, WARN and ERROR
io.trino=INFO
EOF
           

3)啟動腳本 bootstrap.sh

#!/usr/bin/env sh

wait_for() {
    echo Waiting for $1 to listen on $2...
    while ! nc -z $1 $2; do echo waiting...; sleep 1s; done
}


start_trino() {

   node_type=$1

   if [ "$node_type" = "worker" ];then
      wait_for trino-coordinator 8080
   fi

   ${TRINO_HOME}/bin/launcher run --verbose

}

case $1 in
        trino-coordinator)
                start_trino coordinator
                ;;
        trino-worker)
                start_trino worker
                ;;
        *)
                echo "請輸入正确的服務啟動指令~"
        ;;
esac

           

4)建構鏡像 Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/centos:7.7.1908

RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone

RUN export LANG=zh_CN.UTF-8

# 建立使用者和使用者組,跟yaml編排裡的user: 10000:10000
RUN groupadd --system --gid=10000 hadoop && useradd --system --home-dir /home/hadoop --uid=10000 --gid=hadoop hadoop -m

# 安裝sudo
RUN yum -y install sudo ; chmod 640 /etc/sudoers

# 給hadoop添加sudo權限
RUN echo "hadoop ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

RUN yum -y install install net-tools telnet wget nc

RUN mkdir /opt/apache/

# 添加配置 JDK
ADD zulu20.30.11-ca-jdk20.0.1-linux_x64.tar.gz /opt/apache/
ENV JAVA_HOME /opt/apache/zulu20.30.11-ca-jdk20.0.1-linux_x64
ENV PATH $JAVA_HOME/bin:$PATH

# 添加配置 trino server
ENV TRINO_VERSION 416
ADD trino-server-${TRINO_VERSION}.tar.gz /opt/apache/
ENV TRINO_HOME /opt/apache/trino
RUN ln -s /opt/apache/trino-server-${TRINO_VERSION} $TRINO_HOME

# 建立配置目錄和資料源catalog目錄
RUN mkdir -p ${TRINO_HOME}/etc/catalog

# 添加配置 trino cli
COPY trino-cli-416-executable.jar $TRINO_HOME/bin/trino-cli

# copy bootstrap.sh
COPY bootstrap.sh /opt/apache/
RUN chmod +x /opt/apache/bootstrap.sh ${TRINO_HOME}/bin/trino-cli

RUN chown -R hadoop:hadoop /opt/apache

WORKDIR $TRINO_HOME
           

開始建構鏡像

docker build -t registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/trino:416 . --no-cache

# 為了友善小夥伴下載下傳即可使用,我這裡将鏡像檔案推送到阿裡雲的鏡像倉庫
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/trino:416

### 參數解釋
# -t:指定鏡像名稱
# . :目前目錄Dockerfile
# -f:指定Dockerfile路徑
#  --no-cache:不緩存
           

5)編排 docker-compose.yaml

version: '3'
services:
  trino-coordinator:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/trino:416
    user: "hadoop:hadoop"
    container_name: trino-coordinator
    hostname: trino-coordinator
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./etc/coordinator/config.properties:${TRINO_HOME}/etc/config.properties
      - ./etc/coordinator/jvm.config:${TRINO_HOME}/etc/jvm.config
      - ./etc/coordinator/log.properties:${TRINO_HOME}/etc/log.properties
      - ./etc/coordinator/node.properties:${TRINO_HOME}/etc/node.properties
      - ./etc/catalog/:${TRINO_HOME}/etc/catalog/
    ports:
      - "30080:${TRINO_SERVER_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh trino-coordinator"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "curl --fail http://localhost:${TRINO_SERVER_PORT}/v1/info || exit 1"]
      interval: 10s
      timeout: 20s
      retries: 3
  trino-worker:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/trino:416
    user: "hadoop:hadoop"
    restart: always
    privileged: true
    deploy:
      replicas: 3
    env_file:
      - .env
    volumes:
      - ./etc/worker/config.properties:${TRINO_HOME}/etc/config.properties
      - ./etc/worker/jvm.config:${TRINO_HOME}/etc/jvm.config
      - ./etc/worker/log.properties:${TRINO_HOME}/etc/log.properties
      - ./etc/worker/node.properties:${TRINO_HOME}/etc/node.properties
      - ./etc/catalog/:${TRINO_HOME}/etc/catalog/
    expose:
      - "${TRINO_SERVER_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh trino-worker"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "curl --fail http://localhost:${TRINO_SERVER_PORT}/v1/info || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3

# 連接配接外部網絡
networks:
  hadoop-network:
    external: true

           

.env 檔案内容如下:

cat << EOF > .env
TRINO_SERVER_PORT=8080
HADOOP_HDFS_DN_PORT=/opt/apache/trino
EOF
           

6)開始部署

docker-compose -f docker-compose.yaml up -d

# 檢視
docker-compose -f docker-compose.yaml ps
           
【大資料】通過 docker-compose 快速部署 Presto(Trino)

web 位址:http://ip:30080

【大資料】通過 docker-compose 快速部署 Presto(Trino)

五、簡單測試驗證

hive和mysql快熟部署文檔可參考我這篇文章:通過 docker-compose 快速部署 Hive 詳細教程

1)mysql 資料源

添加 mysql 資料源,在主控端上配置即可,因已經挂載了

cat << EOF > ./etc/catalog/mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://mysql:3306
connection-user=root
connection-password=123456
EOF
           

重新開機 trino

docker-compose -f docker-compose.yaml restart
           

測試驗證

# 登入容器
docker exec -it trino-coordinator bash
${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop 

# 檢視資料源
show catalogs;
# 檢視mysql庫
show schemas from mysql;
# 檢視表
show tables from mysql.hive_metastore;
# 檢視表資料
select * from mysql.hive_metastore.version;
           
【大資料】通過 docker-compose 快速部署 Presto(Trino)

2)hive 資料源

添加 hive 資料源,在主控端上配置即可,因已經挂載了

cat << EOF > etc/catalog/hive.properties
connector.name=hive
hive.metastore.uri=thrift://hive-metastore:9083
EOF
           

重新開機 trino

docker-compose -f docker-compose.yaml restart
           

測試驗證

# 登入容器
docker exec -it trino-coordinator bash
${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop 

# 檢視資料源
show catalogs;
# 檢視mysql庫
show schemas from hive;
# 檢視表
show tables from hive.default;
# 檢視表資料
select * from hive.default.student;
           
【大資料】通過 docker-compose 快速部署 Presto(Trino)

docker-compose 快速部署 Presto(Trino)保姆級教程就先到這裡了,有任何疑問可關注我的公衆号【大資料與雲原生技術分享】加群交流或私信咨詢問題,如這篇文章對你有所幫助,麻煩幫忙一鍵三連(點贊、轉發、加關注)哦~