2016년 12월 22일 목요일

[TALEND] java.lang.OutOfMemoryError 해결 방법

OutOfMemory 원인과 해결 방안

<발생 원인>

  1. Job실행 시, Load & Transform하는 데이터가 메모리 사이즈보다 큰 경우
  2. 처리과정에서 buffer기능을 사용하여 메모리를 많이 사용하는 경우

<해결 방안>

  1. Job을 특정 조건으로 여러개 Job 으로 분리하여 처리
    큰 사이즈의 XML 파일을 처리 중 에러가 발생하면, 여러개 XML로 Split하여 처리
  2. JVM Heap 메모리 사이즈를 늘려서 실행
    JAVA 32bit 인 경우, 최대 Heap 메모리 사이즈가 4GB

[JVM Heap 메모리 사이즈 늘리는 방법]

  1. [프로젝트 단위]로 설정하는 방법(Job의 기본 값)
    1) [Window] -> [Preferences] 클릭
    2) [Talend] -> [Run/Debug] -> [Job Run VM arguments]에서 메모리 설정 변경
  2. [단일 Job 단위]로 설정하는 방법(Job별 별도 설정)
    1) [Run] -> [Advanced settings] 에서 [Use specific JVM arguments] 체크 박스 클릭
    체크가 되어 있지 않으면, 프로젝트 단위에서 설정한 사이즈가 기본 값으로 설정됨
    2) 메모리 사이즈를 변경
    위 화면에서 설정한 옵션 의미
    -Xms1024M : 초기 Heap 메모리를 1GB로 설정
    -Xmx10G : 최대 Heap 메모리를 10GB로 설정(Java가 64bit 일 경우에만)

2016년 12월 21일 수요일

[TALEND] tOracleRow에서 다중 SQL 사용하기

<사용방법>

ORACLE

PL/SQL 문의 “BEGIN ~~ END;” 형태를 이용하면 다중 SQL(INSERT~SELECT / DELETE / DDL 등)을 하나의 tORacleRow 에서 실행
DDL 문은 EXECUTE IMMEDIATE '<DDL>'; 문장으로 실행

MYSQL

tMysqlRow의 JDBC Parameter에 “allowMultiQueries=true”를 입력하고, DDL을 포함한 SQL을 연달아 입력하여 실행
다중 SQL 실행 시, 중간 SQL에서 오류가 발생하면 이하 SQL은 수행되지 않음

2016년 12월 14일 수요일

[TALEND] HashMap 객체 데이터로 출력하기

<변환방법>

  1. tSetGlobalVal(또는 tJava)에 HashMap 객체 생성
    tJava의 Advanced settings에 “import java.util.*”를 선언해야 HashMap을 사용할 수 있습니다.

  2. 생성된 HashMap 에 데이터 입력

  3. tSetGlobalVal에 tJavaFlex를 연결(OnSubjobOK)하고, tJavaFlex의 Edit Schema를 클릭하여 아래와 같이 컬럼 추가

  4. tJavaFlex의 “Start Code”와 “End Code”는 HashMap.Size()만큼 for문 수행 시키고, “Main code”에 아래와 같이 코딩
    row(Main)형태로 연결한 링크는 Schema형태의 객체로 데이터를 넘겨주는 것이기 때문에 아래 코딩과 같이 매핑

  5. 실행 후 HashMap 데이터 확인

2016년 12월 12일 월요일

[TALEND] Iterate를 이용하여 병렬처리(Parallel) 사용하기

<설정 방법>

tFilelist, tFlowToIterate 등에서 사용하는 Iterate Link를 이용하여 병렬 설정을 할 수 있다.
  1. Iterate Link 선을 클릭
  2. “Enable parallel excution” 체크
  3. “Number of parallel execution”에 원하는 pallele 개수 입력
    <참고 1>
     
    <참고 2>
       
    참고 : Parallel로 실행 시, Iterate line이후 Component는 쓰레드로 동시에 실행됨

<사용 방법>

  1. tFileList에서 폴더 안의 다수 파일명을 조회하여, 각각의 파일을 병렬처리로 DB에 입력
    • 참고 <참고 1>
  2. DB에 읽은 데이터를 tFlowToIterate로 변수화 하여, 그 변수를 t(DB)input 의 조건값으로 넘기며 병렬로 이후 Flow 실행
    • 참고 <참고 2>

[TALEND] "Insert or Update" 와 "Update or Insert" 차이

<구동원리>

Insert or Update :

  1. 대상 Row를 DB에 조회
    SELECT COUNT() FROM 테이블 WHERE KEY컬럼 = ?
  2. 조회 건수가 0이면 INSERT, 아니면 UPDATE 실시
    DB call 횟수 : ROW건수 * 2

Update or Insert :

  1. 대상 건을 UPDATE 수행
  2. 결과 건수가 0이면, INSERT 실시
    DB Call 횟수 : UPDATE 건수 + (INSERT 건수 2)
          (SELECT 건수 + INSERT/UPDATE 건수)

<차이점>

  • Insert or Update는 모든 Row를 INSERT/UPDATE 대상인지 확인하기 위해 SELECT로 조회하기 때문에 더 많은 DB Call 이 발생 함
    (모니터링 중인 DBA가 있다면, 호출 가능성 68.2893%..)

<결론>

  • 두 옵션에 대해 결과는 동일함
  • INSERT 건수가 UPDATE 건수보다 더 많은 경우 : INSERT or UPDATE 추천
  • UPDATE 건수가 INSERT 건수보다 더 많은 경우 : UPDATE or INSERT 추천

[TALEND] TALEND의 쿼리 질의기 사용 방법

Talend 기본 SQL Builder 사용하기 본 내용은 간단한 TIP이지만, 많은 사람들이 모르는 것 같아 포스팅합니다. TOS에서 흔히 INPUT 컴퍼넌트에서 사용한 쿼리를 별로의 쿼리 툴에서 조회해야하는 경우가 발생합니다. 이럴때 TOS...