Spark 애플리케이션 REST API
IBM Analytics Engine 서버리스 플랜은 REST API를 제공하여 Spark 애플리케이션을 제출하고 관리합니다. 지원되는 작업은 다음과 같습니다:
- 필수 인증 정보 가져오기 및 권한 설정.
- Spark 애플리케이션 제출.
- 제출된 Spark 애플리케이션의 상태 검색.
- 제출된 Spark 애플리케이션의 세부사항 검색.
- 실행 중인 Spark 애플리케이션 중지.
사용 가능한 API에 관한 설명은 서버리스 플랜에 대한 IBM Analytics Engine REST API를 참조하십시오.
이 주제의 다음 절은 각 Spark 애플리케이션 관리 API에 대한 샘플을 보여줍니다.
필수 인증 정보 및 권한
Spark 애플리케이션을 제출하려면 먼저 인증 정보를 가져와 Analytics Engine 서버리스 인스턴스에서 올바른 권한을 설정해야 합니다.
- 인스턴스를 프로비저닝할 때 기록한 서비스 인스턴스의 GUID가 필요합니다. GUID를 기록하지 않은 경우 서버리스 인스턴스의 GUID 검색을 참조하십시오.
- 필수 조작을 수행하려면 올바른 권한이 있어야 합니다. 사용자 권한을 참조하십시오.
- Spark 애플리케이션 REST API는 IAM 기반 인증 및 권한을 사용합니다.
Spark 애플리케이션 제출
Analytics Engine 서버리스는 Spark 애플리케이션을 제출하기 위한 REST 인터페이스를 제공합니다. REST API에 전달된 페이로드는 spark-submit 명령에서 지원하는 다양한 명령행 인수로 맵핑됩니다. 세부사항은 Spark 애플리케이션을 제출하기 위한 매개변수를 참조하십시오.
Spark 애플리케이션을 제출할 때 애플리케이션 파일을 참조해야 합니다. 빠르게 시작하고 AE 서버리스 Spark API를 사용하는 방법을 배울 수 있도록 이 절은 애플리케이션 제출 API 페이로드에서 참조되는 미리 번들화된 Spark 애플리케이션 파일을 사용하는 예로 시작됩니다. 후속 절에서는 Object Storage 버킷에 저장된 애플리케이션을 실행하는 방법을 보여줍니다.
미리 번들화된 파일 참조
제공된 샘플 애플리케이션은 작업 페이로드에서 .py 단어 수 애플리케이션 파일 및 데이터 파일을 참조하는 방법을 보여줍니다.
미리 번들화된 샘플 애플리케이션 파일을 사용하여 빠르게 시작하는 방법을 알아보려면 다음을 수행하십시오.
- 아직 수행하지 않은 경우 IAM 토큰을 생성하십시오. IAM 액세스 토큰 검색을 참조하십시오.
- 토큰을 변수로 내보내기:
export token=<token generated> - 페이로드 JSON 파일을 준비하십시오. 예를 들어, submit-spark-quick-start-app.json:
{ "application_details": { "application": "/opt/ibm/spark/examples/src/main/python/wordcount.py", "arguments": ["/opt/ibm/spark/examples/src/main/resources/people.txt"] } } - Spark 애플리케이션 제출:
curl -X POST https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications --header "Authorization: Bearer $token" -H "content-type: application/json" -d @submit-spark-quick-start-app.json
Object Storage 버킷에서 파일 참조
Object Storage 버킷에서 스파크 애플리케이션 파일을 참조하려면 버킷을 작성하고 파일을 버킷에 추가한 후 페이로드 JSON 파일에서 파일을 참조해야 합니다.
페이로드 JSON 파일에서 IBM Cloud Object Storage 인스턴스에 대한 엔드포인트는 비공개 엔드포인트여야 합니다. 다이렉트 엔드포인트는 공용 엔드포인트보다 더 나은 성능을 제공하며 발신 또는 수신 대역폭에 대한 요금이 발생하지 않습니다.
Spark 애플리케이션을 제출하려면 다음을 수행하십시오.
-
애플리케이션 파일의 버킷을 작성하십시오. 버킷 작성에 대한 세부사항은 버킷 조작을 참조하십시오.
-
애플리케이션 파일을 새로 작성된 버킷에 추가하십시오. 애플리케이션 파일을 버킷에 추가하려면 오브젝트 업로드를 참조하십시오.
-
아직 수행하지 않은 경우 IAM 토큰을 생성하십시오. IAM 액세스 토큰 검색을 참조하십시오.
-
토큰을 변수로 내보내기:
export token=<token generated> -
페이로드 JSON 파일을 준비하십시오. 예를 들어,
submit-spark-app.json:{ "application_details": { "application": "cos://<application-bucket-name>.<cos-reference-name>/my_spark_application.py", "arguments": ["arg1", "arg2"], "conf": { "spark.hadoop.fs.cos.<cos-reference-name>.endpoint": "https://s3.direct.us-south.cloud-object-storage.appdomain.cloud", "spark.hadoop.fs.cos.<cos-reference-name>.access.key": "<access_key>", "spark.hadoop.fs.cos.<cos-reference-name>.secret.key": "<secret_key>", "spark.app.name": "MySparkApp" } } }참고:
- 페이로드의
"conf"섹션을 통해 Spark 애플리케이션 구성 값을 전달할 수 있습니다. 세부사항은 Spark 애플리케이션을 제출하기 위한 매개변수를 참조하십시오. - 샘플 페이로드의 '
"conf"' 섹션에 있는<cos-reference-name>'은 '"application"파라미터의 URL에서 참조하는 IBM Cloud Object Storage 인스턴스에 지정된 이름입니다. Object Storage 신임 정보 이해 를 참조하십시오. - Spark 애플리케이션을 제출하는 데 약 1분이 소요될 수 있습니다. 클라이언트 코드에서 충분한 제한시간을 설정하십시오.
- 응답에 리턴된
"id"을(를) 기록해 두십시오. 애플리케이션의 상태 가져오기, 애플리케이션 세부사항 검색 또는 애플리케이션 삭제와 같은 조작을 수행하려면 이 값이 필요합니다.
- 페이로드의
-
Spark 애플리케이션 제출:
curl -X POST https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications --header "Authorization: Bearer $token" -H "content-type: application/json" -d @submit-spark-app.json샘플 응답:
{ "id": "87e63712-a823-4aa1-9f6e-7291d4e5a113", "state": "accepted" } -
인스턴스에 대해 포워드 로깅이 사용 가능한 경우, IBM Log Analysis에 전달되는 플랫폼 로그에서 애플리케이션 출력을 볼 수 있습니다. 세부사항은 로그 구성 및 보기를 참조하십시오.
Spark 구성을 애플리케이션에 전달
페이로드에서 "conf" 섹션을 사용하여 Spark 애플리케이션 구성을 전달할 수 있습니다. 인스턴스 레벨에서 Spark 구성을 지정한 경우, Spark 구성은 인스턴스에서 실행되는 Spark 애플리케이션에서 상속되지만 페이로드에 "conf" 섹션을 포함하여 Spark 애플리케이션이 제출될 때 대체될 수 있습니다.
Analytics Engine 서버리스에 있는 Spark 구성을 참조하십시오.
Spark 애플리케이션을 제출하기 위한 매개변수
다음 표에는 Spark 애플리케이션 제출 REST API 페이로드의 "application_details" 섹션에 전달되는 spark-submit 명령 매개변수와 해당 매개변수 간의 맵핑이 나열되어 있습니다.
| spark-submit 명령 매개변수 | Analytics Engine Spark 제출 REST API에 대한 페이로드 |
|---|---|
<application binary passed as spark-submit command parameter> |
application_details -> application |
<application-arguments> |
application_details -> arguments |
class |
application_details -> class |
jars |
application_details -> jars |
name |
application_details -> name 또는 application_details -> conf -> spark.app.name |
packages |
application_details -> packages |
repositories |
application_details -> repositories |
files |
application_details -> files |
archives |
application_details -> archives |
driver-cores |
application_details -> conf -> spark.driver.cores |
driver-memory |
application_details -> conf -> spark.driver.memory |
driver-java-options |
application_details -> conf -> spark.driver.defaultJavaOptions |
driver-library-path |
application_details -> conf -> spark.driver.extraLibraryPath |
driver-class-path |
application_details -> conf -> spark.driver.extraClassPath |
executor-cores |
application_details -> conf -> spark.executor.cores |
executor-memory |
application_details -> conf -> spark.executor.memory |
num-executors |
application_details -> conf -> ae.spark.executor.count |
pyFiles |
application_details -> conf -> spark.submit.pyFiles |
<environment-variables> |
application_details -> env -> {"key1" : "value1", "key2" : "value2", ..... "} |
제출된 애플리케이션의 상태 가져오기
제출된 애플리케이션의 상태를 가져오려면 다음을 입력하십시오.
curl -X GET https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id>/state --header "Authorization: Bearer $token"
샘플 응답:
{
"id": "a9a6f328-56d8-4923-8042-97652fff2af3",
"state": "finished",
"start_time": "2020-11-25T14:14:31.311+0000",
"finish_time": "2020-11-25T14:30:43.625+0000"
}
제출된 애플리케이션의 세부사항 가져오기
제출된 애플리케이션의 세부사항을 가져오려면 다음을 입력하십시오.
curl -X GET https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id> --header "Authorization: Bearer $token"
샘플 응답:
{
"id": "ecd608d5-xxxx-xxxx-xxxx-08e27456xxxx",
"spark_application_id": "null",
"application_details": {
"application": "cos://sbn-test-bucket-serverless-1.mycosservice/my_spark_application.py",
"conf": {
"spark.hadoop.fs.cos.mycosservice.endpoint": "https://s3.direct.us-south.cloud-object-storage.appdomain.cloud",
"spark.hadoop.fs.cos.mycosservice.access.key": "xxxx",
"spark.app.name": "MySparkApp",
"spark.hadoop.fs.cos.mycosservice.secret.key": "xxxx"
},
"arguments": [
"arg1",
"arg2"
]
},
"state": "failed",
"submission_time": "2021-11-30T18:29:21+0000"
}
제출된 애플리케이션 중지
제출된 애플리케이션을 중지하려면 다음을 실행하십시오.
curl -X DELETE https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id> --header "Authorization: Bearer $token"
삭제가 완료되면 204 – No Content을(를) 리턴합니다. 애플리케이션의 상태가 STOPPED로 설정됩니다.
이 API는 멱등적입니다. 이미 완료되거나 중지된 애플리케이션을 중지하려고 시도하면 여전히 204를 리턴합니다.
이 API를 사용하여 accepted, waiting, submitted, running 상태의 애플리케이션을 중지할 수 있습니다.
애플리케이션을 제출할 때 런타임 스파크 버전 전달
페이로드 JSON 스크립트의 "application_details" 아래에 있는 "runtime" 섹션을 사용하여 애플리케이션을 제출할 때 스파크 런타임 버전을 전달할 수 있습니다. "runtime" 섹션을 통해 전달된 스파크 버전은 인스턴스 레벨에서 설정된 기본 런타임 스파크 버전을 대체합니다. 기본 런타임
버전에 대해 자세히 학습하려면 기본 스파크 런타임 을 참조하십시오.
Spark 3.4: 애플리케이션을 실행하기 위한 ' "runtime" ' 섹션의 예시입니다:
{
"application_details": {
"application": "/opt/ibm/spark/examples/src/main/python/wordcount.py",
"arguments": [
"/opt/ibm/spark/examples/src/main/resources/people.txt"
],
"runtime": {
"spark_version": "3.4"
}
}
}
환경 변수 사용하기
애플리케이션을 제출할 때 페이로드 JSON 스크립트의 "application_details" 아래에 있는 "env" 섹션을 사용하여 애플리케이션의 결과 (예: 사용할 데이터 세트 또는 비밀 값) 를 판별하는 환경 특정 정보를 전달할 수 있습니다.
페이로드에서 "env" 섹션의 예제:
{
"application_details": {
"application": "cos://<application-bucket-name>.<cos-reference-name>/my_spark_application.py",
"arguments": ["arg1", "arg2"],
"conf": {
"spark.hadoop.fs.cos.<cos-reference-name>.endpoint": "https://s3.direct.us-south.cloud-object-storage.appdomain.cloud",
"spark.hadoop.fs.cos.<cos-reference-name>.access.key": "<access_key>",
"spark.hadoop.fs.cos.<cos-reference-name>.secret.key": "<secret_key>",
"spark.app.name": "MySparkApp"
},
"env": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
}
}
여기에 설명된 대로 "application_details" > "env" 를 사용하여 설정된 환경 변수는 실행 프로그램 및 드라이버 코드 둘 다에 액세스할 수 있습니다.
환경 변수는 "spark.executorEnv.[EnvironmentVariableName]" 구성 (application_details > env) 을 사용하여 설정할 수도 있습니다. 그러나 이들은 드라이버가 아닌 실행 프로그램에서 실행 중인 태스크에만 액세스할 수 있습니다.
Shell의 환경 변수 이름은 대문자, 숫자 및 특수 문자로 구성됩니다.
"os.getenv" 호출을 사용하여 전달되는 환경 변수에 액세스하는 py스파크 애플리케이션의 예입니다.
from pyspark.sql.types import IntegerType
import os
def init_spark():
spark = SparkSession.builder.appName("spark-env-test").getOrCreate()
sc = spark.sparkContext
return spark,sc
def returnExecutorEnv(x):
# Attempt to access environment variable from a task running on executor
return os.getenv("TESTENV1")
def main():
spark,sc = init_spark()
# dummy dataframe
df=spark.createDataFrame([("1","one")])
df.show()
df.rdd.map(lambda x: (x[0],returnExecutorEnv(x[0]))).toDF().show()
# Attempt to access environment variable on driver
print (os.getenv("TESTENV1"))
spark.stop()
if __name__ == '__main__':
main()
기본이 아닌 언어 버전을 사용하여 스파크 애플리케이션 실행
스파크 런타임은 다음과 같은 언어로 작성된 스파크 애플리케이션을 지원합니다.
- Scala
- Python
- R
스파크 런타임 버전은 기본 런타임 언어 버전과 함께 제공됩니다. IBM (는) 새 언어 버전에 대한 지원을 확장하고 기존 언어 버전을 제거하여 보안 취약점으로부터 런타임을 자유롭게 유지합니다. 또한 시스템은 새로운 언어 버전이 있을 때 워크로드를 전이하는 데 필요한 안정 시간을 제공합니다. 애플리케이션의 언어 버전을 가리키는 환경 변수를 전달하여 언어 버전으로 워크로드를 테스트할 수 있습니다.
샘플 Python 코드:
{
"application_details": {
"application": "/opt/ibm/spark/examples/src/main/python/wordcount.py",
"arguments": [
"/opt/ibm/spark/examples/src/main/resources/people.txt"
],
"env": {
"RUNTIME_PYTHON_ENV": "python310"
}
}
}
샘플 R 코드:
{
"application_details": {
"env": {
"RUNTIME_R_ENV": "r42"
},
"application": "/opt/ibm/spark/examples/src/main/r/dataframe.R"
}
}
자세한 정보
스파크 애플리케이션을 관리할 때 권장되는 우수 사례 를 따르십시오.