레이블이 jdbc인 게시물을 표시합니다. 모든 게시물 표시
레이블이 jdbc인 게시물을 표시합니다. 모든 게시물 표시

2021년 7월 15일 목요일

APACHE ZEPPELIN DYNAMIC FORM 고급 응용


APACHE ZEPPELIN DYNAMIC FORM 고급 응용

제목은 거창하지만, 실제론 dynamic form 메뉴얼의 부실함을 보강하고자 포스팅 함.

jdbc 는 지난번 글을 잘 따라 했으면 별 이상이 없을 것이다.

그리고 zeppelin의 dynamic form이란걸 써보면.. (아래 링크 가서 좀 보고 오자!)

https://zeppelin.apache.org/docs/0.9.0/usage/dynamic_form/intro.html

오~~! 귀찮은 검색 항목 만드는 거 안해도 되네?

텍스트 입력에, 셀렉트, 비번, 거기다가 체크박스 까지!!!


오늘도 삽질의 대가는 열심히 삽질을 합니다..

사실.. 오늘이 아니라.. 1달 넘었습니다.


진짜.. 메뉴얼이 너무 부실해서.. 환장하겠음..

그리고 기본 설명이 $를 사용하는 거만 나와서리..

응용을 어떻게 해야하는 막연함이 느껴진다.

기본 응용 (해당 내용들도 여기저기 흩어져 있어서 찾기도 힘들다..)

https://zeppelin.apache.org/docs/0.9.0/interpreter/python.html



1. noteTextbox 에 placeholder 처럼 기본 값을 표시하고 싶다.

z.noteTextbox("최초입고시작일", "YYYYMMDD");
(입력 폼 이름, 기본값) 의 형태로 작성

2. noteSelect 사용 방법
기본은 z.noteSelect("f2",[("o1","1"),("o2","2")],"o1") 형식으로
(입력 폼 이름, 옵션항목, 기본값) 의 형태로 작성
좀 더 응용을 하면.

arrRetYear = [("2021","2021"),("2020","2020"),("2019","2019"),("2018","2018"),("2017","2017"),("2016","2016")]; 
selRetYear = z.noteSelect("조회년도", arrRetYear, "2021"); 
arrChkOpt2 = [("N","미출력"), ("Y","출력"), ] 
selChkOpt2 = z.noteSelect("합계출력", arrChkOpt2);
이런 식으로 옵션의 항목을 따로 코드로 작성하고 할당하는 식으로 코드를 작성했다.


3. noteCheckbox 사용 방법이 항목이 제일 난관이었음.
메뉴얼에는 $를 사용하는 것만 있음.
내가 하고 싶었던건 공통으로 체크 입력 항목을 놓고
선택된 것들에 대한 집계를 내려고 했으나,
이상하게 Class Cast 오류만 신나게 뿜어 댐.
물론 쿼리 안에다가 $를 사용하는 것은 잘 됐음.
엄청 삽질하다가 결국 알아낸 것.


가. 일단 공통으로 쓸 체크박스 폼을 python 에서 작성한다. (매우 중요!)

arrRetYear = [("2021","2021"),("2020","2020"),("2019","2019"),("2018","2018"),("2017","2017"),("2016","2016")]; 
selRetYear = z.noteCheckbox("조회년도", arrRetYear, "2021");

위의 예를 보면.. 셀렉트와 완전 같다. 기본값 지정하는 것도.

나. python으로 작성된 paragraph를 미리 한번 실행해서 공통 입력을 받을 체크박스 폼을 생성한다.

다. jdbc를 연동한 paragraph 에 체크박스 폼의 값을 사용하는 곳에 입력을 한다.

$${checkbox(:):조회년도=,2021|2020|2019|2018|2017|2016}'


위의 예제설명:

{checkbox(구분자):폼양식명(python에서 사용한것과 일치!)=기본값(여기선 선택안함),체크박스 배열의 key 또는 이름}

여기서 제일 마지막 항목의 체크박스 배열의 key 또는 이름은 두개다 사용해 봤는데,
키 값을 넣던, 이름을 넣던 상관없이 python에서 준 코드 값으로 넘어갔다.

4. paragraph를 연속적으로 실행
지난번에 z.run(paragraphId) 로 해당 paragraph를 실행하라고 했는데, 3가지 선택사항이 있다.

