Java UDF의 생성과 게시
UDF는 기본 변환으로 표현하기 어려운 로직이나 외부 Java 라이브러리를 Pipeline Builder 및 Code Repositories에서 실행하는 방법입니다. 공통 로직을 버전으로 관리하고 필요한 파이프라인에서 갱신할 수 있습니다. 가능하면 최적화된 기본 변환을 먼저 사용합니다.
UDF에는 Palantir 클라우드 호스팅 환경이 필요합니다. Pipeline Builder는 row map, flat map, keyed process와 keyed co-process를 지원하며 async custom 및 async deployed app UDF는 아직 지원하지 않습니다. Builder 게시 경로는 Rubix 환경에서 제공합니다.
저장소 생성
프로젝트에서 New > Code Repository를 선택하고 Foundry UDF Definitions > Map UDF Definition/Implementation으로 초기화합니다.
로컬 IDE가 권장되지만 Code Repositories에서도 작성할 수 있습니다. 정의 YAML에 이름과 입출력을 작성하고 구현 및 예제에서 생성한 인터페이스를 구현합니다.
로컬 개발
Work locally에서 생성한 저장소 주소로 clone합니다. 주소의 인증 정보는 공유하지 않습니다.
복제한 저장소의 터미널에서 사용할 IDE에 맞춰 엽니다.
./gradlew idea open
Eclipse 경로는 다음과 같습니다.
./gradlew eclipse open
| 작업 | IntelliJ | Eclipse |
|---|---|---|
| 정의 또는 Java 구현 변경 후 코드 생성 | ./gradlew idea | ./gradlew eclipse |
| Builder 등록 lockfile 생성 | ./gradlew generateEddieLockfile | 같음 |
| 예제 테스트만 실행 | ./gradlew test --tests examples.ExamplesTest.testExamples | 같음 |
| 모든 테스트 실행 | ./gradlew test | 같음 |
로컬 변경을 commit하고 push한 뒤 Code Repositories의 새 commit 안내에서 Update to most recent version으로 갱신합니다.
웹 편집기
로컬 IDE를 사용할 수 없다면 Code Repositories에서 파일을 수정하고 아래 Task Runner의 Java 탭을 사용합니다.
| 작업 | Task Runner 명령 |
|---|---|
| 정의와 구현의 코드 생성 | generateUdfResources |
| Builder 등록 lockfile 생성 | generateEddieLockfile |
| 테스트 | test |
생성 파일은 웹 편집기에서 보이지 않지만 코드 완성에 사용됩니다. 정의뿐 아니라 factory나 구현 클래스를 바꾼 뒤에도 코드 생성을 다시 수행하여 컴파일 오류를 확인합니다.
Pipeline Builder에 게시
- Java Task Runner 또는 로컬 wrapper에서
generateEddieLockfile을 실행합니다. - 생성한 lockfile과 코드 변경을 commit합니다.
0.0.1같은 release 버전으로 tag를 만듭니다.- Tag checks가 통과해야 게시됩니다. 실패하면 Builder에 발행되지 않습니다.
- Builder에서
Reusables > User-defined functions > Import UDF를 엽니다. - UDF를 골라
Add로 가져옵니다. 이후 변환 선택기에 나타납니다.
Lockfile은 UDF 이름에 연결할 고유 ID를 보관합니다. 게시 뒤 이름을 바꾸거나 lockfile 항목을 삭제 후 재생성하면 새 ID가 생겨 별도 UDF로 등록됩니다. 이전 이름과 새 이름의 버전이 모두 가져오기 목록에 나타날 수 있습니다.
Builder 등록에는 lockfile이 필수입니다. Code Repositories의 배포 저장소만 사용할 때는 Builder 등록용 lockfile이 필요하지 않습니다.
새 버전 사용
YAML이나 코드를 고친 뒤 구현 및 게시 단계를 다시 진행합니다. 사용하는 Builder 파이프라인의 Reusables > User-defined functions에서 Edit version으로 새 버전을 선택합니다. 발행했다고 기존 모든 파이프라인이 자동으로 바뀌는 것은 아닙니다.
게시한 UDF를 Builder에서 unpublish할 수는 없습니다. Lockfile을 지우고 다시 생성하는 방식은 제거가 아니라 중복 등록을 일으킵니다.
배포 저장소로 실행
UDF 저장소의 변경을 commit하고 tag를 발행한 뒤 checks가 성공하면 별도 deployment repository를 만듭니다.
- 스트리밍은
Foundry UDF Definitions > Foundry Streaming UDF Deployment를 사용합니다. - 배치는
Foundry UDF Definitions > Foundry Batch UDF Deployment를 사용합니다.
배포 템플릿에 구현 저장소의 발행 버전과 입력 및 출력 구성을 연결합니다. 이후 새 UDF 버전을 적용하려면 배포 저장소의 build.gradle 의존성 tag 버전도 갱신합니다.
코드 생성 오류
YAML을 해석할 수 없으면 코드 생성이 시작되지 않을 수 있습니다. Code Assist task failed의 오류를 확인하고 필수 필드와 오타를 YAML 계약에 맞춥니다.
계속 실패하면 아래의 Code Assist running에 마우스를 올려 Refresh를 선택합니다. 로컬에서 ./gradlew idea 또는 ./gradlew eclipse를 실행하면 콘솔의 생성 오류를 확인할 수 있습니다.
로컬 Java와 Gradle 비호환
Unsupported class file major version을 포함한 generic class cache 오류는 Java와 Gradle 버전이 맞지 않을 때 발생할 수 있습니다. ./gradlew --version으로 wrapper와 JVM을 확인하고 호환되는 JDK를 선택합니다. JAVA_HOME은 선택한 JDK 설치 루트를 가리켜야 하며 macOS 배포본에서는 Contents/Home 경로를 사용하는 경우가 있습니다.
Task Runner가 시작되지 않음
Failed to start Java server가 나타나거나 lockfile task를 실행하지 못하면 다음을 확인합니다.
- 저장소 템플릿이
0.517.0이상이어야 합니다.Display settings > Show hidden files and folders를 켜서templateConfig.json을 봅니다. - 오래된 템플릿이면 오른쪽
... > Upgrade로 PR을 만들고 승인 및 병합한 뒤 checks가 통과하면 workspace를 다시 빌드합니다. - Workspace가 연결되어 있어야 합니다. 연결되지 않으면 다시 빌드합니다.
- Task Runner의
Eclipse Java가 아니라Java탭을 선택합니다.