IBM Cloud Docs
Presto 서버에 연결

Presto 서버에 연결

Presto CLI는 터미널 기반 대화형 셸을 제공하여 쿼리를 실행할 수 있습니다.

IBM® watsonx.data 사용 중인 플랫폼과 유틸리티에 따라 여러 가지 방법으로 Presto 서버에 연결할 수 있습니다. 자세한 내용은 다음 섹션을 참조하세요:

CLI를 사용하여 스키마를 작성할 때 위치를 지정해야 합니다. 예를 들면 다음과 같습니다. location = s3a://<storage-name>/

전제조건

Presto 엔진 호스트 이름 및 포트 세부 정보 가져오기

  1. watsonx.data 웹 콘솔에 로그인합니다.

  2. 인프라 관리자 로 이동하여 목록 보기를 클릭하십시오.

  3. 엔진 탭에서 호스트 이름 및 포트 세부사항이 필요한 엔진 이름을 클릭하십시오.

  4. 호스트 레이블 아래에서 클립보드에 복사 아이콘을 클릭하여 호스트 세부사항을 복사하십시오.

  5. 호스트 세부사항을 메모장에 복사하십시오.

IBM API키 또는 IBM IAM 토큰 가져오기

요구사항에 따라 IBM API키 또는 IBM IAM 토큰을 사용하십시오.

스트레스 워크로드에 IAM 토큰을 사용하는 것이 좋습니다.

IBM API 키 가져오기

External Identity Interactions Limited 기능을 활성화하고 API 키를 사용하여 watsonx.data 과 통신하는 경우 watsonx.data 이 프로비저닝된 계정에서 API 키를 생성해야 합니다.

  1. IBM Cloud 콘솔에 로그인합니다.

  2. 탐색줄에서 관리 를 클릭하고 액세스 (IAM) 를 선택하십시오.

  3. 왼쪽 탐색 모음에서 API 키를 클릭합니다.

  4. **작성 +**를 클릭하십시오.

  5. IBM Cloud API키 작성 창에서 API키의 이름을 입력하고 키에 대한 적절한 설명을 입력하십시오. 예: ibmlhtoken testing

  6. 작성을 클릭하십시오. API키가 작성되었습니다 라는 메시지가 있는 창이 표시됩니다.

  7. 다운로드를 클릭하여 API 키를 로컬 컴퓨터에 저장합니다.

  8. 다운로드된 파일을 열고 API키를 메모장 파일에 복사하십시오.

IBM Access Management (IAM) 토큰 가져오기

  1. IAM에서 REST 엔드포인트를 호출하여 IAM 토큰을 가져오십시오.

  2. <your-api-key> 을 IBM API 키로 바꿉니다.

    curl -X POST 'https://iam.cloud.ibm.com/identity/token' -H 'Content-Type: application/x-www-form-urlencoded' -d 'grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=MY_APIKEY'
    

Presto 엔진에 연결하기 Presto CLI (원격)

  1. 다음에서 Presto 실행 파일( jar )을 다운로드하세요 https://prestodb.io/getting-started/

  2. 다운로드한 파일의 이름을 presto 로 바꾸십시오. chmod +x 로 실행 가능하게 만들고 실행하십시오.

  3. Presto CLI가 설치되어 있는지 확인하려면 ./presto --version 실행하세요. Presto CLI 버전이 표시됩니다. 예: Presto CLI 0.281-cfbc6eb

  4. Presto CLI가 설치된 시스템에서 다음 명령을 실행합니다. 다음 방법 중 하나를 사용하여 Presto 에 인증할 수 있습니다:

    • 사용자 이름과 비밀번호 사용: 이를 위해 다음 명령을 실행하십시오

      • API 키를 사용하는 경우 다음 명령을 실행합니다:

        ./presto --server <https://Prestoengine host details> --catalog iceberg_data --schema default --user ibmlhapikey_<your-username> --password
        
      • IBM IAM 토큰을 사용하는 경우 다음 명령을 실행합니다:

        ./presto --server <https://Prestoengine host details> --catalog iceberg_data --schema default --user ibmlhtoken_<your-username> --password
        

      <your-username> 는 다른 사용자와의 다중 연결이 있고 이를 구별하려는 경우 선택사항입니다.

      프롬프트에서 IBM API키 또는 IBM IAM 토큰을 입력하십시오.

    • JWT 토큰: JWT 인증 방법은 2.1.2 이후부터 기본적으로 사용할 수 있습니다. 다음 명령을 실행하여 JWT 토큰을 사용하여 프레스토에 연결합니다:

    watsonx.data 이전 버전( 2.1.2 릴리스 이전)에서 이 인증 방법을 사용하려면 IBM 지원팀에 문의하여 기능을 활성화하세요.

    ```bash {: codeblock}
    ./presto --server <https://Prestoengine host details> --catalog iceberg_data --schema default --access-token <ACCESS_TOKEN>
    ```
    

    <ACCESS_TOKEN> 를 생성하려면 다음 방법 중 하나를 사용합니다:

    • IBM (IAM) 토큰 얻기, (IAM)토큰을 참조하세요.

    • <ACCESS_TOKEN> 를 얻으려면 다음 명령을 사용하십시오

      curl --location 'https://us-south.lakehouse.dev.cloud.ibm.com/lakehouse/api/v2/auth/authenticate/' \
      --header 'Content-Type: application/json' \
      --data-raw '{
       "username": "ibmlhtoken_<user-name>",
       "password": "<IAM_TOKEN>",
       "instance_id": "<instance_id>",
       "instance_name": ""
      }'
      

      <IAM_TOKEN> : Specify the token generated from (IAM) token.

      <user-name> : Specify the email id.

      <instance_id> : Specify the instance CRN.

  5. Presto 프롬프트에 show catalogs; 입력합니다. 카탈로그 목록이 표시됩니다. 이제 Presto CLI를 통해 watsonx.data Presto 엔진에 연결되었습니다.

    presto:default> show catalogs;
    Catalog
    --------------
    iceberg_data
    jmx
    system
    tpcds
    tpch
    (5 rows)
    