가. z.run(paragraphId) : 해당 paragraph 1개 실행
나. z.run(noteId, paragraphId) : 해당 note의 해당 paragraph 1개 실행
다. z.runNote(noteId) : 해당 note의 모든 paragraph 실행

디버깅 할 때는 z.run이 편하고, 완성하고 runNote로 교체하니 코드가 깔끔하게 정리가 됐다.
참고로, 메뉴얼에 z.run 이라고 써 있다고 그대로 하면 안된다.. z.z.run 이라고 해야 함. 
(; ̄Д ̄)
z.runNote 는 z.z 라고 안해도 됨.. (이게 뭐냐...)

후기.
메뉴얼이 너무 부실해서 저 체크박스 알아내는데, 정말 오래 걸렸다.
나온지 꽤 된 걸로 알고 있는데도 아직도 메뉴얼이 엉망진창이다.
이후에 개발하시는 분들은 이걸 보고 그나마 조금이라도 고생을 덜 하시길...
〜( ̄▽ ̄〜)

2021년 6월 3일 목요일

Apache Zeppelin Dynamic Form + JDBC 연동

Apache Zeppelin 에는 Dynamic Form 이란 것이 있다..

paragraph에 사용자가 원하는 매개변수를 입력받을 수 있게 하는 양식을 제공하는 기능이다.

일단 메뉴얼 투척~~!

https://zeppelin.apache.org/docs/0.9.0/usage/dynamic_form/intro.html


메뉴얼 보면.. 매개 변수로 쓸 것을 ${변수명} 으로 사용하면 된다....

라고.. 아주~~~ 간단히 나와있다..


물론.. 이렇게 쓰면 되긴 된다..

그런데 말이지... 이렇게 쓰면.. 큰 문제가 생긴다..(나만 그런걸지도..)


일단 내가 하고 싶은거

공통 입력으로 시작일, 종료일, 매장 선택하여.. 매장별 매출등을 조회하고 싶음


1. 삽질 시작 

아~~ 매뉴얼 대로 쿼리 안에다가 넣으니까 폼이 생기고... 오오~~ 신기하네~~ 잘된다..

흠.. 그럼.. 한 Note에 paragraph 3개 생성해서.. jdbc로 연동한 걸

하나는 표, 차트 두개로 해 볼까?

2. 당혹

흠... 되긴 되는데.. 이렇게 되면.. 각 paragraph 마다 입력 폼이 생기잖여.. 입력은 한번만 해서 돌려써야 욕을 안 먹는데..

흠?? 메뉴얼 아래쪽에 Using form Templates (scope: note) 란거 보니.. 전역 변수로 쓸 수 있는 것 같다..

첫번째 paragraph에다가 jdbc interpreter로 쿼리를 날릴때 ${변수명} 을 사용하면 값 입력 폼이 생기고, 이걸 두번째 paragraph에다가 사용하면 되겠지?

해서 jdbc interpreter에다가 $${변수명을} 쓰고 조회!

--> null point exception이 아마 발생할 것이다...

3. 고민

완전 당황함.. sql 프로파일러로 들여다 보니.. 쿼리가 오지도 않음..

왜 이럴까.. 정말 몇일을 고민함..

stacksoverflow에 질문해도 답하는 놈이 없음.

https://stackoverflow.com/questions/67767714/exchanging-variables-between-different-paragraphs

youtube 동영상을 보니.. 다들 기초 예제만 하지..

이렇게 결합해서 하는 경우가 없음.

하여.. 계속 몇일을 삽질을 하다가..

겨우 알아냄..

4. 해결

가) 일단 메뉴얼이 좀 부실하다.. 내용도 좀 잘못된 것이 많음

나) 다른 interpreter는 모르겠으나, 나처럼 jdbc 사용하는 경우에 대해선 메뉴얼이 너무 허접함

다) 하여간 정답 공개

    a) 일단 공통으로 입력을 받을 폼은 첫번째 paragraph에 python으로 작성함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%python
 
dtst = z.noteTextbox("시작일", "20200101")
dted = z.noteTextbox("종료일", "20201231")
 
print("Textbox note " + dtst)
print("Textbox note " + dted)
 
arrStore = [("001", "PubDept"), ("002", "Store1"), ("003", "Store2")]
 
selStore = z.noteSelect("매장선택", arrStore )
 
print( "Select note " +  selStore )
 
 
z.z.run("paragraph_1622092568030_1007352330")
 
