3.5. S3 Select operations
개발자는 S3 select를 실행하여 처리량을 가속화할 수 있습니다. 사용자는 중재자 없이 S3 선택 쿼리를 직접 실행할 수 있습니다.
CSV, Apache Parquet (Parquet) 및 JSON 오브젝트에 CSV, Parquet 및 JSON 오브젝트와 함께 S3 선택 작업을 제공하는 JSON의 세 가지 S3 선택 워크플로우가 있습니다.
- CSV 파일은 테이블 형식 데이터를 일반 텍스트 형식으로 저장합니다. 파일의 각 행은 데이터 레코드입니다.
- parquet는 효율적인 데이터 저장 및 검색을 위해 설계된 오픈 소스 열 중심 데이터 파일 형식입니다. 매우 효율적인 데이터 압축 및 인코딩 체계를 제공하여 복잡한 데이터를 대량으로 처리할 수 있는 향상된 성능을 제공합니다. parquet를 사용하면 S3 select-engine이 열과 청크를 건너뛸 수 있으므로 IOPS를 크게 줄일 수 있습니다(CSV 및 JSON 형식 비교).
- JSON은 형식 구조입니다. S3 선택 엔진을 사용하면 JSON 리더를 사용하여 JSON 형식 입력 데이터 상단에 SQL 문을 사용할 수 있으므로 매우 중첩되고 복잡한 JSON 형식의 데이터를 스캔할 수 있습니다.
예를 들어 CSV, Parquet 또는 JSON S3 개체가 여러 기가바이트의 데이터를 사용하여 사용자는 다음 쿼리를 사용하여 다른 열로 필터링되는 단일 열을 추출할 수 있습니다.
예
select customerid from s3Object where age>30 and age<65;
현재 S3 오브젝트는 데이터를 필터링하고 추출하기 전에 Ceph Object Gateway를 통해 Ceph OSD에서 데이터를 검색해야 합니다. 개체가 크고 쿼리가 더 구체적인 경우 성능이 향상됩니다. Parquet 형식은 CSV보다 더 효율적으로 처리할 수 있습니다.
사전 요구 사항
- 실행 중인 Red Hat Ceph Storage 클러스터.
- RESTful 클라이언트입니다.
- 사용자 액세스 권한이 있는 S3 사용자
3.5.1. S3 오브젝트에서 콘텐츠 선택
select 오브젝트 콘텐츠 API는 구조화된 쿼리 언어(SQL)를 통해 오브젝트 콘텐츠를 필터링합니다. 인벤토리 오브젝트에 상주해야 하는 사항에 대한 설명의 예는 AWS Systems Manager 사용자 가이드 의 인벤토리에서 수집한 메타데이터 섹션을 참조하십시오. 인벤토리 콘텐츠는 해당 인벤토리에 대해 실행해야 하는 쿼리 유형에 영향을 미칩니다. 필수 정보를 제공할 수 있는 SQL 문의 수는 크지만 S3 select는 SQL과 같은 유틸리티이므로 그룹별
및 조인
과 같이 일부 연산자는 지원되지 않습니다.
CSV에만 대해 지정된 콘텐츠를 검색하려면 개체의 쉼표로 구분된 값으로 데이터 직렬화 형식을 지정해야 합니다. parquet는 바이너리 형식이므로 구분 기호가 없습니다. AWS(Amazon Web Services) CLI(명령줄 인터페이스) 선택 오브젝트 콘텐츠는 CSV 또는 Parquet 형식을 사용하여 오브젝트 데이터를 레코드로 구문 분석하고 쿼리에 지정된 레코드만 반환합니다.
응답에 대한 데이터 직렬화 형식을 지정해야 합니다. 이 작업에 대한 s3:GetObject
권한이 있어야 합니다.
-
InputSerialization
요소는 쿼리되는 개체의 데이터 형식을 설명합니다. 오브젝트는 CSV 또는 Parquet 형식일 수 있습니다. -
OutputSerialization
요소는 AWS-CLI 사용자 클라이언트의 일부이며 출력 데이터의 포맷 방법을 설명합니다. Ceph는 AWS-CLI에 대한 서버 클라이언트를 구현했기 때문에 현재 CSV만 있는OutputSerialization
에 따라 동일한 출력을 제공합니다. -
InputSerialization
형식은OutputSerialization
의 형식과 일치시킬 필요가 없습니다. 예를 들어OutputSerialization
의InputSerialization
및 CSV에서 Parquet를 지정할 수 있습니다.
구문
POST /BUCKET/KEY?select&select-type=2 HTTP/1.1\r\n
예
POST /testbucket/sample1csv?select&select-type=2 HTTP/1.1\r\n POST /testbucket/sample1parquet?select&select-type=2 HTTP/1.1\r\n
요청 엔티티
bucket
- 설명
- 오브젝트 콘텐츠를 선택할 버킷입니다.
- 유형
- 문자열
- 필수 항목
- 제공됨
키
- 설명
- 오브젝트 키입니다.
- 길이 제한
- 최소 길이는 1입니다.
- 유형
- 문자열
- 필수 항목
- 제공됨
SelectObjectContentRequest
- 설명
- 선택한 오브젝트 콘텐츠 요청 매개변수의 root 수준 태그입니다.
- 유형
- 문자열
- 필수 항목
- 제공됨
expression
- 설명
- 오브젝트를 쿼리하는 데 사용되는 식입니다.
- 유형
- 문자열
- 필수 항목
- 제공됨
ExpressionType
- 설명
- 예제 SQL에 대해 제공된 표현식의 유형입니다.
- 유형
- 문자열
- 유효한 값
- SQL
- 필수 항목
- 제공됨
InputSerialization
- 설명
- 쿼리되는 개체의 데이터 형식에 대해 설명합니다.Describes the format of the data in the object that is being queried.
- 유형
- 문자열
- 필수 항목
- 제공됨
OutputSerialization
- 설명
- 쉼표 구분 기호 및 새 줄로 반환되는 데이터 형식입니다.
- 유형
- 문자열
- 필수 항목
- 제공됨
응답 엔티티
작업이 성공하면 서비스는 HTTP 200
응답을 보냅니다. 데이터는 서비스에서 XML 형식으로 반환됩니다.
페이로드
- 설명
- 페이로드 매개 변수의 루트 수준 태그입니다.
- 유형
- 문자열
- 필수 항목
- 제공됨
레코드
- 설명
- 레코드 이벤트입니다.
- 유형
- base64로 인코딩된 바이너리 데이터 오브젝트
- 필수 항목
- 없음
통계
- 설명
- 통계 이벤트입니다.
- 유형
- long
- 필수 항목
- 없음
Ceph Object Gateway는 다음 응답을 지원합니다.
예
{:event-type,records} {:content-type,application/octet-stream} {:message-type,event}
구문(CSV의 경우)
aws --endpoint-URL http://localhost:80 s3api select-object-content --bucket BUCKET_NAME --expression-type 'SQL' --input-serialization '{"CSV": {"FieldDelimiter": "," , "QuoteCharacter": "\"" , "RecordDelimiter" : "\n" , "QuoteEscapeCharacter" : "\\" , "FileHeaderInfo": "USE" }, "CompressionType": "NONE"}' --output-serialization '{"CSV": {}}' --key OBJECT_NAME.csv --expression "select count(0) from s3object where int(_1)<10;" output.csv
예(CSV의 경우)
aws --endpoint-url http://localhost:80 s3api select-object-content --bucket testbucket --expression-type 'SQL' --input-serialization '{"CSV": {"FieldDelimiter": "," , "QuoteCharacter": "\"" , "RecordDelimiter" : "\n" , "QuoteEscapeCharacter" : "\\" , "FileHeaderInfo": "USE" }, "CompressionType": "NONE"}' --output-serialization '{"CSV": {}}' --key testobject.csv --expression "select count(0) from s3object where int(_1)<10;" output.csv
구문(Parquet의 경우)
aws --endpoint-url http://localhost:80 s3api select-object-content --bucket BUCKET_NAME --expression-type 'SQL' --input-serialization '{"Parquet": {}, {"CompressionType": "NONE"}' --output-serialization '{"CSV": {}}' --key OBJECT_NAME.parquet --expression "select count(0) from s3object where int(_1)<10;" output.csv
예: (Parquet)
aws --endpoint-url http://localhost:80 s3api select-object-content --bucket testbucket --expression-type 'SQL' --input-serialization '{"Parquet": {}, {"CompressionType": "NONE"}' --output-serialization '{"CSV": {}}' --key testobject.parquet --expression "select count(0) from s3object where int(_1)<10;" output.csv
구문(JSON의 경우)
aws --endpoint-URL http://localhost:80 s3api select-object-content --bucket BUCKET_NAME --expression-type 'SQL' --input-serialization '{"JSON": {"CompressionType": "NONE"}' --output-serialization '{"CSV": {}}}' --key OBJECT_NAME.json --expression "select count(0) from s3object where int(_1)<10;" output.csv
예(JSON의 경우)
aws --endpoint-url http://localhost:80 s3api select-object-content --bucket testbucket --expression-type 'SQL' --input-serialization '{"JSON": {"CompressionType": "NONE"}' --output-serialization '{"CSV": {}}}' --key testobject.json --expression "select count(0) from s3object where int(_1)<10;" output.csv
예(boTO3)
import pprint import boto3 from botocore.exceptions import ClientError def run_s3select(bucket,key,query,column_delim=",",row_delim="\n",quot_char='"',esc_char='\\',csv_header_info="NONE"): s3 = boto3.client('s3', endpoint_url=endpoint, aws_access_key_id=access_key, region_name=region_name, aws_secret_access_key=secret_key) result = "" try: r = s3.select_object_content( Bucket=bucket, Key=key, ExpressionType='SQL', InputSerialization = {"CSV": {"RecordDelimiter" : row_delim, "FieldDelimiter" : column_delim,"QuoteEscapeCharacter": esc_char, "QuoteCharacter": quot_char, "FileHeaderInfo": csv_header_info}, "CompressionType": "NONE"}, OutputSerialization = {"CSV": {}}, Expression=query, RequestProgress = {"Enabled": progress}) except ClientError as c: result += str(c) return result for event in r['Payload']: if 'Records' in event: result = "" records = event['Records']['Payload'].decode('utf-8') result += records if 'Progress' in event: print("progress") pprint.pprint(event['Progress'],width=1) if 'Stats' in event: print("Stats") pprint.pprint(event['Stats'],width=1) if 'End' in event: print("End") pprint.pprint(event['End'],width=1) return result run_s3select( "my_bucket", "my_csv_object", "select int(_1) as a1, int(_2) as a2 , (a1+a2) as a3 from s3object where a3>100 and a3<300;")
지원되는 기능
현재 AWS s3 select 명령의 일부만 지원됩니다.
추가 리소스
- 자세한 내용은 Amazon의 S3 Select Object Content API 를 참조하십시오.
3.5.2. S3 지원 선택 함수
S3 select supports the following functions: .Timestamp
- to_timestamp(string)
- 설명
- 문자열을 timestamp 기본 형식으로 변환합니다. 문자열 형식에서 누락된 '시간' 값은 0으로 채워집니다. 월과 일 값의 경우 1은 기본값입니다. '시간 영역' 형식은 +/-HH:mm 또는 Z입니다. 여기서 'Z' 문자는 UTC(Coordinated Universal Time)를 나타냅니다. 시간대 값의 범위는 12:00에서 +14:00 사이입니다.
- 지원됨
현재 다음 문자열 형식을 타임 스탬프로 변환할 수 있습니다.
- YYYY-MM-DDTHH:mm:ss.SSSSSS+/-HH:mm
- YYYY-MM-DDTHH:mm:ss.SSSSSSZ
- YYYY-MM-DDTHH:mm:ss+/-HH:mm
- YYYY-MM-DDTHH:mm:ssZ
- YYYY-MM-DDTHH:mm+/-HH:mm
- YYYY-MM-DDTHH:mmZ
- YYYY-MM-DDT
- YYYYT
- to_string(timestamp, format_pattern)
- 설명
- 지정된 입력 문자열 형식으로 입력 타임스탬프의 문자열 표현을 반환합니다.
- 매개 변수
형식 | 예 | 설명 |
---|---|---|
YY | 69 | 2년 숫자입니다. |
y | 1969 | 4년차 숫자입니다. |
YYYY | 1969 | zero-padded 4자리 연도. |
M | 1 | 해당 연도의 월입니다. |
MM | 01 | 해당 연도의 제로 추가 월입니다. |
MMM | 1월 | 연도 이름의 축약된 월입니다. |
MMMM | 1월 | 연도의 전체 이름입니다.The full month of the year. |
MMMMM | J |
연중 첫 번째 편지입니다. |
d | 2 | 달의 날 (1-31). |
dd | 02 | 해당 월의 제로 추가 일(01-31). |
a | AM | 오전 또는 오후 |
h | 3 | 하루 (1-12) |
hh | 03 | 0padded hour of day (01-12) |
H | 3 | 시간(0-23)입니다. |
HH | 03 | 0padded hour of the day (00-23). |
m | 4 | 시간(0-59)의 분입니다. |
mm | 04 | 시간(00-59)의 0padded 분. |
S | 5 | 분의 초(0-59)입니다. |
SS | 05 | 분의 1초(00-59)입니다. |
S | 1 | 초의 분수(정밀: 0.1, 범위: 0.0-0.9). |
SS | 12 | 초의 분수(정수: 0.01, 범위: 0.0-0.99). |
SSS | 123 | 초의 분수(정밀: 0.01, 범위: 0.0-0.999). |
SSSS | 1234 | 초의 분수(정수: 0.001, 범위: 0.0-0.9999). |
SSSSSS | 123456 | 초의 분수(최대 정확도: 1 나노초, 범위: 0.0-0.999999). |
n | 60000000 | second 입니다. |
X | +07 또는 Z | 오프셋이 0인 경우 시간 또는 "Z"로 오프셋합니다. |
XX 또는 XXXX | +0700 또는 Z | 오프셋이 0인 경우 시간 및 분 또는 "Z"로 오프셋합니다. |
XXX 또는 XXXXX | +07:00 또는 Z | 오프셋이 0인 경우 시간 및 분 또는 "Z"로 오프셋합니다. |
x | 7 | 시간 내에 오프셋합니다. |
Xx 또는 xxxx | 700 | 시간 및 분 단위로 오프셋합니다. |
xxx 또는 xxxxx | +07:00 | 시간 및 분 단위로 오프셋합니다. |
- extract(date-part from timestamp)
- 설명
- 입력 타임스탬프에서 date-part 추출에 따라 정수를 반환합니다.
- 지원됨
- year, month, week, week, day, minute, second, timezone_minute.
- date_add(date-part ,integer,timestamp)
- 설명
- 입력 타임스탬프 및 date-part 결과를 기반으로 하는 타임 스탬프를 반환합니다.
- 지원됨
- year, month, day, hour, minute, second.
- date_diff(date-part,timestamp,timestamp)
- 설명
- date-part에 따라 두 타임스탬프의 차이에 대한 계산된 결과인 정수를 반환합니다.
- 지원됨
- year, month, day, hour, minute, second.
- utcnow()
- 설명
- 현재 시간 타임스탬프를 반환합니다.
집계
- count()
- 설명
- 1인 경우 조건과 일치하는 행 수를 기반으로 정수를 반환합니다.
- 합계(표현)
- 설명
- 항목이 하나 있는 경우 조건과 일치하는 각 행에 대한 요약을 반환합니다.
- AVG(표현식)
- 설명
- 하나의 조건이 있는 경우 조건과 일치하는 각 행의 평균 표현식을 반환합니다.
- 최대(표현)
- 설명
- 하나가 있는 경우 조건과 일치하는 모든 표현식의 최대 결과를 반환합니다.
- Min(표현식)
- 설명
- 하나의 조건이 있는 경우 조건과 일치하는 모든 표현식에 대한 최소 결과를 반환합니다.
문자열
- 하위 문자열(문자열, from,for)
- 설명
- 입력에 대해 from에 따라 입력 문자열에서 문자열 추출을 반환합니다.
- Cryostat_LENGTH
- 설명
- 문자열에 있는 여러 문자를 반환합니다. character_length도 동일한 작업을 수행합니다.
- Trim([[leading | trailing | both remove_chars] from] string )
- 설명
- 대상 문자열에서 선행/추적(또는 둘 다) 문자를 트리밍합니다. 기본값은 공백 문자입니다.
- 상위\lower
- 설명
- 문자를 대문자 또는 소문자로 변환합니다.
NULL
NULL
값이 없거나 NULL
인 알 수 없는 연산에 대한 값을 생성할 수 없습니다. 연산 비교에도 동일하게 적용되며, NULL
에 대한 비교는 알 수 없는 NULL
입니다.
A는 NULL입니다. | result(NULL=UNKNOWN) |
---|---|
Not A |
|
A 또는 False |
|
A 또는 True |
|
A 또는 A |
|
A 및 False |
|
A 및 True |
|
A 및 A |
|
추가 리소스
- 자세한 내용은 Amazon의 S3 Select Object Content API 를 참조하십시오.
3.5.3. S3 별칭 프로그래밍 구성
별칭 프로그래밍 구문은 많은 열 또는 복잡한 쿼리가 포함된 개체로 더 잘 프로그래밍할 수 있기 때문에 s3 선택 언어의 필수 부분입니다. 별칭 구문이 있는 문을 구문 분석할 때 별칭을 올바른 프로젝션 열에 대한 참조로 바꾸고 쿼리 실행 시 참조는 다른 식과 같이 평가됩니다. 별칭은 별칭을 두 번 이상 사용하는 경우 캐시의 결과가 사용되므로 동일한 표현식이 평가되지 않고 동일한 결과가 반환됩니다. 현재 Red Hat은 열 별칭을 지원합니다.
예
select int(_1) as a1, int(_2) as a2 , (a1+a2) as a3 from s3object where a3>100 and a3<300;")
3.5.4. S3 구문 분석 설명
S3 선택 엔진에는 CSV, Parquet, JSON 등 세 가지 파일 형식 모두에 대한 구문 분석기가 있어 더 처리 가능한 구성 요소로 명령을 분리한 다음 각 구성 요소를 정의하는 태그에 연결됩니다.
3.5.4.1. S3 CSV 구문 분석
입력 직렬화가 있는 CSV 정의에서는 다음 기본값을 사용합니다.
-
row-delimiter에는
{\n}'
을 사용합니다. -
인용에는
{"}
를 사용합니다. -
이스케이프 문자에는
{\}
를 사용합니다.
csv-header-info
는 AWS-CLI에 표시되는 경우 구문 분석됩니다. 스키마가 포함된 입력 오브젝트의 첫 번째 행입니다. 현재 출력 직렬화 및 압축 유형이 지원되지 않습니다. S3 선택 엔진에는 S3 개체를 구문 분석하는 CSV 구문 분석기가 있습니다.
- 각 행은 row-delimiter로 끝납니다.
- 필드 분리기는 인접한 열을 구분합니다.
-
연속 필드 구분자는
NULL
열을 정의합니다. - 인용 문자는 필드를 재정의합니다. 즉, 필드 구분 기호는 따옴표 사이의 문자입니다.
- 이스케이프 문자는 행 구분 기호를 제외한 특수 문자를 비활성화합니다.
다음은 CSV 구문 분석 규칙의 예입니다.
기능 | 설명 | 입력 (토큰) |
---|---|---|
| 연속 필드 구분 기호 |
|
| 인용 문자는 필드 구분자를 덮어씁니다. |
|
| 이스케이프 문자는 메타 문자를 덮어씁니다. |
오브젝트 소유자의 |
| 닫은 따옴표가 없습니다. 행 구분 기호는 닫는 줄입니다. |
|
| FileHeaderInfo tag | USE 값은 첫 번째 줄의 각 토큰이 열 이름임을 의미합니다. IGNORE 값은 첫 번째 행을 건너뛰는 것을 의미합니다. |
추가 리소스
- 자세한 내용은 Amazon의 S3 Select Object Content API 를 참조하십시오.
3.5.4.2. S3 Parquet 구문 분석
Apache Parquet는 효율적인 데이터 저장 및 검색을 위해 설계된 오픈 소스 데이터 파일 형식입니다.
S3 select 엔진의 Parquet parser는 다음과 같이 S3 개체를 구문 분석합니다.
예
4-byte magic number "PAR1" <Column 1 Chunk 1 + Column Metadata> <Column 2 Chunk 1 + Column Metadata> ... <Column N Chunk 1 + Column Metadata> <Column 1 Chunk 2 + Column Metadata> <Column 2 Chunk 2 + Column Metadata> ... <Column N Chunk 2 + Column Metadata> ... <Column 1 Chunk M + Column Metadata> <Column 2 Chunk M + Column Metadata> ... <Column N Chunk M + Column Metadata> File Metadata 4-byte length in bytes of file metadata 4-byte magic number "PAR1"
- 위의 예제에는 이 테이블에 N개의 열이 있으며 M 행 그룹으로 나뉩니다. 파일 메타데이터에는 모든 열 메타데이터 시작 위치의 위치가 포함되어 있습니다.
- 메타데이터는 단일 패스 쓰기를 허용할 데이터 뒤에 작성됩니다.
- 모든 열 청크는 나중에 순차적으로 읽어야 하는 파일 메타데이터에서 찾을 수 있습니다.
- 형식은 데이터와 메타데이터를 분리하도록 명시적으로 설계되었습니다. 이렇게 하면 열을 여러 파일로 분할하고 단일 메타데이터 파일을 여러 개의 parquet 파일을 참조할 수 있습니다.
3.5.4.3. S3 JSON 구문 분석
JSON 문서를 사용하면 제한 없이 개체 또는 배열 내에 값을 중첩할 수 있습니다. S3 선택 엔진의 JSON 문서의 특정 값을 쿼리할 때 값의 위치는 SELECT
문의 경로를 통해 지정됩니다.
JSON 문서의 일반 구조에는 CSV 및 Parquet와 같은 행 및 열 구조가 없습니다. 대신 JSON 문서를 쿼리할 때 행과 열을 정의하는 SQL 문 자체입니다.
S3 Select 엔진의 JSON 구문 분석기는 다음과 같이 S3 개체를 구문 분석합니다.
-
SELECT
문의FROM
절은 행 경계를 정의합니다. - JSON 문서의 행은 CSV 개체에 대한 행을 정의하는 데 행 구분 기호를 사용하는 방법 및 Parquet 오브젝트에 대한 행을 정의하는 데 사용되는 방법과 유사합니다.
다음 예제를 고려하십시오.
예
{ "firstName": "Joe", "lastName": "Jackson", "gender": "male", "age": "twenty" }, { "firstName": "Joe_2", "lastName": "Jackson_2", "gender": "male", "age": 21 }, "phoneNumbers": [ { "type": "home1", "number": "734928_1","addr": 11 }, { "type": "home2", "number": "734928_2","addr": 22 } ], "key_after_array": "XXX", "description" : { "main_desc" : "value_1", "second_desc" : "value_2" } # the from-clause define a single row. # _1 points to root object level. # _1.age appears twice in Documnet-row, the last value is used for the operation. query = "select _1.firstname,_1.key_after_array,_1.age+4,_1.description.main_desc,_1.description.second_desc from s3object[*].aa.bb.cc;"; expected_result = Joe_2,XXX,25,value_1,value_2
-
이 설명은 리더에게
aa.bb.cc
경로를 검색하고 이 경로의 발생에 따라 행 경계를 정의하도록 지시합니다. -
행은 독자가 경로에 직면할 때 시작되고, 리더가 경로의 가장 내부 부분을 종료할 때 종료됩니다. 이 경우 오브젝트
cc
입니다.
-
이 설명은 리더에게
3.5.5. Ceph Object Gateway와 Trino 통합
사용자가 S3 개체에서 SQL 쿼리 9x를 더 빠르게 실행할 수 있는 중요한 유틸리티인 Trino와 Ceph Object Gateway를 통합합니다.
다음은 Trino 사용의 몇 가지 이점입니다.
- Trino는 완전한 SQL 엔진입니다.
- S3를 푸시하면 Trino 엔진이 서버 측에서 실행하는 데 비용 효율적인 SQL 문의 일부를 식별할 수 있는 요청을 선택합니다.
- Ceph/S3select의 최적화 규칙을 사용하여 성능을 향상시킵니다.
- Red Hat Ceph Storage 확장성을 활용하여 원본 오브젝트를 동일한 여러 부분으로 분할하고 S3 Select requests를 수행하고 요청을 병합합니다.
trino를 쿼리하는 동안 s3select
구문이 작동하지 않는 경우 SQL 구문을 사용합니다.
사전 요구 사항
- Ceph Object Gateway가 설치된 실행 중인 Red Hat Ceph Storage 클러스터
- Docker 또는 Podman이 설치되어 있어야 합니다.
- 생성된 버킷입니다.
- 오브젝트가 업로드됩니다.
프로세스
Trino 및 hive를 배포합니다.
예
[cephuser@host01 ~]$ git clone https://github.com/ceph/s3select.git [cephuser@host01 ~]$ cd s3select
S3 끝점, 액세스 키 및 시크릿 키로
hms_trino.yaml
파일을 수정합니다.예
[cephuser@host01 s3select]$ cat container/trino/hms_trino.yaml version: '3' services: hms: image: galsl/hms:dev container_name: hms environment: # S3_ENDPOINT the CEPH/RGW end-point-url - S3_ENDPOINT=http://rgw_ip:port - S3_ACCESS_KEY=abc - S3_SECRET_KEY=abc # the container starts with booting the hive metastore command: sh -c '. ~/.bashrc; start_hive_metastore' ports: - 9083:9083 networks: - trino_hms trino: image: trinodb/trino:405 container_name: trino volumes: # the trino directory contains the necessary configuration - ./trino:/etc/trino ports: - 8080:8080 networks: - trino_hms networks: trino_hm
S3 끝점, 액세스 키 및 시크릿 키로
hive.properties
파일을 수정합니다.예
[cephuser@host01 s3select]$ cat container/trino/trino/catalog/hive.properties connector.name=hive hive.metastore.uri=thrift://hms:9083 #hive.metastore.warehouse.dir=s3a://hive/ hive.allow-drop-table=true hive.allow-rename-table=true hive.allow-add-column=true hive.allow-drop-column=true hive.allow-rename-column=true hive.non-managed-table-writes-enabled=true hive.s3select-pushdown.enabled=true hive.s3.aws-access-key=abc hive.s3.aws-secret-key=abc # should modify per s3-endpoint-url hive.s3.endpoint=http://rgw_ip:port #hive.s3.max-connections=1 #hive.s3select-pushdown.max-connections=1 hive.s3.connect-timeout=100s hive.s3.socket-timeout=100s hive.max-splits-per-second=10000 hive.max-split-size=128MB
Trino 컨테이너를 시작하여 Ceph Object Gateway를 통합합니다.
예
[cephuser@host01 s3select]$ sudo docker compose -f ./container/trino/hms_trino.yaml up -d
통합을 확인합니다.
예
[cephuser@host01 s3select]$ sudo docker exec -it trino /bin/bash trino@66f753905e82:/$ trino trino> create schema hive.csvbkt1schema; trino> create table hive.csvbkt1schema.polariondatacsv(c1 varchar,c2 varchar, c3 varchar, c4 varchar, c5 varchar, c6 varchar, c7 varchar, c8 varchar, c9 varchar) WITH ( external_location = 's3a://csvbkt1/',format = 'CSV'); trino> select * from hive.csvbkt1schema.polariondatacsv;
참고외부 위치는 파일 끝부분이 아닌 버킷 이름 또는 디렉터리를 가리켜야 합니다.