JDBC 사용하여 Presto 엔진에 연결하기

  1. 클라이언트 시스템에 최신 JDBC 드라이버 를 다운로드하여 설치하십시오.

  2. 다운로드한 jar 파일을 Java 애플리케이션의 클래스 경로에 추가하십시오.

  3. API 키를 가져오십시오.

    ibmlhapikey 을 사용자 아이디로, API 키를 비밀번호로 사용합니다. 자세한 내용은 IBM API 키 가져오기 를 참조하세요.

  4. 호스트 이름 및 포트를 가져오십시오. 자세한 내용은 Presto 엔진 호스트 이름 및 포트 세부 정보 가져오기를 참조하세요.

  5. JDBC 인터페이스를 사용하여 Java 애플리케이션을 작성하십시오. 다음은 Java 스니펫의 예제입니다.

    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class PrestoJdbcSample
    {
        public static void main(String[] args) throws Exception
        {
            /*
             * example of fetching the location and credentials needed to connect, from
             * environment variables
             */
            String username = System.getenv("ENG_USERNAME");
            String password = System.getenv("ENG_PASSWORD");
            String hostname = System.getenv("ENG_HOST");
            String portnumber = System.getenv("ENG_PORT");
            String presto_url = "jdbc:presto://" + hostname + ":" + portnumber;
            Connection connection = null;
            Statement statement = null;
            ResultSet resultSet = null;
            try
            {
                /* load the Presto JDBC Driver class  */
                String driverClass = "com.facebook.presto.jdbc.PrestoDriver";
                Class.forName(driverClass);
                /* Set the connection properties */
                Properties properties = new Properties();
                properties.setProperty("user", username);
                properties.setProperty("password", password);
                properties.setProperty("SSL", "true");
                /* Connect */
                connection = DriverManager.getConnection(presto_url, properties);
                /* Issue a Query */
                String query = "SELECT * FROM tpch.tiny.customer LIMIT 10";
                statement = connection.createStatement();
                resultSet = statement.executeQuery(query);
                /* iterate through the results */
                while (resultSet.next())
                {
                    String phone = resultSet.getString("phone");
                    String name = resultSet.getString("name");
                    System.out.println("phone = " + phone + ", name = " + name);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                /* clean up at the end always **/
                if (resultSet != null)
                {
                    resultSet.close();
                }
                if (statement != null)
                {
                    statement.close();
                }
                if (connection != null)
                {
                    connection.close();
                }
            }
        }
    }
    

    명령의 매개변수를 다음으로 바꾸십시오. <PRESTO_URL> Jdbc URL 를 Presto 서버에 식별합니다. <EMAIL_ID> 를 이메일 ID로 <API_KEY> 에 API 키를 입력합니다

    IBM IAM 토큰을 사용하는 경우 ibmapikeyibmlhtoken 로 바꾸고 토큰을 전달합니다.

  6. 명령을 컴파일하고 실행합니다.

Python 스크립트를 사용하여 Presto 엔진에 연결하기

  1. 클라이언트 워크스테이션에 python 3.x (3.10 이상 권장) 및 pip3 를 설치하십시오.

  2. DBAPI 인터페이스를 사용하여 Presto 쿼리합니다. 다음은 샘플 python 스크립트입니다.

    import os
    import prestodb
    username=os.environ["ENG_USERNAME"]
    password=os.environ["ENG_PASSWORD"]
    hostname=os.environ["ENG_HOST"]
    portnumber=os.environ["ENG_PORT"]
       with prestodb.dbapi.connect(
       host=hostname,
       port=portnumber,
       user=username,
       catalog='tpch',
       schema='tiny',
       http_scheme='https',
       auth=prestodb.auth.BasicAuthentication(username,password)
       ) as conn:
    cur = conn.cursor()
    cur.execute('select * from tpch.tiny.customer limit 10')
    rows = cur.fetchall()
    print(rows)
    
    

    이 명령은 Presto 클러스터의 노드를 표시하는 system.runtime.nodes 시스템 테이블을 쿼리합니다. prestodb.dbapi 의 DBAPI 구현은 몇 개의 행을 검색하는 메소드를 제공합니다. 예를 들어, Cursorfetchone() 또는 Cursor.fetchmany()입니다. 기본적으로 Cursor.fetchmany() 는 한 행을 페치합니다. prestodb.dbapi.Cursor.arraysize 를 적절하게 설정하십시오.

  3. 명령을 컴파일하고 실행합니다.