使用 Lambda 函數在暫時性EMR叢集中啟動 Spark 任務 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Lambda 函數在暫時性EMR叢集中啟動 Spark 任務

由 Dhrubajyoti Mukherjee 建立 (AWS)

環境:生產

技術:分析

工作負載:開放原始碼

AWS 服務:Amazon EMR; AWS Identity and Access Management;AWSLambda;Amazon VPC

Summary

此模式使用 Amazon EMR RunJobFlow API動作啟動暫時性叢集,從 Lambda 函數執行 Spark 任務。暫時性EMR叢集的設計是要在任務完成後或發生任何錯誤時立即終止。暫時性叢集可節省成本,因為它只在運算時間內執行,並在雲端環境中提供可擴展性和靈活性。

暫時性EMR叢集是使用 Lambda 函數中的 Boto3 API和 Python 程式設計語言啟動。Lambda 函數以 Python 編寫,提供在需要時啟動叢集的額外彈性。

為了示範範例批次運算和輸出,此模式會從 Lambda 函數在EMR叢集中啟動 Spark 任務,並根據虛構公司的銷售資料範例執行批次運算。Spark 任務的輸出將是 Amazon Simple Storage Service (Amazon S3CSV) 中的逗號分隔值 () 檔案。輸入資料檔案、Spark .jar 檔案、程式碼片段,以及虛擬私有雲端 (VPC) 和 AWS Identity and Access Management (IAM) 角色的AWS CloudFormation 範本,以附件的形式提供。

先決條件和限制

先決條件

  • 作用中AWS帳戶

限制

  • 一次只能從程式碼啟動一個 Spark 任務。 

產品版本

  • 在 Amazon EMR 6.0.0 上測試

架構

目標技術堆疊

  • Amazon EMR 

  • AWS Lambda

  • Amazon S3

  • Apache Spark

目標架構

Lambda 到 Amazon,EMRSpark 到 Amazon S3

自動化和擴展

若要自動化 Spark EMR批次運算,您可以使用下列任一選項。

工具

AWS 服務

  • Amazon EMR 是受管叢集平台,可簡化在 上執行大數據架構,AWS以處理和分析大量資料。

  • AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需支付您使用的運算時間。

  • Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。

其他工具

  • Apache Spark 是用於大規模資料處理的多語言分析引擎。

史詩

任務描述所需的技能

建立IAM角色和 VPC。

如果您已有 AWS Lambda 和 Amazon EMRIAM角色和 VPC,您可以略過此步驟。若要執行程式碼,EMR叢集和 Lambda 函數都需要 IAM 角色。EMR 叢集還需要VPC具有公有子網路的 ,或具有NAT閘道的私有子網路。若要自動建立所有IAM角色和 VPC,請以原樣部署附加的AWS CloudFormation 範本,或者您可以依照其他資訊區段中指定的VPC手動建立角色和 。

雲端架構師

請注意AWS CloudFormation 範本輸出金鑰。

成功部署 CloudFormation 範本後,導覽至AWS CloudFormation 主控台中的輸出索引標籤。請注意五個輸出金鑰:

  • S3Bucket

  • LambdaExecutionRole

  • ServiceRole

  • JobFlowRole

  • Ec2SubnetId

建立 Lambda 函數時,您將使用這些金鑰中的值。

雲端架構師
任務描述所需的技能

上傳 Spark .jar 檔案。

將 Spark .jar 檔案上傳至AWS CloudFormation 堆疊建立的 S3 儲存貯體。儲存貯體名稱與輸出金鑰 相同S3Bucket

一般 AWS
任務描述所需的技能

建立 Lambda 函數。

在 Lambda 主控台上,建立具有執行角色的 Python 3.9+ Lambda 函數。執行角色政策必須允許 Lambda 啟動EMR叢集。(請參閱附加的AWS CloudFormation 範本。)

資料工程師、雲端工程師

複製並貼上程式碼。

lambda_function.py檔案中的程式碼取代為此模式其他資訊區段中的程式碼。

資料工程師、雲端工程師

變更程式碼中的參數。

請遵循程式碼中的註解,變更參數值以符合AWS您的帳戶。

資料工程師、雲端工程師

啟動 函數以啟動叢集。

啟動 函數,以使用提供的 Spark .jar 檔案開始建立暫時性EMR叢集。它將執行 Spark 任務,並在任務完成時自動終止。

資料工程師、雲端工程師

