

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Luncurkan pekerjaan Spark di cluster EMR sementara menggunakan fungsi Lambda
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function"></a>

*Dhrubajyoti Mukherjeee, Amazon Web Services*

## Ringkasan
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-summary"></a>

Pola ini menggunakan aksi Amazon EMR RunJobFlow API untuk meluncurkan klaster sementara untuk menjalankan pekerjaan Spark dari fungsi Lambda. Cluster EMR sementara dirancang untuk dihentikan segera setelah pekerjaan selesai atau jika terjadi kesalahan. Cluster transien memberikan penghematan biaya karena hanya berjalan selama waktu komputasi, dan memberikan skalabilitas dan fleksibilitas dalam lingkungan cloud.

Cluster EMR transien diluncurkan menggunakan API Boto3 dan bahasa pemrograman Python dalam fungsi Lambda. Fungsi Lambda, yang ditulis dengan Python, memberikan fleksibilitas tambahan untuk memulai cluster saat dibutuhkan.

Untuk mendemonstrasikan komputasi dan output batch sampel, pola ini akan meluncurkan pekerjaan Spark di cluster EMR dari fungsi Lambda dan menjalankan komputasi batch terhadap contoh data penjualan perusahaan fiksi. Output dari pekerjaan Spark akan menjadi file nilai yang dipisahkan koma (CSV) di Amazon Simple Storage Service (Amazon S3). File data input, file Spark .jar, cuplikan kode, dan CloudFormation template AWS untuk peran virtual private cloud (VPC) dan AWS Identity and Access Management (IAM) untuk menjalankan komputasi disediakan sebagai lampiran.

## Prasyarat dan batasan
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif

**Batasan**
+ Hanya satu pekerjaan Spark yang dapat dimulai dari kode pada satu waktu. 

**Versi produk**
+ Diuji di Amazon EMR 6.0.0

## Arsitektur
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-architecture"></a>

**Tumpukan teknologi target**
+ Amazon EMR 
+ AWS Lambda
+ Amazon S3
+ Apache Spark

**Arsitektur target**

![\[Lambda ke Amazon EMR dan Spark ke Amazon S3\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/6c999fa7-9550-4929-a5c1-60394142175d/images/eb4fbb3f-2114-44d2-b9da-3fdcb9ca456e.png)


**Otomatisasi dan skala**

Untuk mengotomatiskan komputasi batch Spark-EMR, Anda dapat menggunakan salah satu opsi berikut.
+ Menerapkan EventBridge aturan Amazon yang dapat memulai fungsi Lambda dalam jadwal cron. Untuk informasi selengkapnya, lihat [Tutorial: Menjadwalkan fungsi AWS Lambda menggunakan](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-run-lambda-schedule.html). EventBridge
+ Konfigurasikan [pemberitahuan peristiwa Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) untuk memulai fungsi Lambda saat kedatangan file.
+ Teruskan parameter input ke fungsi AWS Lambda melalui badan peristiwa dan variabel lingkungan Lambda. 

## Alat
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-tools"></a>

**Layanan AWS**
+ [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html) adalah platform cluster terkelola yang menyederhanakan menjalankan kerangka kerja data besar di AWS untuk memproses dan menganalisis data dalam jumlah besar.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) adalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.
+ [Amazon Simple Storage Service (Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)) adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.

**Alat-alat lainnya**
+ [Apache Spark](https://spark.apache.org/docs/latest/) adalah mesin analisis multi-bahasa untuk pemrosesan data skala besar.

## Epik
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-epics"></a>

### Buat peran Amazon EMR dan Lambda IAM dan VPC
<a name="create-the-amazon-emr-and-lambda-iam-roles-and-the-vpc"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran IAM dan VPC. | Jika Anda sudah memiliki peran AWS Lambda dan Amazon EMR IAM serta VPC, Anda dapat melewati langkah ini. Untuk menjalankan kode, baik cluster EMR dan fungsi Lambda memerlukan peran IAM. Cluster EMR juga membutuhkan VPC dengan subnet publik atau subnet pribadi dengan gateway NAT. *Untuk membuat semua peran IAM dan VPC secara otomatis, gunakan templat CloudFormation AWS terlampir apa adanya, atau Anda dapat membuat peran dan VPC secara manual seperti yang ditentukan di bagian Informasi tambahan.* | Arsitek awan | 
| Perhatikan kunci keluaran CloudFormation template AWS. | Setelah CloudFormation template berhasil diterapkan, navigasikan ke tab **Output** di konsol CloudFormation AWS. Perhatikan lima tombol output: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function.html)Anda akan menggunakan nilai-nilai dari tombol-tombol ini saat Anda membuat fungsi Lambda. | Arsitek awan | 

### Unggah file Spark .jar
<a name="upload-the-spark-jar-file"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Unggah file Spark .jar. | Unggah file Spark .jar ke bucket S3 yang dibuat oleh CloudFormation AWS stack. Nama bucket sama dengan tombol output`S3Bucket`.  | AWS Umum | 