cs

코드 설명 : 
1. Textbox 생성시 noteTextbox를 써야 전체 입력 form으로 생성됨
2. Select도 noteSelect로 생성. 값은 편하게 알아보기 위해서 객체로 한번 선언해주고 사용했음.
3. 하단의 z.z.run 부분은 다른 paragraph를 연속해서 실행시키라는 명령임. (paragraph ID는 각자 사용하는 것을 쓰자!)

   b) 그 다음 paragraph에서 jdbc interpreter를 사용하자

1
2
3
%jdbc
EXEC USP_BIGDATA_003 '$${시작일}', '$${종료일}', '$${매장선택}';
 
cs

 코드 설명 :
1. jdbc interpreter는 이 글을 볼 정도면 알아서 잘했을 것이다. 그래도 모르겠다... 하시는 분들은.. 실력 좀 올려서 오자!! (기본적인 연동은 구글링하면 나온다... jdbc 연동 글 보기 : https://jaymz96.blogspot.com/2021/02/apache-zeppelin.html)
2. 내 경우엔 query 말고 procedure를 날려서 실행하게 했음.
3. python interpreter에서 선언한 이름을 $$개 붙여서 가져와 쓸 수 있다!!
4. 이제 전체 실행, 또는 공통 form에서 값을 입력하고 실행하면. z.z.run으로 연결된 paragraph들이 함께 실행됨을 볼 수 있다.
5. 이후는 입맛대로 진행


5. 교훈
가) 외국꺼라고 다 제대로 됐다고 생각하면 오산이다.
나) 양키 놈들도 아는척~~만 하는거지 제대로 아는 넘들은 없다
다) 네이년 다니는 쉑들도 다 사기꾼들임. 내가 더 잘났다. (옛날에 면접보고 떨어져서 이러는 거 아님.........)
라) 빅데이터는 사기이자 쑈다. 윗 선에 딱 흑세무민 하기 좋은 툴이다.

6. 끗~
이제 나도 윗선에 구라쳐서 이쁨 좀 받아보자!
진짜 끗~!



2021-07-14 내용 추가
jdbc 연동이 잘 안된다면.. 
jdbc 설정시에 zeppelin.jdbc.interpolation 이 항목이 false 라면 true 변경하라!



2021년 4월 30일 금요일

Apache Zeppelin에서 jdbc 연동시 조회할때 TLS 관련 오류 발생

0. 현재 개발환경

    - OS : Ubuntu 20.4

    - Main DB : SQL Server on Linux 2019 Express

    - 보조 DB : SQL Server 2008, SQL Server 2014

    - Java : Apache Zeppelin 권장 버전 (OPENJDK 1.8)

1. 보다시피 버전차이가 엄청 남.

2. Zeppelin에 jdbc (9.2.1) 연결을 했을때, SQL Server 2014는 아무 문제가 없음

3. SQL Server 2008에 연결시 TLS 버전을 지원 안한다는 오류 발생함.

4. 해당 서버 버전의 TLS 1.0 프로토콜이 너무 오래되서 지원을 안함.

5. 일단.. 해당 서버의 OS인 Windows 2008 R2에 TLS 1.1 / TLS 1.2 설정을 해줌.

6. 동일 에러 발생 - SQL Server 2008 자체에서 TLS 1.0 통신만 지원하는 것으로 판단.

7. jdbc 4.2를 쓰면 된다는 개소리 믿고 삽질하다가.. 다음과 같은 글 발견..

https://blog.naver.com/PostView.nhn?blogId=hgp33&logNo=221293449287&from=search&redirect=Log&widgetTypeCall=true&directAccess=false

8. 뭐 내용은 Java jdbc 보안문제로 동일함.

9. 문득 깨닮음을 얻은 나는 Ubuntu의 JRE에 있는 security 설정을 건들면 되겠다는 생각이 듬.

10. 저 링크에는 싹 지우라고 했지만... 글 자체가 3년이 넘은지라.. 

    내 목적인 TLS 관련 부분만 지움..

    jdk.tls.disabledAlgorithms 에서 TLS 1.0, TLS 1.1을 지워주자..

11. 당근 바로 안된다.. 서버 재부팅!!!

12. 해결!

13. 끗! 뭘봐!

2021년 2월 10일 수요일

Apache Zeppelin jdbc 구축기

회사에 빅데이터 분석 툴을 위해 이것저것 알아보고 조언도 듣다가..

