本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Lambda 函數在暫時性EMR叢集中啟動 Spark 任務
由 Dhrubajyoti Mukherjee 建立 (AWS)
Summary
此模式使用 Amazon EMR RunJobFlow API動作啟動暫時性叢集,從 Lambda 函數執行 Spark 任務。暫時性EMR叢集的設計是要在任務完成後或發生任何錯誤時立即終止。暫時性叢集可節省成本,因為它只在運算期間執行,並在雲端環境中提供可擴展性和彈性。
暫時性EMR叢集使用 Boto3 API和 Lambda 函數中的 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
目標架構

自動化和擴展
若要自動化 Spark EMR批次運算,您可以使用下列任一選項。
實作可在 Cron 排程中啟動 Lambda 函數的 Amazon EventBridge 規則。如需詳細資訊,請參閱教學課程:使用 排程 AWS Lambda 函數 EventBridge。
設定 Amazon S3 事件通知,以在檔案送達時啟動 Lambda 函數。
透過事件內文和 AWS Lambda 環境變數,將輸入參數傳遞至 Lambda 函數。
工具
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 主控台中的輸出索引標籤。請注意五個輸出金鑰:
建立 Lambda 函數時,您會使用這些金鑰中的值。 | 雲端架構師 |
任務 | 描述 | 所需的技能 |
---|---|---|
上傳 Spark .jar 檔案。 | 將 Spark .jar 檔案上傳至AWS CloudFormation 堆疊建立的 S3 儲存貯體。儲存貯體名稱與輸出金鑰 相同 | 一般 AWS |
任務 | 描述 | 所需的技能 |
---|---|---|
建立 Lambda 函數。 | 在 Lambda 主控台上,使用 執行角色建立 Python 3.9+ Lambda 函數。執行角色政策必須允許 Lambda 啟動EMR叢集。(請參閱附加的AWS CloudFormation 範本。) | 資料工程師、雲端工程師 |
複製並貼上程式碼。 | 將 | 資料工程師、雲端工程師 |
變更程式碼中的參數。 | 請遵循程式碼中的註解,變更參數值以符合AWS您的帳戶。 | 資料工程師、雲端工程師 |
啟動 函數以啟動叢集。 | 啟動 函數,以使用提供的 Spark .jar 檔案開始建立暫時性EMR叢集。它將執行 Spark 任務,並在任務完成時自動終止。 | 資料工程師、雲端工程師 |
檢查EMR叢集狀態。 | 啟動EMR叢集後,它會出現在叢集索引標籤下的 Amazon EMR主控台中。您可以相應地檢查啟動叢集或執行任務時的任何錯誤。 | 資料工程師、雲端工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
上傳 Spark .jar 檔案。 | 從附件區段下載 Spark .jar 檔案,並將其上傳至 S3 儲存貯體。 | 資料工程師、雲端工程師 |
上傳輸入資料集。 | 將附加 | 資料工程師、雲端工程師 |
貼上 Lambda 程式碼並變更參數。 | 從工具區段複製程式碼,並將程式碼貼到 Lambda 函數中,取代程式碼 | 資料工程師、雲端工程師 |
啟動 函數並驗證輸出。 | 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角色會定義在佈建資源和執行未在叢集內執行的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體內容中執行的服務層級任務EMR時,Amazon 角色會為 Amazon 定義允許的動作。例如,服務角色用於在叢集啟動時佈建EC2執行個體。
EC2執行個體的服務角色
叢集EC2執行個體的服務角色 (也稱為 Amazon 的EC2執行個體描述檔EMR) 是一種特殊類型的服務角色,會在EC2執行個體啟動時指派給 Amazon EMR叢集中的每個執行個體。在 Apache Hadoop 上執行的應用程式程序會擔任此角色,以取得與其他 AWS服務互動的許可。
VPC 和子網路建立
您可以從VPC主控台建立 VPC。
附件
若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip