DWH 3: Cài đặt Trino truy vấn dữ liệu trong Data warehouse

- 9 mins

Trong bài viết trước mình đã giới thiệu với các bạn một thiết kế và cài đặt Data Warehouse dựa trên nền tảng Hadoop và một số công nghệ Opensource, bạn có thể xem lại tại đây. Thiết kế này sử dụng Spark Thrift Server (STS) là một JDBC/ODBC server cho phép các ứng dụng BI có thể connect vào DWH để yêu cầu thực thi các truy vấn SQL. Tuy nhiên STS khi khởi chạy chỉ tạo ra ra 1 đối tượng Spark Context do đó tại mỗi thời điểm chỉ có 1 truy vấn có thể được thực thi. Để giải quyết vấn đề này thì mình sử dụng Trino làm query engine, nó giúp điều phối tài nguyên hợp lý hơn và chạy được nhiều truy vấn đồng thời.

Nội dung

  1. Giới thiệu tổng quan
  2. Cài đặt Hive Metastore (HMS)
  3. Cài đặt và cấu hình Trino trên 1 node
  4. Thêm node mới vào cụm Trino
  5. Kết luận

Giới thiệu tổng quan

Trino là một SQL query engine phân tán hiệu năng cao dùng cho các hoạt động phân tích dữ liệu lớn, có thể làm việc với rất nhiều datasource khác nhau thông qua các connector, từ đó cho phép việc truy vấn kết hợp nhiều datasource. Trino không phải là Database cũng không phải là Datawarehouse, nó không lưu trữ dữ liệu, nó chỉ cung cấp một giao diện SQL cho người dùng và các ứng dụng khác truy vấn dữ liệu trên các Datasource khác nhau bằng ngôn ngữ SQL. Trino được xây dựng để phù hợp với các tác vụ Online Analyst Processing (OLAP) thay vì Online Transaction Processing (OLTP).

Một số khái niệm trong Trino:

Trino là một query engine phân tán tức là nó có thể được cài đặt trên nhiều node và kết hợp cùng nhau thành 1 cụm (cluster). Cụm Trino cũng được thiết kế theo kiến trúc master-slaves, có một node làm master đóng vài trò quản lý, điều phối, lập lịch cho cả cụm và các node slave đóng vai trò thực thi các nhiệm vụ được giao bởi master. Các thành phần trong cụm Trino bao gồm:

Cài đặt Hive Metastore (HMS)

Trước khi bắt đầu thì mình sẽ giải thích một chút về lý do vì sao chúng ta lại cần HMS. Nếu các bạn còn nhớ, trong bài viết trước khi mình cài Data warehouse (bạn có thể xem lại tại đây) mình đã làm 2 việc:

Đây chính là 2 thành phần để tạo nên một Data warehouse là StorageMetadata. Trong đó Storage là nơi dữ liệu được lưu trữ còn Metadata là nơi lưu trữ các thông tin như các schema (database), các table, cấu trúc của table, loại table, nơi lưu trữ dữ liệu của table trong Storage… Chỉ cần có 2 thành phần này thì một query engine đã có thể truy vấn dữ liệu trong DWH, trong bài viết trước mình đã sử dụng Spark Thrift Server để làm query engine server, tuy nhiên cũng có thể thao tác với DWH bằng Spark SQL (xem thêm tại đây) hoặc trong một spark job (xem thêm tại đây)

Để truy vấn được data trong DWH thì Trino cần 1 service cung cấp các thông tin về Storage và Metadata, đây chính là việc mà HMS sẽ làm.

Lý thuyết thế thôi giờ chúng ta bắt tay vào cài đặt nhé, mình sẽ thực hiện trên cụm DWH đã có trong bài viết trước, bạn có thể xem lại tại đây. Đầu tiên chúng ta sẽ lên trang chủ của Hive để download phiên bản hive phù hợp tại đây, mình sử dụng phiên bản 2.3.9 do đây là phiên bản mà Spark Thrift Server của mình đang sử dụng.

Lưu ý: Muốn biết STS đang dùng Hive version nào bạn chạy job STS lên sau đó vào giao diện SparkUI của job, vào thẻ Environment và tìm cấu hình spark.sql.hive.version