일단은 Apache Zeppelin 을 구축해 보기로 결심..

1. 처음에는 내 로컬에 구축해서 돌려보려고 시도함.

2. 최신 버전이 2021-02-10 기준 0.9 버전인데.. 공식적으로 윈도우즈를 지원하지 않는 것으로 보임.. 어떻게든 돌려볼려고 했으나, 온갖 별의별 오류가 나와서 실패.

3. 오류 찾다가 시간 다 갈꺼 같아서.. 회사 NAS에 구축 시도.

4. 처음에는 시놀로지 NAS에 구축하다가, 콘솔 명령어가 너무 부족해서, CentOS 6.6 쓰는 파일서버로 계획 변경

5. 패키지 설치보다는 편안하게 docker로 설치하기로 결심

6. 환경이 mssql이라 mssql jdbc 드라이버 준비 (다운로드) : 최신버전으로 함 (9.2)

7. Apache Zeppelin docker image는 여기서 받음 (가보자)

8. docker 설치는 너무 쉬워서 패스, 기본 구동도 쉬워서 패스.

9. 참고글을 보고 진행함. 참고에서는 명령어를 치라고 되어 있는데, 그냥 sh 파일 만들어서 진행함.

10. 내용에서 좀 다르게 한거는 artifacts 이 경로가 실제 구동되었을때 위치가 좀 다르더만.. artifacts 안에다가 jdbc 드라이버를 넣으면 됨.

11. 참고글에는 jTDS 드라이버로 했으나, 내 환경에서는 되지 않기에 MS에서 제공하는 것으로 변경함.

12. 인터프리터 설정에서 jdbc 설정하듯이 하면 됨.. 쉽다..

13. 노트 생성하고 쿼리 날려보니 결과도 잘 나옴..

14. 자~~ 이제 뭘 해볼까...


끗!!


2018년 10월 22일 월요일

Java OpenJDK 10에서 MSSQL Connection 문제에 대해서...

Oracle의 삽질 덕분에..

혼자서 미리 피해보겠다고 OpenJDK 10으로 갈아탄 나...

덕분에 나의 최애 툴인 squirrel-sql에서 MS-SQL 접속 문제가 계속 발생한다..

로그 내용은 주로 연결 거부 또는 보안 문제로 접속을 할 수 없다인데...

웃긴건... 이클립스에도 비슷한 증상이 발생..

그래서..

운영 쪽은 JDK 1.8로 내리고.. mssql driver도 구버전으로 내렸다..

그래도 왠지 아쉬워서.. 개발환경은 어떻게든 해보려 했으나..

driver 버전과 상관없이 Java 쪽의 사정으로 연결 거부만 발생...

아마도 MS-SQL 서버의 구버전(경험상 2005 미만)들에는

동일한 문제가 발생하는 것으로 보인다..

결국은 http://jtds.sourceforge.net/ 라는 오픈소스 드라이버 적용하여 해결..

좀 허무하긴 한데.. 그래도 Java 버전 안 바꿔서 다행임..

끗!

2016년 10월 24일 월요일

MySQL에서 jdbc 연결 시 Unknown DataBase 'SID이름' 오류 발생

분명 맞는 코드를 사용했다고 생각하고 java 프로그램을 작성했는데..

DB에 테스트 연결을 할때.. 계속해서

Unknown DataBase ~~~ 오류 발생

이래저래 찾아보니.. 여러가지 이유가 나오나. 보통은 접속 정보가 잘못됨 이라는 내용들..

다시한번 코드를 잘 보니까.. Connection String에 끝에 세미콜론이 들어가서 발생한 문제...

private static String url = "jdbc:mysql://192.168.0.56:3306/glpi;";

이 코드를

private static String url = "jdbc:mysql://192.168.0.56:3306/glpi";

로 수정하니까 말끔히 해결..

지나친 Ctrl + C + V 는 오류를 동반합니다.. ㅡㅡ;;;

[낯선] 2026.06.20 이태원 MZK MuzikBar 공연

간만의 공연 이태원 비틀즈가 이전하여 MZK MuzikBar 로 새 단장 오픈을 한 뒤로 2번째 공연 새 베이시스트가 합류한 뒤로 첫 공연이기도 함.. 이래저래 틀린 부분도 많지만.. 그래도 간만에 그럭저럭 잘했다.. https://www.youtub...