참고:
- 이 사용지침서에서는 Oracle Cloud에 접근해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 완료하면 이러한 값을 클라우드 환경에 고유한 값으로 대체합니다.
마이크로 일괄 처리와 함께 Oracle Cloud Infrastructure Streaming 및 OCI Data Flow를 사용하여 AVRO 메시지 스트리밍
소개
오늘날의 데이터 중심 환경에서는 실시간 데이터 스트림을 처리 및 분석하는 기능이 통찰력을 얻고 변화하는 상황에 신속하게 대응하고자 하는 기업에 매우 중요합니다. 스트리밍 데이터 처리 기술은 대용량 연속 데이터 스트림을 처리하기 위한 강력한 솔루션으로 부상하고 있습니다. 이 자습서에서는 Oracle Cloud Infrastructure(OCI) Streaming을 사용하여 AVRO 메시지를 효율적으로 스트리밍하고, 마이크로 뱃치 처리 기술과 결합하고, 오픈 소스 FN 프로젝트를 기반으로 하는 Oracle Functions의 서버리스 기능으로 향상된 혁신적인 접근 방식을 살펴봅니다.
AVRO 및 스트리밍 데이터 소개
널리 채택된 데이터 직렬화 형식인 AVRO는 복잡한 데이터 구조와 다양한 프로그래밍 언어와의 호환성을 나타내는 효율성으로 알려져 있습니다. AVRO는 스트리밍 기술과 통합되어 거의 실시간으로 데이터를 전송 및 처리할 수 있도록 함으로써 일반적으로 배치 처리와 관련된 대기 시간 없이 중요한 통찰력을 추출할 수 있습니다.
OCI 스트리밍: 실시간 데이터 역량 강화
Oracle Cloud Infrastructure(OCI)는 클라우드에서 데이터를 처리하기 위한 다양한 툴을 보유하고 있으며, OCI Streaming은 높은 처리량의 실시간 데이터 스트림을 위한 맞춤형 서비스입니다. 개발자는 OCI Streaming을 활용하여 데이터 스트림을 효율적으로 수집, 처리 및 배포하는 확장 가능하고 신뢰할 수 있는 데이터 파이프라인을 구성할 수 있습니다.
OCI Data Flow Managed Spark: A No Lock-In 솔루션
OCI(Oracle Cloud Infrastructure) Data Flow는 인프라를 배포하거나 관리할 필요 없이 초대형 데이터 세트에서 처리 작업을 수행하는 완전 관리형 Apache Spark 서비스입니다.
마이크로 뱃치 처리 마이크로 뱃치 처리에는 시간 또는 크기를 기준으로 사용하여 수신 데이터 스트림을 컴팩트 뱃치로 분할하는 작업이 포함됩니다. 그런 다음 이러한 일괄 처리는 더 작은 작업으로 처리됩니다. 스트림 처리에서 레코드의 상수 및 개별 처리와 달리 마이크로 일괄 처리는 처리 전에 약간의 지연 및 저장을 도입하여 데이터로 수행할 작업을 더 많이 제어할 수 있습니다. 빅 데이터 세트를 일정 간격으로 처리하는 기존 일괄 처리와 달리 마이크로 일괄 처리는 거의 실시간 처리 및 결과 전달을 제공합니다.
시너지 활용: OCI Streaming, OCI Data Flow 및 Oracle Functions
이 사용지침서는 OCI Streaming, OCI Data Flow 관리형 Spark Streaming 및 Oracle Functions의 융합을 자세히 설명합니다. AVRO 인코딩 메시지를 수집하고 OCI Data Flow 관리 Spark 마이크로 뱃치 처리 기능을 사용하여 효율적으로 처리하며 Oracle Functions를 통한 서버리스 이벤트 기반 처리를 도입하는 엔드투엔드 스트리밍 데이터 파이프라인을 설정하는 프로세스를 안내합니다.
목표
OCI Streaming 및 OCI Data Flow 관리형 Spark 마이크로 뱃치 처리를 사용하여 AVRO 형식을 사용하여 효율적인 실시간 데이터 처리 파이프라인을 생성할 수 있습니다.
중요: 이 자습서는 교육 및 연구 목적으로만 설계되었습니다. 학습자가 통제된 환경에서 실험하고 실질적인 경험을 얻을 수 있는 환경을 제공합니다. 이 연습에서 사용되는 보안 구성과 연습은 실제 시나리오에 적합하지 않을 수도 있습니다.
실제 애플리케이션에 대한 보안 고려 사항은 훨씬 복잡하고 동적인 경우가 많습니다. 따라서 운용 환경에서 시연된 기술 또는 구성을 구현하기 전에 포괄적인 보안 평가 및 검토를 수행하는 것이 중요합니다. 이 검토에는 시스템이 조직의 보안 정책 및 표준에 부합하도록 하기 위해 액세스 제어, 암호화, 모니터링 및 규정 준수를 비롯한 모든 보안 측면이 포함되어야 합니다.
랩 환경에서 실제 배포로 전환할 때 보안은 항상 최우선 과제여야 합니다.
프로세스 흐름
상위 레벨 아키텍처
사전 요구사항 - Oracle Cloud Infrastructure
- 관리자 레벨 액세스 권한이 있는 Oracle 계정
- 리소스를 생성할 구획: COMPARMENT ID를 메모해 두십시오.
- 두 개의 서브넷(전용 및 공용)이 있는 VCN입니다. 네트워크 자습서 생성을 참조하십시오.
- 서브넷에 개인 및 공용 서브넷 모두에 대해 서비스 게이트웨이 및 443 및 80 포트에 대한 적절한 수신 규칙이 있는지 확인합니다.
필요 조건 - 로컬 시스템 환경
-
PRIVATE 서브넷의 Oracle Linux 컴퓨트 인스턴스 이 기능은 이 자습서 중에 배치될 OCI 스트리밍, 함수 및 컨테이너 인스턴스와 같은 PRIVATE 서브넷의 리소스에 액세스하는 데 중요합니다.
-
Oracle Linux 컴퓨트 인스턴스에 접속하고 자습서에 대한 작업을 수행할 Bastion 호스트입니다. 자세한 내용은 배스천 개요를 참조하십시오.
-
로컬 OCI-CLI 설정입니다. 자세한 내용은 CLI 자습서 설치를 참조하십시오.
-
로컬 DOCKER를 사용하여 이미지를 빌드할 수 있습니다. Oracle Linux를 사용하는 경우 Install DOCKER on Oracle Linux를 참조하십시오.
-
테스트를 위해 설치된 로컬 Python 버전 3.9.16(최소)
-
로컬 Java JDK 11.0.8
-
로컬 Maven 3.5.4
-
OCI에 함수를 배치할 수 있는 로컬 FN CLI: FN CLI 설치
작업 1: 동적 그룹 설정
-
도메인으로 이동하고 동적 그룹을 누른 후 다음 그룹을 만듭니다.
그룹 이름: MyFunctions
ALL {resource.type = 'fnfunc', resource.compartment.id = 'pasteYourCompartmentID'}
그룹 이름: ContainerIntances
ALL {resource.type='compute-container-instances', resource.compartment.id = 'pasteYourCompartmentID'}
그룹 이름: DataFlowDynamicGroup
ALL {resource.type='dataflowrun', resource.compartment.id = 'pasteYourCompartmentID'}
태스크 2: 정책 생성
-
정책으로 이동하여 다음 정책을 생성합니다.
정책 이름: FunctionsPolicies
Allow dynamic-group MyFunctions to manage objects in compartment YOUR-COMPARTMENT-NAME Allow dynamic-group ContainerIntances to manage objects in compartment YOUR-COMPARTMENT-NAME Allow dynamic-group MyFunctions to read secret-bundles in compartment YOUR-COMPARTMENT-NAME
정책 이름: StreamTopicPolicies
Allow dynamic-group ContainerIntances to read objects in compartment YOUR-COMPARTMENT-NAME Allow dynamic-group ContainerIntances use stream-push in compartment YOUR-COMPARTMENT-NAME
정책 이름: ContainerInstancesPolicy
Allow dynamic-group ContainerIntances to read repos in compartment YOUR-COMPARTMENT-NAME
정책 이름: DataFlowPolicies
Allow dynamic-group DataFlowDynamicGroup to manage objects in compartment YOUR-COMPARTMENT-NAME Allow dynamic-group DataFlowDynamicGroup to {STREAM_INSPECT, STREAM_READ, STREAM_CONSUME} in compartment YOUR-COMPARTMENT-NAME Allow dynamic-group DataFlowDynamicGroup to manage data-catalog-metastores in compartment YOUR-COMPARTMENT-NAME Allow dynamic-group DataFlowDynamicGroup to manage object-family in compartment YOUR-COMPARTMENT-NAME Allow dynamic-group DataFlowDynamicGroup to read secret-bundles in compartment YOUR-COMPARTMENT-NAME Allow service dataflow to read objects in compartment YOUR-COMPARTMENT-NAME
작업 3: 스토리지 버킷 생성 및 AVRO 스키마 업로드
-
버킷으로 이동하여 버킷 생성을 누르고 avro-schema-bucket이라는 새 버킷을 생성하여 AVRO 스키마 파일을 저장합니다.
-
이제 버킷을 선택하고 네임스페이스를 사용하지 마십시오. 나중에 필요합니다.
-
user.asvc 파일을 생성된 이 버킷에 업로드합니다.
작업 4: 전용 OCI 스트리밍 항목 생성
-
분석 및 AI로 이동한 다음 스트리밍을 누르고 FrontDoorTopic이라는 새 스트림을 생성합니다.
-
스트림 풀을 선택하고 PrivatePool을 누른 다음 Kafka 접속 설정 옵션과 TAKE NOTE 필드를 누릅니다. 나중에 필요합니다.
작업 5: AUTH TOKEN 생성
사용자에 대한 AUTH TOKEN을 생성합니다. Kafka 토픽을 사용하려면 이 토큰이 필요합니다.
-
오른쪽 상단 사용자 아이콘을 누른 다음 사용자 설정 옵션을 선택합니다.
-
Auth Tokens(인증 토큰)를 누른 다음 새 토큰을 생성하고 토큰을 주의하십시오.
작업 6: 컨테이너 레지스트리 생성
-
개발자 서비스 메뉴로 이동하여 컨테이너 레지스트리를 누르고 다음 전용 저장소를 생성합니다.
저장소 이름 유형 api-avro-sample_a 전용 api-avro-sample_b 전용 fn-recep-avro 전용 -
네임스페이스의 저장소 및 TAKE NOTE를 확인합니다.
-
OCI CLI 및 Docker가 설치된 터미널 셸을 열고 레지스트리에서 로그인을 계속합니다. 리전의 올바른 URL을 확인하십시오. 이 자습서에서는 레지스트리 URL이 gru.ocir.io인 브라질 동부(상파울로)를 사용하고 있습니다.
docker login gru.ocir.io Username: <your container namespace>/youruser Password: YOUR_AUTH_TOKEN_CREATED_EARLIER
작업 7: OCI 저장소 생성
OCI Vault를 생성하고 이 자습서 뒷부분에서 사용할 필요한 변수를 제공합니다.
-
Identify & Security로 이동하고 Vault를 누른 다음 Create Vault를 누릅니다.
-
새 저장소를 선택하고 이에 대한 마스터 암호화 키를 생성합니다.
-
AUTH_KEY라는 새 암호를 만들고 이전에 만든 인증 키를 붙여 넣습니다.
-
암호 생성 프로세스를 반복하고 다음 새 암호를 생성합니다.
변수 이름 값 KAFKA_BOOTSTRAPSERVER "OCI Streaming 구성의 부스트랩 서버" KAFKA_TOPIC “FrontDoorTopic” KAFKA_USERNAME "OCI 스트리밍 구성의 사용자 이름 + 스트림 풀 ID" AUTH_KEY "이전 단계에서 생성한 AUTH 토큰" -
각 암호에 대해 생성된 비밀 OCID를 기록하고 새 구성 파일을 생성합니다.
-
config.properties 파일에는 응용 프로그램에서 저장소 암호 ocids로의 매핑 변수가 포함되어 있습니다. 애플리케이션은 이 파일을 사용하여 런타임 중 수집해야 하는 저장소 암호를 식별합니다.
-
OCI-CLI에 액세스할 수 있는 로컬 시스템에 새 파일을 생성합니다.
각 Secreat에 대한 OCID로 바꿉니다.
파일 이름: config.propertieskafka_bootstrapserver_vaultOCID=ocid1.vaultsecret.REPLACE-WITH-YOURS kafka_topic_vaultOCID=ocid1.vaultsecret.REPLACE-WITH-YOURSxxxxxx kafka_username_vaultOCID=ocid1.vaultsecret.REPLACE-WITH-YOURS auth_token_vaultOCID=ocid1.vaultsecret.oc1.REPLACE-WITH-YOURS
-
-
버킷으로 이동하고 버킷 생성을 누르고
config.properties
파일을 저장할 config라는 새 버킷을 생성합니다. -
config.properties 파일을 스토리지 버킷 config로 업로드합니다.
ls -lrt config.properties oci os object put -bn config --file config.properties --force
작업 8: 간단한 AVRO 메시지를 만들고 제공된 샘플 python 코드를 사용하여 파일에 저장
-
OCI CLI, Docker 및 Python3가 설치된 셸 터미널을 열고 이전에 오브젝트 스토리지에서 업로드한 것과 동일한 AVRO 스키마를 기반으로 한 단일 메시지를 포함하는 새 AVRO 파일을 생성합니다.
참고: 이 자습서에서 Python 3.9.16을 사용하고 있으므로 Python 버전을 확인해야 합니다. 이전 버전은 작동하지 않을 수 있습니다.
-
Create_avro_sample.zip에서 코드를 가져옵니다.
-
선택한 위치에 압축을 풀고 프로그램을 실행하여 샘플 AVRO 메시지를 생성합니다.
cd ~ mkdir create_avro_sample cd create_avro_sample unzip CreateAVRO_SampleFile.zip # Check the files are there ls -lrt # install the python dependencies on requirements.txt pip3 install -r requirements.txt # Run the program and create an AVRO message file python3 create_avro_sample.py meu_file.bin '{"id":10029,"name":"John","email":"john@bla.com"}'
작업 9: AVRO 메시지를 수신하고 OCI Streaming 주제에 게시할 OCI 함수 생성
-
개발자 서비스로 이동하고 함수에서 애플리케이션을 누른 다음 애플리케이션 생성을 누릅니다.
-
Docker, OCI CLI, FN CLI가 설치된 터미널 셸로 이동하고 다음 명령을 실행하여 기능을 초기화합니다.
참고: 단계를 수행한 경우 지금 Docker 로그인 명령이 이미 실행된 것입니다. 실행되지 않은 경우 컨테이너 레지스트리 생성 작업의 Docker 로그인 단계를 진행하십시오.
fn create context oci-cloud --provider oracle fn use context oci-cloud fn update context oracle.compartment-id PASTE_YOUR_COMPARTMENT_OCID fn update context api-url https://functions.sa-saopaulo-1.oraclecloud.com fn update context registry gru.ocir.io/PASTE_YOUR_REGISTRY_NAMESPACE
참고: 이 자습서에서는 브라질 동부(상파울로) 지역을 사용 중입니다. 다른 지역을 사용 중인 경우 api-url 및 레지스트리 위치를 변경해야 합니다.
-
간단한 Hello-world 함수를 만들어 모든 설정이 올바른지 확인합니다.
fn init --runtime python fn-recep-avro cd fn-recep-avro fn deploy --app MyReceptionApp fn invoke MyReceptionApp fn-recep-avro
-
fn-recep-avro.zip 파일에서 AVRO 함수 샘플 코드를 확인하고 이전에 만든 hello-world 코드를 대체합니다. 작동하려면 func.py 및 requirements.txt 파일이 모두 있어야 합니다.
# Check you have the right code for func.py & requirements.txt (you got from zip file) ls -lrt
-
새 코드 작성 및 함수 배치
fn deploy --app MyReceptionApp
-
함수를 호출하려면 AVRO 메시지를 매개변수로 전달해야 합니다. 이 경우 이전 단계에서 생성된 샘플 AVRO 메시지 파일이 사용됩니다. 함수를 처음 호출하면 함수를 시작해야 하기 때문에 시간이 약간 더 걸립니다.
# Check where you created the sample avro message file ls -lrt ../create_avro_sample/ # Invoke the function to check if it's working as expected echo -n -e "$(cat ../create_avro_sample/meu_file.bin)" | fn invoke MyReceptionApp fn-recep-avro
작업 10: 함수를 노출할 API 게이트웨이 생성
-
콘솔에서 개발자 서비스, API 관리, 게이트웨이, 게이트웨이 생성을 차례로 누릅니다.
-
생성되면 배치 옵션을 누른 다음 배치 생성을 누릅니다.
이름: RecepFunction
경로 접두어: /- Authentication에서 No Authentication(인증 없음)을 선택합니다. 이 연습은 단순하고 API 인증이 구현되지 않기 때문입니다. 이 연습의 주된 목적은 API를 통해 바이너리 AVRO 메시지를 전달하는 HTTPS 호출을 시연하는 것이며, 이 연습의 목적상 이 간단한 실습을 위한 인증 방법을 구현하지 않을 것입니다.
- 실제 환경으로 앞으로 이동하기 전에 API Gateway에 대한 보안 모범 사례를 따르는지 확인하십시오.
- 자세한 내용은 API 게이트웨이 및 리소스 보안을 참조하십시오.
경로 1: 경로:/
메토: POST
백엔드 유형: Oracle 함수
애플리케이션: 함수를 선택합니다. -
API 게이트웨이 끝점을 확인하고 기록해 둡니다.
-
Linux 셸 터미널을 열고 API 게이트웨이를 호출합니다. API URL을 이전 단계에서 확인한 올바른 엔드포인트로 바꿉니다.
cd create_avro_sample/ ls -lrt curl -X POST -H "Content-Type: application/octet-stream" \ -d "$(echo -n -e "$(cat meu_file.bin)")" \ https://xxxxxxxxxxxxx.apigateway.sa-saopaulo-1.oci.customer-oci.com/
체크포인트
작업 11: API 유형 A에 대한 컨테이너 이미지 빌드
참고: 두 개의 서로 다른 API를 시뮬레이션하기 위해 API 유형 A 및 B 코드는 기본적으로 다른 헤더 메시지에서만 동일합니다.
-
API type A에서 코드를 가져와서 Linux 셸 터미널 api-avro-sample_a.zip에 압축을 풉니다.
-
이전 단계에서 실행한 컨테이너 레지스트리 네임스페이스를 가져오고 아래 패턴에 따라 애플리케이션 레지스트리 위치를 생성합니다. ocir url은 지역(예: Brasil East(SaoPaulo)의 경우 gru.ocir.io)을 기반으로 합니다.
[ocir url]/[네임스페이스]/api-avro-sample_a:latest
-
Linux 셸 터미널에서 이 API에 대한 도커 이미지를 빌드하고 푸시합니다.
ls -lrt docker build . -t gru.ocir.io/yournamespace/api-avro-sample_a:latest docker push gru.ocir.io/yournamespace/api-avro-sample_a:latest
작업 12: API 유형 B에 대한 컨테이너 이미지 빌드
-
API type B에서 코드를 가져와서 Linux 셸 터미널 api-avro-sample_b.zip에 압축을 풉니다.
-
이전 단계에서 실행한 컨테이너 레지스트리 네임스페이스를 가져오고 아래 패턴에 따라 애플리케이션 레지스트리 위치를 생성합니다. ocir url은 지역(예: Brasil East(SaoPaulo)의 경우 gru.ocir.io)을 기반으로 합니다.
[ocir url]/[네임스페이스]/api-avro-sample_b:latest
-
Linux 셸 터미널에서 이 API에 대한 도커 이미지를 빌드하고 푸시합니다.
ls -lrt docker build . -t gru.ocir.io/yournamespace/api-avro-sample_b:latest docker push gru.ocir.io/yournamespace/api-avro-sample_b:latest
-
이미지가 성공적으로 푸시된 경우 컨테이너 레지스트리 페이지를 확인하십시오.
작업 13: 컨테이너 서비스에 API 배치
-
개발자 서비스, 컨테이너 인스턴스로 이동하고 컨테이너 인스턴스 생성을 누릅니다.
-
API-type-b에 대해 1단계를 반복하고 TYPE B API에 대해 올바른 이미지를 선택합니다.
-
Developer Services, Container Instances(컨테이너 인스턴스)로 이동하고 Create container instance(컨테이너 인스턴스 생성)를 누른 후 API type B(API 유형 B) 배치 단계를 반복합니다.
-
컨테이너 인스턴스에서 내부 FQDN 주소를 가져옵니다.
- 컨테이너 인스턴스를 누르고 각 내부 FQDN 주소를 기록해 둡니다.
-
Identify & Secutiry로 이동하여 저장소를 누르고 VAULT를 선택하고 두 개의 새 암호를 생성합니다.
암호 이름 값 API_TYPE_A_URL API 유형 A에 대한 내부 FQDN 개인 주소 붙여넣기 API_TYPE_B_URL API 유형 B에 대한 내부 FQDN 개인 주소 붙여넣기 각 암호 OCID를 기록해 둡니다.
저장소는 지금 다음과 유사해야 합니다.
-
config 스토리지 버킷에 업로드한 config.properties 파일을 편집하고 암호 OCID에 대한 새 항목을 추가합니다.
ls -lrt config.properties vi config.properties api_type_a_url_vaultOCID=paste_API_TYPE_A_URL_secretOCID api_type_b_url_vaultOCID=paste_API_TYPE_B_URL_secretOCID # After save, please upload the new version to Object Storage cat config.properties oci os object put -bn config --file config.properties --force
파일은 다음과 같아야 합니다.
-
작업 14: create_avro_sample.py을 사용하여 API 테스트
-
create_avro_sample.py를 작업 7에서 저장한 Linux 셸 터미널로 이동하고 새 메시지를 만들어 API 호출을 테스트합니다. Spark Stream(DataFlow) 프로그램 내에서 필터로 사용할 ID가 서로 다른 AVRO 파일 2개(1010년 1020년)를 만들고 있습니다.
ls -lrt python3 create_avro_sample.py type_a_message.bin '{"id":1010,"name":"Paul that goes to API type A","email":"paul@bla.com"}' python3 create_avro_sample.py type_b_message.bin '{"id":1020,"name":"Mary that goes to API type B","email":"mary@bla.com"}'
-
AVRO 메시지를 전달하여 테스트할 API를 호출하면 정상적으로 작동합니다. 컨테이너 인스턴스 페이지로 이동하여 각 API api-type-a 및 api-type-b에 대한 내부 FQDN 주소를 가져옵니다. API에서 해당하는 내부 FQDN 주소에 대해 아래 URL을 바꿔야 합니다.
ls -lrt type* curl -i -X POST -H "Content-Type: application/octet-stream" \ --data-binary "@type_a_message.bin" \ xxx.xx.x.xxx curl -i -X POST -H "Content-Type: application/octet-stream" \ --data-binary "@type_b_message.bin" \ xxx.xxx.xx.xxx
작업 15: Java Spark 스트리밍 애플리케이션 설정
-
버킷으로 이동하여 버킷 생성을 누르고 dataflow-app-avro 및 dataflow-logs-avro라는 두 개의 새 버킷을 생성합니다. 이 버킷은 Java 애플리케이션을 업로드하는 데 사용됩니다.
-
Java 환경 버전을 다시 확인하십시오.
Java
java 11.0.8 2020-07-14 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.8+10-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode)
Maven
Apache Maven 3.5.4 (Red Hat 3.5.4-5) Maven home: /usr/share/maven Java version: 11.0.20, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.20.0.8-3.0.1.el8.x86_64 Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux", version: "5.15.0-103.114.4.el8uek.x86_64", arch: "amd64", family: "unix"
-
샘플 코드를 다운로드하고 oci-cli, docker, java, maven: spark-consume-avro-message.zip가 있는 로컬 환경에 압축을 풉니다.
unzip spark-consume-avro-message.zip cd spark-consume-avro-message ls -lrt
프록시 코드를 자세히 검토하여 컨테이너 인스턴스 유형 A 및 B를 호출합니다.
주 프로그램 파일 .src/main/java/example/Example.java....
을 확인합니다.
-
이 Java 프로그램은 lib를 사용하여 spark-avro를 처리하므로 데이터 플로우에 전달하려면 종속성을 패키지화해야 합니다. 이를 위해 추가 세부정보가 필요한 경우 Data Flow Dependency Packager를 사용하여 Data Flow Dependency Packager로 이동할 수 있습니다.
org.apache.spark:spark-avro_2.12:3.2.1 패키지가 packages.txt 파일에 이미 선언되어 있으므로 다음을 실행하여 패키지화하면 됩니다.
docker run --privileged --platform linux/amd64 --rm -v $(pwd):/opt/dataflow --pull always -it phx.ocir.io/oracle/dataflow/dependency-packager:latest -p 3.8
-
oci-cli를 사용하여 archive.zip 파일을 dataflow-app-avro라는 스토리지 버킷에 업로드합니다.
oci os object put -bn dataflow-app-avro --file archive.zip --force
-
Java 애플리케이션을 컴파일, 패키지화하여 스토리지 버킷 dataflow-app-avro에 업로드합니다.
ls -lrt mvn clean install
... 컴파일 로그 행 수가 감소되었습니다.# upload the JAR file to the storage bucket oci os object put -bn dataflow-app-avro --file target/consumekafka-1.0-SNAPSHOT.jar --force
-
현재 dataflow-app-avro 스토리지 버킷을 확인하고 이런 모습인지 확인합니다.
-
분석 및 AI로 이동한 다음 데이터 레이크에서 데이터 플로우를 누르고 왼쪽 메뉴 전용 끝점을 선택하고 전용 끝점 생성을 누릅니다.
-
전용 끝점은 컨테이너 인스턴스 및 OCI 스트리밍 풀에 대해 전용 서브넷을 사용 중이므로 필요합니다.
-
DNS 영역을 OCI 컨테이너 인스턴스의 내부 FQDN으로 채우고 OCI 스트리밍 풀을 콤마로 구분하여 채우십시오.
-
-
분석 및 AI로 이동한 다음 데이터 레이크에서 데이터 플로우를 누르고 애플리케이션 생성을 누릅니다.
-
생성된 후 spark-lab-avro 데이터 플로우를 선택하고 Run을 눌러 프로그램을 시작합니다. 일반적으로 시작하려면 최대 8분이 걸립니다.
-
-
Running dataflow 애플리케이션을 확인하고 현재 작업을 표시하고 앱이 작동 중인 SparkUI를 엽니다.
작업 16: 플로우 검증
함수를 호출하고 메시지를 전달하여 모든 플로우가 예상대로 작동하는지 확인합니다.
-
샘플 메시지 type_a_message.bin 및 type_b_message.bin을 만든 Linux 셸 터미널을 열고 메시지를 보냅니다. API 게이트웨이 생성에서 가져온 올바른 끝점으로 API URL을 바꿉니다.
cd create_avro_sample/ ls -lrt curl -X POST -H "Content-Type: application/octet-stream" \ -d "$(echo -n -e "$(cat type_a_message.bin)")" \ https://xxxxxxxxxxxxx.apigateway.sa-saopaulo-1.oci.customer-oci.com/
-
컨테이너 인스턴스에서 로그를 확인하여 API 유형 A가 호출되었는지 확인합니다.
프로세스를 반복하여 type_b_message.bin 파일을 보낼 수 있으며 이 경우 B 컨테이너 인스턴스 유형을 호출합니다.
관련 링크
승인
- 작성자 - Joao Tarla(Oracle LAD A-Team 솔루션 엔지니어)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer를 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Stream AVRO Messages with Oracle Cloud Infrastructure Streaming and OCI Data Flow with Micro-Batch processing
F86501-01
September 2023
Copyright © 2023, Oracle and/or its affiliates.