728x90

 

trino 를 통해 select ~ from ~ order by 쿼리 실행 시 문제가 없지만, 

insert 할 때 insert ~ select ~ order by 실행 시 error 는 안나지만, 

sorting 이 정상적으로 실행되지않는 현상을 발견했다. 

 

찾아보니, trino 가 하위 쿼리의 order by 를 무시하고 (sorting 미지원) 쿼리를 실행한다!

 

 

참조 :

 

https://trino.io/blog/2019/06/03/redundant-order-by.html

 

Removing redundant ORDER BY

Optimizers are all about doing work in the most cost-effective manner and avoiding unnecessary work. Some SQL constructs such as ORDER BY do not affect query results in many situations, and can negatively affect performance unless the optimizer is smart en

trino.io

 

https://stackoverflow.com/questions/64901686/why-is-order-by-not-working-in-a-presto-query

 

Why is ORDER BY not working in a Presto query?

I have a fairly simple Presto query, that is not ORDERing by the column I specified: (SELECT tag_monitor_domains.property_name, count(*) as HourCount FROM pageviews INNER JOIN tag_monitor_do...

stackoverflow.com

 

728x90

 

들어가기에 앞서, Nifi 2.0 버전에서는 Hive3QL 만 지원됩니다. 

기존 ~HiveQL 은 주로 Hive 1.x 및 2.x를 지원하는데 사용되었지만, Hive3QLHive 3.x 버전만 지원합니다.

 

 

 

 

1. Hive Connection Pool ( Hive3ConnectionPool 2.0.0-M2 )

설정값 입력

  • Database Connection URL: jdbc:hive2://<hive-server-host>:<hive-server-port>/<database-name>
    • 예: jdbc:hive2://hive-server:10000/default
      ( 저는 DB 명 생략했습니다. )
  • Database Driver Class Name: org.apache.hive.jdbc.HiveDriver
  • Database Driver Location(s): file:///path/to/hive-jdbc-driver.jar
    • Hive JDBC 드라이버 파일의 경로를 입력합니다.
  • Database User: Hive 데이터베이스 사용자 이름
  • Password: Hive 데이터베이스 사용자의 비밀번호
  • Max Wait Time: 500 millis
  • Max Total Connections: 8
  • Validation Query: SELECT 1

 

 

 

 

2. Select 쿼리 실행 ( SelectHive3QL 2.0.0-M2 )

  • Select 쿼리는 SelectHive3QL 에서 바로 실행 가능합니다. 

 

 

 

 

 

 

3. Alter, Insert ... 쿼리 실행 ( PutHive3QL 2.0.0-M2 )

 

 

  • PutHive3QL  내 Properties 에는 직접 쿼리를 입력하는 칸이 존재하지 않으므로,
    쿼리를 FlowFile의 내용 또는 속성으로 제공하는 방법을 사용할 수 있습니다.
  • 저는 GenerateFlow 과 같은 타 프로세서를 통해 실행했습니다.
  • LogAttribute 는 실행 완료 확인용입니다. (선택)

 

(1) GenerateFlowFile

실행할 쿼리 입력

 

(2) PutHive3QL

입력받은 쿼리를 Hive 통해 실행

 

728x90

1.  목적

CSV 데이터를 가져와서, DB type 변형없이 Database 에 적재하기 위함. 

 

2. 프로세스

적재 중 CSV 내의 timestamp 와 같은 컬럼의 데이터를 DB로 적재 시 type 을 못 읽는 오류가 발생하는데, 

(ERROR: column "column2" is of type timestamp without time zone but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.)

위의 해결을 위해선 두 가지 방법이 존재함. 

 

(1) tmp 임시테이블 생성 → column type 모두 varchar   →  csv 데이터 그대로 적재  →  본 테이블에 쿼리로 캐스팅하여 적재 ( insert into test select cast(reg_dtm as timestamp) from test_tm,p ) → 임시테이블 truncate

(2) nifi 상에서 프로세서를 통해 type 을 변경하여 본테이블에 바로 적재

 

이 글에선 (2) 의 방법을 기술함. 

 

nifi ver.2.0

 

 

3. 상세 설명

 

(1) GetFile

 

Input directory 밑의 경로에 있는 File Filter 의 파일을 찾아서 가져오기. 

(t_emal~ 로 시작하는 csv 형식의 파일을 가져온다.)

 

 

 

 

(2) ConvertRecord
    : 다양한 입력 데이터 포맷을 다른 포맷으로 변환하는 기능을 제공

 

 

CSV 데이터를 JSON으로 변환하기. 

 

다음단계에서 DB 에 insert 할 때 type 지정해줄 것이기 때문에

Reader, Writer 모두 default 그대로 사용. 

 

 

 

 

(3) PutDatabaseRecord

 

DB Type, DB Connection pool, schema, table name 등 입력.

 

 

JsonRecordSetWriter 에서 timestamp 형식을 지정해준다. 

 

필자는 timestamp 데이터가 밀리세컨드단위까지 있어서 ss.SSS 까지 지정해줬다.

 

 

 

 


 

 

더 많은 방법이 있겠지만

최대한 간단히 적은 프로세서를 사용해서 만들어봤다.

728x90

1. 첫번째 오류

https://yjshin.tistory.com/744

 

[Linux] Ubuntu root 권한이 없는 경우, is not in the sudoers file. This incident will be reported.

[username] is not in the sudoers file. This incident will be reported. 우분투에서 sudo 명령어 작성시 root 권한이 없을 때 발생하는 오류 문구 입니다. 해결 방법은 sudoers 파일에 계정 이름을 넣어 root 권한을 부여

yjshin.tistory.com

 

 

 

2. 두번째 오류

 

 

원인 파악을 위해 로그파일 확인!

 

 

 

 

pg_hba.conf 파일에 오류가 있음을 확인했다. 

 

 

위 파일에서 

#local   replication     all

 

 

이 부분 주석처리. 

 

 

728x90

배경)

 

