| 프로세서 | 용도 | 주요 설정 |
|---|---|---|
| ExecuteStreamCommand | FlowFile 을 표준 입력으로 넘기고 출력을 받을 때 | Command Path /bin/bash, Command Arguments /opt/nifi/scripts/run.sh;arg1;arg2, Argument Delimiter ;, Working Directory |
| ExecuteProcess | 입력 없이 주기적으로 실행 | Command /bin/bash, Command Arguments 스크립트 경로, Batch Duration |
| ExecuteScript (Groovy) | 스크립트 안에서 직접 호출 | ['/bin/bash','-c','/path/run.sh'].execute() 후 waitFor() |
스크립트에 실행 권한(chmod +x)이 있어야 하고 NiFi 실행 계정(보통 nifi)이 파일과 작업 디렉터리에 접근할 수 있어야 한다. 절대 경로를 쓰고, 컨테이너로 돌리는 NiFi 는 컨테이너 안의 경로를 준다. sudo -u nifi ./cde ... 처럼 다른 계정 도구를 부를 때는 그 계정의 홈에 설정 파일(~/.cde/config.yaml 등)이 있어야 한다.
Working Directory 는 스크립트가 상대 경로를 쓸 때의 기준 디렉터리다. 스크립트를 절대 경로로 부르면 없어도 동작하지만, 스크립트 안에서 상대 경로로 파일을 읽고 쓰는 경우가 흔하므로 명시해 두는 편이 안전하다.
ExecuteProcess 는 입력 요구사항이 FORBIDDEN 이라 상류에서 FlowFile 을 받지 못한다.[1] 스케줄로만 돌고 결과는 새 FlowFile 로 나간다. FlowFile 의 속성값을 인자로 실어 보내야 한다면 선택지는 ExecuteStreamCommand 뿐이다.
속성 이름도 서로 다르다. 명령 자체를 적는 칸이 ExecuteStreamCommand 는 Command Path, ExecuteProcess 는 Command 다.[1:1][2]
Argument Delimiter 의 기본값이 다르다. ExecuteStreamCommand 는 ; 이지만 ExecuteProcess 는 공백 이다.[1:2][2:1] ExecuteProcess 의 Command Arguments 에 /opt/scripts/run.sh;editor_test 라고 적으면 세미콜론까지 포함한 덩어리가 인자 하나로 넘어가 No such file or directory 가 난다. 두 프로세서를 오가며 설정을 복사할 때 가장 자주 걸리는 지점이다.
구분자는 인자값 안에 절대 등장하지 않는 문자 로 고른다. SQL 처럼 ; 이 값에 섞여 들어가는 인자를 넘긴다면 , 나 | 로 바꾼다. 공백을 구분자로 쓰면 값에 공백이 하나만 들어가도 인자가 쪼개지므로 ExecuteStreamCommand 에서는 기본값 ; 을 그대로 두는 편이 낫다.
ExecuteProcess 의 Batch Duration 을 "그 시간 동안 명령을 반복 실행한다" 로 읽기 쉬운데 그렇지 않다. 오래 도는 프로세스가 표준 출력으로 계속 텍스트를 뱉을 때, 그 구간 동안 모인 출력을 하나의 FlowFile 로 끊어 내보내고 다음 구간을 새로 시작하는 값이다.[2:2] 명령이 끝날 때까지 기다리지 않고 중간 결과를 흘려보내려고 두는 설정이다.
비워 두면 프로세스가 끝난 뒤 출력 전체가 FlowFile 하나로 나간다. API 를 한 번 호출하고 끝나는 스크립트라면 비워 두면 된다.
터미널에서는 되는데 NiFi 에서만 반응이 없다면 아래 순서로 좁힌다.
echo "$(date '+%F %T') 시작 인자=[$1]" >> /tmp/nifi_debug.log 를 넣고 파일이 생기는지 본다. 아무것도 안 찍히면 스크립트가 아예 호출되지 않은 것이므로 경로·권한 문제다.nifi-app.log 를 본다.sudo -u nifi /bin/bash /opt/nifi/scripts/run.sh arg1 로 NiFi 계정 자격으로 직접 돌려 본다.스크립트가 호출은 되는데 중간에 죽는다면 환경변수를 의심한다. NiFi 가 부르는 프로세스는 로그인 셸이 아니라 .bash_profile · .bashrc 를 읽지 않으므로 PATH · JAVA_HOME · HOME · KRB5CCNAME 이 대화형 셸과 다르다. 스크립트 상단에서 필요한 값을 직접 선언하거나, ExecuteStreamCommand 의 동적 속성으로 환경변수를 넘긴다 — 이름이 command.argument.<순번> 패턴이 아닌 동적 속성은 모두 환경변수로 전달된다.[1:3]
실제로 넘어간 인자는 Data Provenance 의 Attributes 탭에서 execution.command.args 속성으로 확인한다. 종료 코드는 execution.status, 표준 오류는 execution.error 에 담긴다.[1:4]
RPG 는 Site-to-Site 프로토콜로 다른 NiFi 인스턴스와 FlowFile 을 주고받는 컴포넌트다. 송신 쪽은 RPG 에 원격 NiFi URL 을 등록하고, 수신 쪽 원격 NiFi 의 루트 그룹에 Input Port 또는 Output Port 가 있어야 한다. 활성화하면 원격 포트를 자동 탐색해 목록에 보여 준다.
| 항목 | 내용 |
|---|---|
| 전송 프로토콜 | HTTP 또는 RAW(TCP) |
| 보안 | TLS. 양쪽 인증서를 서로 신뢰해야 한다 |
| 로드밸런싱 | 원격이 클러스터면 노드 간 자동 분산 |
| Back Pressure | 원격 포트 큐 상태에 따라 전송 조절 |
MiNiFi → NiFi 수집, 엣지 → 중앙 클러스터, DMZ 경계 통신에 쓴다. 방화벽에서 원격 NiFi 의 HTTPS 포트(8443 등)와 RAW 사용 시 nifi.remote.input.socket.port 를 열어야 하고, 클러스터면 모든 노드에 접근 가능해야 한다.
ExecuteStreamCommand 2.12.0 — Command Path · Argument Delimiter 기본값 ; · Command Arguments Strategy · 동적 속성의 환경변수 취급 · execution.* 속성. https://nifi.apache.org/components/org.apache.nifi.processors.standard.ExecuteStreamCommand/ — 2026-09-21 확인 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
ExecuteProcess 2.12.0 — 입력 요구사항 FORBIDDEN · Argument Delimiter 기본값 공백 · Batch Duration 의 의미. https://nifi.apache.org/components/org.apache.nifi.processors.standard.ExecuteProcess/ — 2026-09-21 확인 ↩︎ ↩︎ ↩︎