檢查EMR叢集狀態。

啟動EMR叢集後,它會顯示在叢集索引標籤下的 Amazon EMR主控台中。可以相應地檢查啟動叢集或執行任務時的任何錯誤。

資料工程師、雲端工程師
任務描述所需的技能

上傳 Spark .jar 檔案。

附件區段下載 Spark .jar 檔案,並將其上傳至 S3 儲存貯體。

資料工程師、雲端工程師

上傳輸入資料集。

將附加fake_sales_data.csv檔案上傳至 S3 儲存貯體。

資料工程師、雲端工程師

貼上 Lambda 程式碼並變更參數。

工具區段複製程式碼,並將程式碼貼到 Lambda 函數中,取代程式碼lambda_function.py檔案。變更參數值以符合您的帳戶。

資料工程師、雲端工程師

啟動 函數並驗證輸出。

Lambda 函數使用提供的 Spark 任務啟動叢集後,會在 S3 儲存貯體中產生 .csv 檔案。

資料工程師、雲端工程師

相關資源

其他資訊

Code

""" Copy paste the following code in your Lambda function. Make sure to change the following key parameters for the API as per your account -Name (Name of Spark cluster) -LogUri (S3 bucket to store EMR logs) -Ec2SubnetId (The subnet to launch the cluster into) -JobFlowRole (Service role for EC2) -ServiceRole (Service role for Amazon EMR) The following parameters are additional parameters for the Spark job itself. Change the bucket name and prefix for the Spark job (located at the bottom). -s3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar (Spark jar file) -s3://your-bucket-name/prefix/fake_sales_data.csv (Input data file in S3) -s3://your-bucket-name/prefix/outputs/report_1/ (Output location in S3) """ import boto3 client = boto3.client('emr') def lambda_handler(event, context): response = client.run_job_flow( Name='spark_job_cluster', LogUri='s3://your-bucket-name/prefix/logs', ReleaseLabel='emr-6.0.0', Instances={ 'MasterInstanceType': 'm5.xlarge', 'SlaveInstanceType': 'm5.large', 'InstanceCount': 1, 'KeepJobFlowAliveWhenNoSteps': False, 'TerminationProtected': False, 'Ec2SubnetId': 'subnet-XXXXXXXXXXXXXX' }, Applications=[{'Name': 'Spark'}], Configurations=[ {'Classification': 'spark-hive-site', 'Properties': { 'hive.metastore.client.factory.class': 'com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory'} } ], VisibleToAllUsers=True, JobFlowRole='EMRLambda-EMREC2InstanceProfile-XXXXXXXXX', ServiceRole='EMRLambda-EMRRole-XXXXXXXXX', Steps=[ { 'Name': 'flow-log-analysis', 'ActionOnFailure': 'TERMINATE_CLUSTER', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', '--deploy-mode', 'cluster', '--executor-memory', '6G', '--num-executors', '1', '--executor-cores', '2', '--class', 'com.aws.emr.ProfitCalc', 's3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar', 's3://your-bucket-name/prefix/fake_sales_data.csv', 's3://your-bucket-name/prefix/outputs/report_1/' ] } } ] )

IAM 角色和VPC建立

若要在 Lambda 函數中啟動EMR叢集,需要 VPC和 IAM角色。您可以使用此模式的附件區段中的AWS CloudFormation 範本來設定 VPC和 IAM角色,也可以使用以下連結手動建立這些角色。 

執行 Lambda 和 Amazon 需要下列IAM角色EMR。 

Lambda 執行角色

Lambda 函數的執行角色會授予存取 AWS 服務和資源的許可。

Amazon 的服務角色 EMR

Amazon EMR角色會定義在佈建資源和執行服務層級任務EMR時,Amazon 的允許動作,這些任務未在叢集內執行的 Amazon Elastic Compute Cloud (AmazonEC2) 執行個體環境中執行。例如,服務角色用於在叢集啟動時佈建EC2執行個體。

EC2執行個體的服務角色

叢集EC2執行個體的服務角色 (也稱為 Amazon 的EC2執行個體設定檔EMR) 是特殊類型的服務角色,會在EC2執行個體啟動時指派給 Amazon EMR叢集中的每個執行個體。在 Apache Hadoop 上執行的應用程式程序會擔任此角色,以允許 與其他 AWS 服務互動。

VPC 和子網路建立

您可以從VPC主控台建立 VPC。 

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip