پرش به مطلب اصلی

کوئری انجین

سرویس Query Engine امکان اجرای کوئری‌های SQL را به‌شکل مستقیم روی داده‌های ذخیره‌شده در فضای ابری فراهم می‌کند، بدون آن‌که نیاز به ایجاد یا نگه‌داری یک پایگاه‌داده‌ی تحلیلی جداگانه وجود داشته باشد. این سرویس بر بستر Trino توسعه داده شده است و به‌طور اختصاصی در حساب کاربری شما در کانتینر ابری ایجاد می‌شود. ارتباط سرویس با داده‌ها از طریق Data Catalog انجام می‌شود؛ بنابراین نیازی به انجام عملیات ETL یا جابه‌جایی داده وجود ندارد.

در بسیاری از سازمان‌ها، داده‌های تحلیلی در قالب فایل‌هایی مانند Parquet یا CSV در Object Storage نگه‌داری می‌شوند. این روش ذخیره‌سازی مزایایی دارد، اما اجرای کوئری‌های تحلیلی روی این داده‌ها بدون زیرساخت مناسب می‌تواند با مشکلات زیر همراه باشد:

  • اجرای کوئری‌های تحلیلی نیازمند ایجاد یا نگه‌داری دیتابیس تحلیلی جداگانه است
  • جابه‌جایی داده‌ها به موتورهای تحلیلی زمان‌بر و هزینه‌بر است
  • تیم‌های Data Science و تحلیل‌گران نیاز به دسترسی Self-Service دارند
  • دسترسی مستقیم به داده‌های خام می‌تواند ریسک امنیتی ایجاد کند

در نتیجه، سازمان‌ها به ابزاری نیاز دارند که بتوانند اجرای کوئری‌های تحلیلی را بدون نیاز به کپی‌ داده یا ETL و با کنترل دسترسی ممکن کند، تا تحلیل و دسترسی امن به داده‌ها به‌شکل هم‌زمان فراهم شود.

قابلیت‌ها

کوئری انجین به‌گونه‌ای طراحی شده است که قابلیت تحلیل لحظه‌ای، اتصال ابزارهای تحلیل و BI و دسترسی کنترل‌شده به داده‌ها را فراهم می‌کند، بدون این‌که تیم‌های داده نیازمند ساخت و مدیریت زیرساخت مجزا باشند.

از ویژگی‌های اصلی کوئری انجین می‌توان به موارد زیر اشاره کرد:

  • اجرای مستقیم کوئری روی Object Storage: بدون ETL، بدون جابه‌جایی داده

  • پشتیبانی از Iceberg: قابلیت‌هایی مانند Snapshot ،Time-Travel ،Partition Evolution و...

  • استاندارد و سازگار: Trino CLI ،JDBC ،ODBC و ابزارهای BI

  • یکپارچه با Data Catalog: کشف خودکار جداول و اسکیمای ذخیره‌شده

  • امنیت بالا: ایجاد و مدیریت هر انجین در حساب کاربر

به‌کمک این ویژگی‌ها در سناریوهای تحلیلی، کاربران می‌توانند ابزارهای BI خود را به‌طور مستقیم به Query Engine متصل و داشبوردهای تحلیلی را روی داده‌های ذخیره‌شده ایجاد کنند. هم‌چنین تیم‌های Data Science این امکان را دارند بدون کپی‌ داده و تنها با استفاده از منابع تعریف‌شده برای Engine، تحلیل‌های Ad-hoc انجام دهند.

راه‌اندازی کوئری انجین

برای استفاده از Query Engine ابتدا باید در فضای ابری آروان‌کلاد یک Data Catalog ایجاد کنید. راهنمای دیتا کاتالوگ به شما در این مسیر کمک می‌کند.

پس از ساخت دیتا کاتالوگ، از منوی فضای ابری وارد «کوئری انجین‌ها» شوید.

با کلیک روی دکمه‌ی ساخت کوئری انجین و در صفحه‌ای که باز می‌شود، جزییات زیر را وارد کنید:

  • نام کوئری انجین: یک نام دل‌خواه شامل حروف کوچک انگلیسی، عدد و - انتخاب کنید.

  • منابع پردازشی: مقدار پردازنده و رم مورد نیازتان را مشخص کنید.

    براساس نیازمندی‌های سرویس، میزان دیسک و حافظه‌ی موقت به‌شکل سیستمی تعیین شده است و امکان تغییر آن وجود ندارد.

    این منابع در حساب کاربری شما و در بخش «کانتینر ابری» ایجاد می‌شود.

    توجه داشته باشید که محدودیت منابع برای ایجاد انجین براساس حساب کاربری شماست. اگر نیاز به منابع بالاتری دارید باید از بخش مدیریت کوتا در تنظیمات پروفایل درخواست افزایش را ثبت کنید.

  • دیتا کاتالوگ: در این بخش دیتا کاتالوگی که از پیش ساخته‌اید را برای اتصال به کوئری انجین انتخاب کنید. در همین بخش نیز می‌توانید دیتا کاتالوگ جدیدی بسازید.
  • تنظیمات اتصال: یک نام کاربری root به‌شکل پیش‌فرض برایتان ساخته شده است. برای آن یک رمز عبور با ۱۰ کاراکتر وارد کنید.

در پایان روی ساخت کوئری انجین کلیک کنید.

پس از تکمیل فرآیند ساخت، روی نام کوئری انجین کلیک کنید و از تب «جزییات اتصال» مقادیر لازم برای پیکربندی کلاینت خود را بردارید.

هم‌چنین با توجه به نیازتان و منابع مورد استفاده می‌توانید دیتاکاتالوگ‌های بیش‌تری را به یک انجین متصل و داده‌های متفاوتی را مدیریت کنید.

برای اتصال به Query Engine از طریق نام کاربری و رمز عبور، باید ارتباط به‌شکل TLS برقرار شود. هنگام ساخت انجین، یک گواهی Self-Signed به‌طور پیش‌فرض روی Host ایجاد می‌شود؛ اما از آن‌جایی که این گواهی برای برخی کلاینت‌ها معتبر نیست، برای تست اولیه معمولن باید از گزینه‌هایی نظیر insecure-- استفاده کنید.

برای اتصال امن در محیط عملیاتی، توصیه می‌شود روی دامنه‌ی سازمان خود یک DNS Record ایجاد کنید و مقدار آن را برابر IP انجین قرار دهید و سپس دسترسی را فقط از طریق HTTPS اجباری کنید. در این حالت، کلاینت‌ها می‌توانند با استفاده از نام دامنه به سرویس متصل شوند و ارتباط، به‌طور معتبر و امن برقرار خواهد شد.

راهنمای افزودن رکورد‌های DNS و تنظمیات HTTPS به شما در این مسیر کمک می‌کند.

اتصال به کوئری انجین

روش‌های مختلفی برای ارتباط با Query Engine در فضای ابری آروان‌کلاد پشتیبانی می‌شود:

  • Trino CLI: با پشتیبانی کامل از اجرای دستورهای SQL
  • JDBC / ODBC: مناسب برای ابزارهای BI از جمله Power BI ،Tableau ،Superset و DBeaver
  • Golang SDK: برای توسعه سرویس‌ها و Notebookها

اتصال از طریق JDBC

مناسب برای ابزارهای Power BI ،Tableau و Superset

نمونه URL:

jdbc:trino://<engine-host>:443/catalog/<catalog>/schema/<schema>;
user=<username>;
password=<password>;
SSL=true;

اتصال از طریق ODBC

مناسب برای ابزارهای Power BI Desktop و Excel

نمونه تنظیمات:

Driver: Trino ODBC Driver
Host: <engine-host>
Port: 443
Authentication: Username + password
SSL: Enabled

اتصال از طریق Golang SDK

نمونه کد:

import (
"context"
"crypto/tls"
"database/sql"
"fmt"
"log"
"net/http"
"strings"
"time"

"github.com/trinodb/trino-go-client/trino"
_ "github.com/trinodb/trino-go-client/trino"
)

func main() {
// Trino connection configuration
host := "Trino-server-address"
username := "Username" // Replace with your Trino username
password := "Password" // Replace with your Trino password
catalogName := "Your-catalog-name"
tableName := "myTable"
schemaName := "mySchema"
fullTablePath := fmt.Sprintf("%v.%v.%v", catalogName, schemaName, tableName)

// Create a Config struct
customClient := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // WARNING: Skips server cert verification (dev only)
MinVersion: tls.VersionTLS13,
},
},
}

// Register the custom client with the Trino driver
trino.RegisterCustomClient("trino_client", customClient)

// Configure Trino connection
config := &trino.Config{
ServerURI: fmt.Sprintf("https://%v:%v@%v", username, password, host),
Catalog: catalogName,
Source: "go-client",
CustomClientName: "trino_client", // Reference the custom client
}

// Format the DSN
dsn, err := config.FormatDSN()
if err != nil {
log.Fatalf("Failed to format DSN: %v", err)
}

// Open a connection to Trino
db, err := sql.Open("trino", dsn)
if err != nil {
log.Fatalf("Failed to open connection: %v", err)
}
defer db.Close()

ctx := context.Background()

// Test the connection
err = db.PingContext(ctx)
if err != nil {
log.Fatalf("Failed to connect to Trino server: %v", err)
}
fmt.Println("Successfully connected to Trino server")

// Example query to verify the catalog
query := "SHOW CATALOGS"
rows, err := db.QueryContext(ctx, query)
if err != nil {
log.Fatalf("Failed to query catalogs: %v", err)
}
defer rows.Close()

// Print the list of catalogs
fmt.Println("Available catalogs:")
for rows.Next() {
var catalog string
if err := rows.Scan(&catalog); err != nil {
log.Fatalf("Failed to scan row: %v", err)
}
fmt.Println(catalog)
}

if err := rows.Err(); err != nil {
log.Fatalf("Error iterating rows: %v", err)
}

// Execute SQL statements one by one
sqlStatements := []string{
fmt.Sprintf("SHOW SCHEMAS FROM %s", catalogName),
fmt.Sprintf("CREATE SCHEMA %s.%s", catalogName, schemaName),
fmt.Sprintf("CREATE TABLE %s ( id INTEGER, name VARCHAR, created_at TIMESTAMP )", fullTablePath),
fmt.Sprintf("INSERT INTO %s (id, name, created_at) VALUES (1, 'John Doe', CAST('2025-04-26 09:06:04' AS TIMESTAMP))", fullTablePath),
fmt.Sprintf("SELECT * FROM %s LIMIT 10", fullTablePath),
}

for _, sql := range sqlStatements {
rows, err := db.QueryContext(ctx, sql)
if err != nil {
log.Fatalf("Failed to execute query %q: %v", sql, err)
}
defer rows.Close()

// Print results for SELECT query
if strings.HasPrefix(strings.TrimSpace(sql), "SELECT") {
fmt.Println("\nQuery results:")
for rows.Next() {
var id int
var name string
var createdAt time.Time
if err := rows.Scan(&id, &name, &createdAt); err != nil {
log.Fatalf("Failed to scan row: %v", err)
}
fmt.Printf("ID: %d, Name: %s, Created At: %v\n", id, name, createdAt)
}
}

if err := rows.Err(); err != nil {
log.Fatalf("Error iterating rows: %v", err)
}
}

}

اتصال با DBeaver

DBeaver یک ابزار گرافیکی برای ارتباط با دیتابیس‌ها و اجرای کوئری است که علاوه‌بر دیتابیس‌های سنتی مانند PostgreSQL و MySQL، از موتورهای تحلیلی سازگار با JDBC و Trino نیز پشتیبانی می‌کند. با استفاده از این ابزار می‌توانید بدون نیاز به خط فرمان، کوئری‌ها را اجرا کرده و نتیجه را مشاهده کنید.

پس از نصب آخرین نسخه این نرم‌افزار، روی New Database Connection کلیک و از لیست Trino را انتخاب کنید.

سپس جزییات اتصال‌تان را وارد کنید.

  • مقدار Host را برابر دامنه یا IP انجین قرار دهید.
  • پورت را ۴۴۳ وارد کنید.

اگر هنوز از دامنه‌ای با گواهینامه‌ی معتبر استفاده نمی‌کنید باید در بخش Driver Properties گزینه‌ی SSLVerification را NONE تنظیم کنید تا اتصال برقرار شود.

پیش از نهایی‌ کردن تنظیمات، با کلیک روی Test Connection صحت اتصال را بررسی کنید.

اکنون محیط Query آماده‌ی استفاده است.