### Buat fungsi Lambda untuk meluncurkan cluster EMR
<a name="create-the-lambda-function-to-launch-the-emr-cluster"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat fungsi Lambda. | Di konsol Lambda, buat fungsi Lambda Python 3.9\$1 dengan peran eksekusi. Kebijakan peran eksekusi harus mengizinkan Lambda meluncurkan klaster EMR. (Lihat CloudFormation template AWS terlampir.) | Insinyur data, insinyur Cloud | 
| Salin dan tempel kodenya. | Ganti kode dalam `lambda_function.py` file dengan kode dari bagian *Informasi tambahan* dari pola ini. | Insinyur data, insinyur Cloud | 
| Ubah parameter dalam kode. | Ikuti komentar dalam kode untuk mengubah nilai parameter agar sesuai dengan akun AWS Anda. | Insinyur data, insinyur Cloud | 
| Luncurkan fungsi untuk memulai cluster. | Luncurkan fungsi untuk memulai pembuatan cluster EMR sementara dengan file Spark .jar yang disediakan. Ini akan menjalankan pekerjaan Spark dan berakhir secara otomatis ketika pekerjaan selesai. | Insinyur data, insinyur Cloud | 
| Periksa status cluster EMR. | **Setelah kluster EMR dimulai, ia muncul di konsol EMR Amazon di bawah tab Clusters.** Kesalahan apa pun saat meluncurkan cluster atau menjalankan pekerjaan dapat diperiksa sesuai dengan itu. | Insinyur data, insinyur Cloud | 

### Siapkan dan jalankan demo sampel
<a name="set-up-and-run-the-sample-demo"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Unggah file Spark .jar.  | Unduh file Spark .jar dari bagian *Lampiran* dan unggah ke bucket S3. | Insinyur data, insinyur Cloud | 
| Unggah dataset input. | Unggah `fake_sales_data.csv` file terlampir ke bucket S3. | Insinyur data, insinyur Cloud | 
| Tempel kode Lambda dan ubah parameternya. | Salin kode dari bagian **Alat**, dan tempel kode dalam fungsi Lambda, ganti file kode`lambda_function.py`. Ubah nilai parameter agar sesuai dengan akun Anda. | Insinyur data, insinyur Cloud | 
| Luncurkan fungsi dan verifikasi outputnya. | Setelah fungsi Lambda memulai cluster dengan pekerjaan Spark yang disediakan, ia menghasilkan file.csv di bucket S3. | Insinyur data, insinyur Cloud | 

## Sumber daya terkait
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-resources"></a>
+ [Membangun Spark](https://spark.apache.org/docs/latest/building-spark.html)
+ [Apache Spark dan Amazon EMR](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark.html)
+ [Boto3 Dokumentasi run\$1job\$1flow Dokumen](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.run_job_flow)
+ [Informasi dan dokumentasi Apache Spark](https://spark.apache.org/)

## Informasi tambahan
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-additional"></a>

**Kode**

```
"""
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/'
                    ]
                }
            }
        ]
    )
```

**Peran IAM dan pembuatan VPC**

Untuk meluncurkan cluster EMR dalam fungsi Lambda, diperlukan peran VPC dan IAM. Anda dapat mengatur peran VPC dan IAM dengan menggunakan CloudFormation templat AWS di bagian Lampiran pola ini, atau Anda dapat membuatnya secara manual menggunakan tautan berikut. 

Peran IAM berikut diperlukan untuk menjalankan Lambda dan Amazon EMR. 

*Peran eksekusi Lambda*

[Peran eksekusi](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) fungsi Lambda memberinya izin untuk mengakses layanan dan sumber daya AWS.

*Peran layanan untuk Amazon EMR*

[Peran Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role.html) mendefinisikan tindakan yang diizinkan untuk Amazon EMR saat menyediakan sumber daya dan melakukan tugas tingkat layanan yang tidak dilakukan dalam konteks instans Amazon Elastic Compute Cloud (Amazon) yang berjalan dalam klaster. EC2 Misalnya, peran layanan digunakan untuk menyediakan EC2 instance saat klaster diluncurkan.

*Peran layanan untuk EC2 instance*

[Peran layanan untuk EC2 instance klaster](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role-for-ec2.html) (juga disebut profil EC2 instans untuk Amazon EMR) adalah jenis peran layanan khusus yang ditetapkan ke EC2 setiap instance dalam klaster EMR Amazon saat instance diluncurkan. Proses aplikasi yang berjalan di atas Apache Hadoop mengambil peran ini sebagai izin untuk berinteraksi dengan layanan AWS lainnya.

*Pembuatan VPC dan subnet*

Anda dapat [membuat VPC dari konsol](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#create-vpc-and-other-resources) VPC. 

## Lampiran
<a name="attachments-6c999fa7-9550-4929-a5c1-60394142175d"></a>

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/6c999fa7-9550-4929-a5c1-60394142175d/attachments/attachment.zip)