각기 다른 port 를 사용하는 trino cluster 2대에 tls 적용 시

 

 

 

http-server.http.port 설정값을 지우고

http-server.https.port 설정값을 지정해줬다.

 

 

trino cluster 가 한 대라면 실행 시 문제가 없으나, 

두 대 이상이라면 나중에 실행한 클러스터가 실행 불가.

 

server.log 의 Error Message )

Caused by: UncheckedIOException: Failed to bind to /0.0.0.0:8080

 

 

https 를 지정해주더라도, 기본 default http port 인 8080 을 통해 접속 후 동작하는 방식인 것 같다. 

참고 )

https://trino.io/docs/current/security/tls.html?highlight=http+server+port

 

TLS and HTTPS — Trino 445 Documentation

TLS and HTTPS Trino runs with no security by default. This allows you to connect to the server using URLs that specify the HTTP protocol when using the Trino CLI, the Web UI, or other clients. This topic describes how to configure your Trino server to use

trino.io

 

 

 

 

해결 )

 

 

두대 중 한대는 http port 를 임의로 지정해줬다. ( 나머지 한대는 http 설정 미지정으로 유지 )

 

 

 

cluster 재실행 시 해결 완료!

728x90

배경) 

 

스탠바이 네임노드, 데이터노드에서 각 소프트웨어( 저널노드, 네임노드, zkfc , datanode 등)

root 계정이 아닌, 다른 계정으로 실행 하고

 

Actuve NameNode에서 root 계정으로 저널노드, 네임노드, zkfc 를 실행했을 때

 

 

 

yarn 실행 시 

실행이 안된다. 

 

 

https://bloodguy.tistory.com/m/entry/Hadoop-hdfs-yarn-%EA%B4%80%EB%A0%A8-%EB%8D%B0%EB%AA%AC%EC%9D%84-root%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%A0-%EB%95%8C-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D%EC%8B%9C

 

[Hadoop] hdfs, yarn 관련 데몬을 root로 실행할 때 에러 발생시

권장사항대로 hadoop용 사용자를 따로 생성해서 하는게 제일 좋겠지만, 어떤 사정이 있거나 귀찮거나 여하튼 root로 굳이 하려는데, sbin/start-all.sh 등을 실행시키면 아래와 같은 에러가 발생함. # sbi

bloodguy.tistory.com

 

 

 

- 가장 최선의 방법은 root 로 실행한 프로세서를 kill 하고, 처음 실행했던 계정으로 다시 실행하기. 

- 혹은, 위의 블로그처럼 etc/hadoop/hadoop-env.sh 에 각 사용자를 root로 등록해주기.

728x90