$ wget https://dlcdn.apache.org/hive/hive-2.3.9/apache-hive-2.3.9-bin.tar.gz
$ tar -xvzf apache-hive-2.3.9-bin.tar.gz
$ mv apache-hive-2.3.9-bin /lib/hive
$ mkdir /lib/hive/logs
$ chgrp hadoop -R /lib/hive
$ chmod g+w -R /lib/hive

Bổ sung biến môi trường /etc/bash.bashrc

export HIVE_HOME=/lib/hive
export PATH=$HIVE_HOME/bin:$PATH

Cập nhật biến môi trường

$ source /etc/bash.bashrc

Copy cấu hình và thư viện từ Spark sang

$ cp $SPARK_HOME/conf/hive-site.xml $HIVE_HOME/conf/
$ cp $SPARK_HOME/jars/postgresql-42.5.1.jar $HIVE_HOME/lib/

Run HMS trên user hive

[hive]$ hive --service metastore &

Mặc định HMS sẽ được chạy trên port 9083 bạn có thể thay đổi nó bằng cấu hình hive.metastore.port trong file $HIVE_HOME/conf/hive-site.xml

Cài đặt và cấu hình Trino trên 1 node

Bạn lên trang chủ của Trino để tại đây tìm phiên bản phù hợp cho hệ thống, mình lựa chọn phiên bản Trino 389 do đây là phiên bản mới nhất còn hỗ trợ java 11.

Lưu ý: bạn có thể update java lên phiên bản mới nhất để sử dụng Trino latest version theo hướng dẫn tại đây

$ wget https://repo1.maven.org/maven2/io/trino/trino-server/389/trino-server-389.tar.gz
$ tar -xvzf trino-server-389.tar.gz
$ mv trino-server-389 /lib/trino
$ mkdir /lib/trino/logs
$ chgrp hadoop -R /lib/trino
$ chmod g+w -R /lib/trino

Bổ sung biến môi trường /etc/bash.bashrc

export TRINO_HOME=/lib/trino
export PATH=$TRINO_HOME/bin:$PATH

Cập nhật biến môi trường

$ source /etc/bash.bashrc

Tạo lần lượt các file cấu hình như sau:

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
discovery.uri=http://node01:8080
-server
-Xmx16G
-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
-Dfile.encoding=UTF-8
# Disable Preventive GC for performance reasons (JDK-8293861)
#-XX:-G1UsePreventiveGC  
# Reduce starvation of threads by GClocker, recommend to set about the number of cpu cores (JDK-8192647)
-XX:GCLockerRetryAllocationCount=32
io.trino=INFO
node.environment=production
node.id=node01
node.data-dir=/home/trino/data
connector.name=delta-lake
hive.metastore.uri=thrift://node1:9083
hive.metastore-cache.cache-partitions=false

Lưu ý: Ở đây mình sử dụng connector delta-lake để Trino có thể làm việc với Delta table

Cài đặt python

$ ln -s /usr/bin/python3 /usr/bin/python

Tạo user trino

$ useradd -g hadoop -m -s /bin/bash trino

Run Trino trên user trino

[trino]$ launcher start

Kiểm tra trạng thái của Trino

[trino]$ launcher status

Xem giao diện TrinoUI: http://node01:8080/ui/

Trino UI

Cài đặt Trino CLI

$ wget https://repo1.maven.org/maven2/io/trino/trino-cli/389/trino-cli-389-executable.jar
$ mv trino-cli-389-executable.jar $TRINO_HOME/bin/trino
$ chmod +x $TRINO_HOME/bin/trino
$ trino http://node01:8080/hive

Chạy một số lệnh trên Trino CLI

trino> show catalogs;
trino> show schemas;
trino> select * from ...

Tắt Trino

[trino]$ launcher stop

Thêm node mới vào cụm Trino

Để thêm node mới vào cụm Trino đang có, bạn lặp lại các bước ở trên và sửa lại 2 file cấu hình:

coordinator=false
http-server.http.port=8080
discovery.uri=http://node01:8080
node.environment=production
node.id=node02
node.data-dir=/home/trino/data

Kết luận

Trong bài viết này mình đã hướng dẫn cách cài đặt Trino làm query engine server để thay thế cho Spark Thrift Server, chúc các bạn thành công!