현상 )

 

linux ppc64le 환경에서 trino cli 가 제대로 동작하지 않음. 

- 접속은 정상!

 

- 하지만, ctrl+z ( 종료) 외에 enter 등 모든 키가 입력되지 않는다. 

 

 

 

 

 

 

https://github.com/trinodb/trino/issues/10438

 

Unable to start trino-cli on ppc64le · Issue #10438 · trinodb/trino

OS Debian 11 Bullseye (ppc64le) Version trino server 367 After deployment of trino server 367 I am able to successfully start trino with python3 bin/launcher.py run However when trying to start tri...

github.com

나와 같은 사람을 찾은 결과 .. 

모두 cli jar 파일을 도커 환경에서 다시  build 하였고

 

 

https://trino.io/docs/current/search.html?q=ppc64le#

 

Search — Trino 444 Documentation

Search Please activate JavaScript to enable the search functionality.

trino.io

 

공식홈페이지에 trino cli 에 관한 ppc64le 업데이트는 존재하지 않는다.

728x90

 

 

 

 

vi conf/zoo.cfg 에서, 

standalone 실행인 경우 아래의 서버 설정을 삭제하거나 주석처리 하시면 됩니다.
ex)

    #server.1=master:2888:3888#server.2=slave1:2888:3888

MultiNode Mode로 실행하는 경우 위의 zoo.cfg 파일에 각각의 서버 설정을 해주셔야 합니다.

 

 

- 설정 정보

 

tickTime : tick 단위 시간을 설정, milliseconds 단위. (위에서는 2초)

initLimit : 처음 주키퍼의 follower가 leader와의 연결 시도시 가지는 tick 제한 횟수. tick 제한 횟수가 넘으면 timeout.

                  (위에서는 10초)

syncLimit : follower가 leader와 연결된 후, 계속 ensemble 안에서 leader와 동기화되기 위한 tick 제한 횟수.

                    tick 제한 횟수가 넘으면 timeout (위에서는 4초)

dataDir : 주키퍼의 상태, 스냅션, 트랜잭션 로그들을 저장하고 업데이트하는 디렉토리의 위치를 지정

clientPort : 클라이언트 연결을 감지하는 포트의 번호 

server.1=test1:2888:3888 ~ server.3=test3:2888:3888: Zookeeper 가 ensemble을 이루기 위한 서버의 정보를 기재한다.                    2888은 동기화를 위한 포트,

                   3888은 클러스터 구성 시, leader를 선출하기 위한 포트.

                   여기서 서버의 id를 myid  파일로 dataDir에 설정해 줘야한다. ( 위에서는 /data/zookeeper/myid )

maxSessionTimeout
최대 세션 타임아웃이며 단위는 밀리세컨드(ms)이다. 기본값은 tickTime *20 이다.

admin.enableServer=false 

    : admin web ui 를 위한 8080 포트가 열리는 것 방지. 

 

 

 

 

이때 ! zkServer.sh start 시 각 서버 별로 직접 실행해줘야 한다 !!



zookeeper가 multinode로 실행되는 경우 leader와 follower는 zookeeper가 상황에 맞춰서 직접 선택하기 때문에 
상황에 따라 변경될수 있습니다. 오류가 아니니 오해하지 마시기 바랍니다.

 

 


/data/zookeeper/myid : 주키퍼 클러스터내에서 각각의 주키퍼 노드를 구분하기 위하여 ID 를 생성
/opt/you_ebigs/zookeeper/bin/zkEnv.sh 에서, 주키퍼 로그(zookeeper.out) 경로 변경 위해 ZOO_LOG_DIR 경로 지정해주기.

 

 

 

 

 

728x90

Output Grouping (One Line Per Object / Array )

결과 확인

 

 

(1) Array

[] 배열안에 모든 값 넣기!

행 나눴을 때, 총 1개의 Key/Value 값 생성.

 

 

(2) One Line Per Object

한 키값 쌍마다 줄바꿈해서 변환

 

행 나눴을 때, 총 4개의 Key/Value 값 생성. 

728x90
  • 모든 프로세서는, 각 프로세서에 맞는 시작/종료 수행 결과를 입력해야 한다.

 

 

1. MergeContent , LogAttribute

- MergeContent 

MergeContent 

 

 

 

- LogAttribute

+ Recent posts