

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Apache Flink
<a name="emr-flink"></a>

[Apache Flink](https://flink.apache.org/)는 처리량이 많은 데이터 원본에서 실시간 스트림 처리를 실행하는 데 사용할 수 있는 스트리밍 데이터플로우 엔진입니다. Flink는 잘못된 순서 이벤트에 대한 이벤트 시간 의미, 일회성 의미, 역압 제어, 그리고 스트리밍과 배치 애플리케이션 모두를 작성하도록 최적화된 API를 지원합니다.

또한, Flink에는 다음과 같은 타사 데이터 원본용 커넥터가 있습니다.
+ [Amazon Kinesis Data Streams](https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming/connectors/kinesis.html)
+ [Apache Kafka](https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming/connectors/kafka.html)
+ [Flink Elasticsearch 커넥터](https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming/connectors/elasticsearch2.html)
+ [Twitter Streaming API](https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/connectors/twitter.html)
+ [Cassandra](https://ci.apache.org/projects/flink/flink-docs-master/apis/streaming/connectors/cassandra.html)

Amazon EMR에서는 클러스터에 있는 다른 애플리케이션과 함께 리소스를 관리할 수 있도록 YARN 애플리케이션으로 Flink를 지원합니다. Flink-on-YARN을 사용하여 임시 Flink 작업을 제출하거나 여러 작업을 허용하고 전체 YARN 동일 시작 인스턴스에 따라 리소스를 할당하는 장기 실행 클러스터를 생성할 수 있습니다.

Flink는 Amazon EMR 릴리스 버전 5.1.0 이상에 포함되어 있습니다.

**참고**  
`FlinkKinesisConsumer` 클래스에 대한 지원이 Amazon EMR 릴리스 버전 5.2.1에 추가되었습니다.

다음 테이블에는 Amazon EMR이 Flink를 통해 설치하는 구성 요소와 함께 Amazon EMR 7.x 시리즈의 최신 릴리스에 포함된 Flink의 버전이 나열되어 있습니다.

이 릴리스에서 Flink와 함께 설치된 구성 요소의 버전은 [릴리스 7.12.0 구성 요소 버전을 참조하세요](emr-7120-release.md).


**emr-7.12.0용 Flink 버전 정보**  

| Amazon EMR 릴리스 레이블 | Flink 버전 | Flink와 함께 설치된 구성 요소 | 
| --- | --- | --- | 
| emr-7.12.0 | Flink 1.20.0-amzn-6 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 

다음 테이블에는 Amazon EMR이 Flink를 통해 설치하는 구성 요소와 함께 Amazon EMR 6.x 시리즈의 최신 릴리스에 포함된 Flink의 버전이 나열되어 있습니다.

이 릴리스에서 Flink와 함께 설치된 구성 요소의 버전은 [릴리스 6.15.0 구성 요소 버전](emr-6150-release.md)을 참조하세요.


**emr-6.15.0용 Flink 버전 정보**  

| Amazon EMR 릴리스 레이블 | Flink 버전 | Flink와 함께 설치된 구성 요소 | 
| --- | --- | --- | 
| emr-6.15.0 | Flink 1.17.1-amzn-1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 

다음 테이블에는 Amazon EMR이 Flink를 통해 설치하는 구성 요소와 함께 Amazon EMR 5.x 시리즈의 최신 릴리스에 포함된 Flink의 버전이 나열되어 있습니다.

이 릴리스에서 Flink와 함께 설치된 구성 요소의 버전은 [릴리스 5.36.2 구성 요소 버전](emr-5362-release.md)을 참조하세요.


**emr-5.36.2용 Flink 버전 정보**  

| Amazon EMR 릴리스 레이블 | Flink 버전 | Flink와 함께 설치된 구성 요소 | 
| --- | --- | --- | 
| emr-5.36.2 | Flink 1.14.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 

**Topics**
+ [Flink를 포함하는 클러스터 생성](flink-create-cluster.md)
+ [Amazon EMR에서 Flink 구성](flink-configure.md)
+ [Amazon EMR에서 Flink 작업 사용](flink-jobs.md)
+ [Scala 쉘 사용](flink-scala.md)
+ [Flink 웹 인터페이스 찾기](flink-web-interface.md)
+ [Flink 오토스케일러](flink-autoscaler.md)
+ [태스크 복구 및 작업 규모 조정을 위한 작업 재시작 시간 최적화](flink-restart.md)
+ [Amazon EMR의 Zeppelin에서 Flink 작업](flink-zeppelin.md)
+ [Flink 릴리스 기록](Flink-release-history.md)

# Flink를 포함하는 클러스터 생성
<a name="flink-create-cluster"></a>

 AWS Management Console AWS CLI또는 AWS SDK를 사용하여 클러스터를 시작할 수 있습니다.<a name="emr-flink-create-console"></a>

**콘솔에서 Flink가 설치된 클러스터를 시작하는 방법**

1. [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) Amazon EMR 콘솔을 엽니다.

1. **클러스터 생성** 및 **고급 옵션으로 이동**을 선택합니다.

1.  **소프트웨어 구성**에서 **EMR 릴리스 emr-5.1.0** 이상을 선택합니다.

1.  설치할 다른 애플리케이션과 함께 **Flink**를 애플리케이션으로 선택합니다.

1.  필요에 따라 다른 옵션을 선택하고 **클러스터 생성**을 선택합니다.

**에서 Flink를 사용하여 클러스터를 시작하려면 AWS CLI**
+ 다음 명령을 사용하여 클러스터를 생성합니다.

  ```
  aws emr create-cluster --release-label emr-7.12.0 \
  --applications Name=Flink \
  --region us-east-1 \
  --log-uri s3://myLogUri \
  --instance-type m5.xlarge \
  --instance-count 2 \
  --service-role EMR_DefaultRole_V2 \ 
  --ec2-attributes KeyName=MyKeyName,InstanceProfile=EMR_EC2_DefaultRole \
  --steps Type=CUSTOM_JAR,Jar=command-runner.jar,Name=Flink_Long_Running_Session,\
  Args=flink-yarn-session,-d
  ```
**참고**  
가독성을 위해 Linux 줄 연속 문자(\$1)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

# Amazon EMR에서 Flink 구성
<a name="flink-configure"></a>

## Hive 메타스토어 및 Glue 카탈로그를 사용하여 Flink 구성
<a name="flink-configure-hive"></a>

Amazon EMR 릴리스 6.9.0 이상은 Hive에 대한 Apache Flink 커넥터를 사용하여 Hive 메타스토어와 AWS Glue 카탈로그를 모두 지원합니다. 이 섹션에서는 Flink를 사용하여 [AWS Glue 카탈로그](#flink-configure-hive-glue) 및 [Hive 메타스토어](#flink-configure-hive-metastore)를 구성하는 데 필요한 단계를 설명합니다.

**Topics**
+ [Hive 메타스토어 사용](#flink-configure-hive-metastore)
+ [AWS Glue 데이터 카탈로그 사용](#flink-configure-hive-glue)

### Hive 메타스토어 사용
<a name="flink-configure-hive-metastore"></a>

1. 릴리스 6.9.0 이상 및 둘 이상의 애플리케이션(**Hive** 및 **Flink**)이 포함된 EMR 클러스터를 생성합니다.

1. [스크립트 러너](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html)를 사용하여 다음 스크립트를 단계 함수로 실행합니다.

   `hive-metastore-setup.sh`

   ```
   sudo cp /usr/lib/hive/lib/antlr-runtime-3.5.2.jar /usr/lib/flink/lib 
   sudo cp /usr/lib/hive/lib/hive-exec-3.1.3*.jar /lib/flink/lib 
   sudo cp /usr/lib/hive/lib/libfb303-0.9.3.jar /lib/flink/lib 
   sudo cp /usr/lib/flink/opt/flink-connector-hive_2.12-1.15.2.jar /lib/flink/lib
   sudo chmod 755 /usr/lib/flink/lib/antlr-runtime-3.5.2.jar 
   sudo chmod 755 /usr/lib/flink/lib/hive-exec-3.1.3*.jar 
   sudo chmod 755 /usr/lib/flink/lib/libfb303-0.9.3.jar
   sudo chmod 755 /usr/lib/flink/lib/flink-connector-hive_2.12-1.15.2.jar
   ```  
![\[Form to add a Custom JAR step with fields for step type, name, JAR location, arguments, and failure action.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/hive.png)

### AWS Glue 데이터 카탈로그 사용
<a name="flink-configure-hive-glue"></a>

1. 릴리스 6.9.0 이상 및 둘 이상의 애플리케이션(**Hive** 및 **Flink**)이 포함된 EMR 클러스터를 생성합니다.

1.  AWS Glue 데이터 카탈로그 설정에서 **Hive 테이블 메타데이터에 사용**을 선택하여 클러스터에서 데이터 카탈로그를 활성화합니다.

1. [스크립트 러너](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html)를 사용하여 다음 스크립트를 단계 함수로 실행합니다([Amazon EMR 클러스터에서 명령 및 스크립트 실행](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html)).

   glue-catalog-setup.sh 

   ```
   sudo cp /usr/lib/hive/auxlib/aws-glue-datacatalog-hive3-client.jar /usr/lib/flink/lib 
   sudo cp /usr/lib/hive/lib/antlr-runtime-3.5.2.jar /usr/lib/flink/lib 
   sudo cp /usr/lib/hive/lib/hive-exec-3.1.3*.jar /lib/flink/lib 
   sudo cp /usr/lib/hive/lib/libfb303-0.9.3.jar /lib/flink/lib 
   sudo cp /usr/lib/flink/opt/flink-connector-hive_2.12-1.15.2.jar /lib/flink/lib
   sudo chmod 755 /usr/lib/flink/lib/aws-glue-datacatalog-hive3-client.jar 
   sudo chmod 755 /usr/lib/flink/lib/antlr-runtime-3.5.2.jar 
   sudo chmod 755 /usr/lib/flink/lib/hive-exec-3.1.3*.jar 
   sudo chmod 755 /usr/lib/flink/lib/libfb303-0.9.3.jar
   sudo chmod 755 /usr/lib/flink/lib/flink-connector-hive_2.12-1.15.2.jar
   ```  
![\[Form to add a Custom JAR step with fields for step type, name, JAR location, arguments, and failure action.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/hive.png)

## 구성 파일을 사용하여 Flink 구성
<a name="flink-configure-config"></a>

Amazon EMR 구성 API를 사용하여 구성 파일로 Flink를 구성할 수 있습니다. 현재 API 내에서 구성할 수 있는 파일은 다음과 같습니다.
+ `flink-conf.yaml`
+ `log4j.properties`
+ `flink-log4j-session`
+ `log4j-cli.properties`

Flink용 기본 구성 파일은 `flink-conf.yaml`입니다.

**에서 Flink에 사용되는 작업 슬롯 수를 구성하려면 AWS CLI**

1. 다음 콘텐츠가 포함된 `configurations.json` 파일을 생성합니다.

   ```
   [
       {
         "Classification": "flink-conf",
         "Properties": {
           "taskmanager.numberOfTaskSlots":"2"
         }
       }
   ]
   ```

1. 다음 구성을 사용하여 클러스터를 생성합니다.

   ```
   aws emr create-cluster --release-label emr-7.12.0 \
   --applications Name=Flink \
   --configurations file://./configurations.json \
   --region us-east-1 \
   --log-uri s3://myLogUri \
   --instance-type m5.xlarge \
   --instance-count 2 \
   --service-role EMR_DefaultRole_V2 \ 
   --ec2-attributes KeyName=YourKeyName,InstanceProfile=EMR_EC2_DefaultRole
   ```

**참고**  
Flink API를 사용하여 일부 구성을 변경할 수도 있습니다. 자세한 내용은 Flink 설명서에서 [https://ci.apache.org/projects/flink/flink-docs-release-1.12/concepts/index.html](https://ci.apache.org/projects/flink/flink-docs-release-1.12/concepts/index.html)를 참조하세요.  
Amazon EMR 버전 5.21.0 이상에서는 클러스터 구성을 재정의할 수 있으며, 실행 중인 클러스터의 각 인스턴스 그룹에 대해 추가 구성 분류를 지정할 수 있습니다. Amazon EMR 콘솔, AWS Command Line Interface (AWS CLI) 또는 AWS SDK를 사용하여이 작업을 수행할 수 있습니다. 자세한 내용은 [실행 중 클러스터의 인스턴스 그룹에 대해 구성 제공](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html)을 참조하세요.

### 병렬 처리 옵션
<a name="flink-parallelism"></a>

애플리케이션 소유자는 Flink 내에서 작업에 할당할 리소스를 잘 알고 있습니다. 이 설명서의 예제에서는 애플리케이션에 사용되는 태스크 인스턴스와 동일한 개수의 작업을 사용합니다. 일반적으로 이러한 사용은 초기 수준의 병렬화에 권장되지만, 작업 슬롯을 사용하여 더 세부적으로 병렬화할 수도 있습니다. 이 경우 일반적으로 인스턴스당 [가상 코어](https://aws.amazon.com/ec2/virtualcores/) 수를 초과하면 안 됩니다. Flink의 아키텍처에 대한 자세한 내용은 Flink 설명서에서 [https://ci.apache.org/projects/flink/flink-docs-master/concepts/index.html](https://ci.apache.org/projects/flink/flink-docs-master/concepts/index.html)를 참조하세요.

## 여러 프라이머리 노드를 포함하는 EMR 클러스터에서 Flink 구성
<a name="flink-multi-master"></a>

Flink의 JobManager는 여러 프라이머리 노드가 있는 Amazon EMR 클러스터에서 프라이머리 노드 장애 조치 프로세스 중에도 계속 사용할 수 있습니다. Amazon EMR 5.28.0부터 JobManager 고가용성이 자동으로 활성화됩니다. 수동 구성이 필요하지 않습니다.

Amazon EMR 버전 5.27.0 또는 이하 버전에서 JobManager는 단일 장애 지점입니다. JobManager가 실패하면 모든 작업 상태가 손실되고 실행 중인 작업이 다시 시작되지 않습니다. 다음 예제에서 보여주듯이, 애플리케이션 시도 횟수를 구성하고 체크포인트를 수행하고 Flink의 상태 스토리지로 ZooKeeper를 활성화하여 JobManager 고가용성을 활성화할 수 있습니다.

```
[
  {
    "Classification": "yarn-site",
    "Properties": {
      "yarn.resourcemanager.am.max-attempts": "10"
    }
  },
  {
    "Classification": "flink-conf",
    "Properties": {
        "yarn.application-attempts": "10",
        "high-availability": "zookeeper",
        "high-availability.zookeeper.quorum": "%{hiera('hadoop::zk')}",
        "high-availability.storageDir": "hdfs:///user/flink/recovery",
        "high-availability.zookeeper.path.root": "/flink"
    }
  }
]
```

YARN에 대한 최대 애플리케이션 마스터 시도와 Flink에 대한 애플리케이션 시도를 모두 구성해야 합니다. 자세한 내용은 [Configuration of YARN cluster high availability](https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/jobmanager_high_availability.html#maximum-application-master-attempts-yarn-sitexml)를 참조하세요. 또한 다시 시작된 JobManager가 이전에 완료된 체크포인트에서 실행 중인 작업을 복원하도록 Flink 체크포인트를 구성할 수 있습니다. 자세한 내용은 [Flink checkpointing](https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/stream/state/checkpointing.html)을 참조하세요.

## 메모리 프로세스 크기 구성
<a name="flink-process-memory"></a>

Flink 1.11.x를 사용하는 Amazon EMR 버전의 경우 `flink-conf.yaml`에서 JobManager(`jobmanager.memory.process.size`) 및 TaskManager(`taskmanager.memory.process.size`) 모두에 대해 총 메모리 프로세스 크기를 구성해야 합니다. 구성 API로 클러스터를 구성하거나 SSH를 통해 이러한 필드의 주석 처리를 수동으로 제거하여 이러한 값을 설정할 수 있습니다. Flink는 다음과 같은 기본값을 제공합니다.
+ `jobmanager.memory.process.size`: 1,600m
+ `taskmanager.memory.process.size`: 1,728m

JVM 메타스페이스와 오버헤드를 제외하려면 `taskmanager.memory.process.size` 대신 Flink 총 메모리 크기(`taskmanager.memory.flink.size`)를 대신 사용합니다. `taskmanager.memory.process.size`의 기본값은 1,280m입니다. `taskmanager.memory.process.size` 및 `taskmanager.memory.process.size`를 모두 설정하는 것은 권장되지 않습니다.

Flink 1.12.0 이상을 사용하는 모든 Amazon EMR 버전에는 Flink용 오픈 소스 세트에 Amazon EMR의 기본값으로 기본값이 나열되어 있으므로 사용자가 직접 구성할 필요가 없습니다.

## 로그 출력 파일 크기 구성
<a name="flink-log-output"></a>

Flink 애플리케이션 컨테이너는 `.out` 파일, `.log` 파일, `.err` 파일과 같은 세 가지 유형의 로그 파일을 생성하고 작성합니다. `.err` 파일만 압축되어 파일 시스템에서 제거되고, `.log` 및 `.out` 로그 파일은 파일 시스템에 남습니다. 이러한 출력 파일을 관리할 수 있고 클러스터를 안정적으로 유지하기 위해 최대 파일 수를 설정하고 파일 크기를 제한하도록 `log4j.properties`에서 로그 로테이션을 구성할 수 있습니다.

**Amazon EMR 버전 5.30.0 이상**

Amazon EMR 5.30.0부터 Flink는 구성 분류 이름 `flink-log4j.`의 log4j2 로깅 프레임워크를 사용합니다. 다음 예제 구성은 log4j2 형식을 보여줍니다.

```
[
  {
    "Classification": "flink-log4j",
    "Properties": {
      "appender.main.name": "MainAppender",
      "appender.main.type": "RollingFile",
      "appender.main.append" : "false",
      "appender.main.fileName" : "${sys:log.file}",
      "appender.main.filePattern" : "${sys:log.file}.%i",
      "appender.main.layout.type" : "PatternLayout",
      "appender.main.layout.pattern" : "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n",
      "appender.main.policies.type" : "Policies",
      "appender.main.policies.size.type" : "SizeBasedTriggeringPolicy",
      "appender.main.policies.size.size" : "100MB",
      "appender.main.strategy.type" : "DefaultRolloverStrategy",
      "appender.main.strategy.max" : "10"
    },
  }
]
```

**Amazon EMR 버전 5.29.0 이하**

Amazon EMR 버전 5.29.0 이하에서 Flink는 log4j 로깅 프레임워크를 사용합니다. 다음 구성 예제에서는 log4j 형식을 보여줍니다.

```
[
  {
    "Classification": "flink-log4j",
    "Properties": {
      "log4j.appender.file": "org.apache.log4j.RollingFileAppender",
      "log4j.appender.file.append":"true",
      # keep up to 4 files and each file size is limited to 100MB
      "log4j.appender.file.MaxFileSize":"100MB",
      "log4j.appender.file.MaxBackupIndex":4,
      "log4j.appender.file.layout":"org.apache.log4j.PatternLayout",
      "log4j.appender.file.layout.ConversionPattern":"%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n"
    },
  }
]
```

## Java 11과 함께 실행하도록 Flink 구성
<a name="flink-configure-java11"></a>

Amazon EMR 릴리스 6.12.0 이상에서는 Flink에 대해 Java 11 런타임 지원을 제공합니다. 다음 섹션에서는 Flink에 대한 Java 11 런타임 지원을 제공하도록 클러스터를 구성하는 방법을 설명합니다.

**Topics**
+ [클러스터를 생성할 때 Java 11용 Flink 구성](#flink-configure-java11-create)
+ [실행 중인 클러스터에서 Java 11용 Flink 구성](#flink-configure-java11-update)
+ [실행 중인 클러스터에서 Flink의 Java 런타임 확인](#flink-configure-java11-confirm)

### 클러스터를 생성할 때 Java 11용 Flink 구성
<a name="flink-configure-java11-create"></a>

다음 단계에 따라 Flink 및 Java 11 런타임으로 EMR 클러스터를 생성합니다. Java 11 런타임 지원을 추가하는 구성 파일은 `flink-conf.yaml`입니다.

------
#### [ Console ]

**콘솔에서 Flink 및 Java 11 런타임이 포함된 클러스터를 생성하는 방법**

1. 에 로그인 AWS Management Console하고 [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) Amazon EMR 콘솔을 엽니다.

1. 탐색 창의 **EMR on EC2**에서 **클러스터**를 선택하고 **클러스터 생성**을 선택합니다.

1. Amazon EMR 릴리스 6.12.0 이상을 선택하고 Flink 애플리케이션을 설치하도록 선택합니다. 클러스터에 설치하려는 다른 애플리케이션을 모두 선택합니다.

1. 클러스터를 계속 설정합니다. 선택적 **소프트웨어 설정** 섹션에서 기본 **구성 입력** 옵션을 사용하고 다음 구성을 입력합니다.

   ```
   [
       {
         "Classification": "flink-conf",
         "Properties": {
           "containerized.taskmanager.env.JAVA_HOME":"/usr/lib/jvm/jre-11",
           "containerized.master.env.JAVA_HOME":"/usr/lib/jvm/jre-11",
           "env.java.home":"/usr/lib/jvm/jre-11"
         }
       }
   ]
   ```

1. 계속 설정하고 클러스터를 시작합니다.

------
#### [ AWS CLI ]

**CLI에서 Flink 및 Java 11 런타임이 포함된 클러스터를 생성하는 방법**

1. Java 11을 사용하도록 Flink를 구성하는 구성 파일 `configurations.json`을 생성합니다.

   ```
   [
       {
         "Classification": "flink-conf",
         "Properties": {
           "containerized.taskmanager.env.JAVA_HOME":"/usr/lib/jvm/jre-11",
           "containerized.master.env.JAVA_HOME":"/usr/lib/jvm/jre-11",
           "env.java.home":"/usr/lib/jvm/jre-11"
         }
       }
   ]
   ```

1. 다음 예제와 같이에서 Amazon EMR 릴리스 6.12.0 이상을 사용하여 AWS CLI새 EMR 클러스터를 생성하고 Flink 애플리케이션을 설치합니다.

   ```
   aws emr create-cluster --release-label emr-6.12.0 \ 
   --applications Name=Flink \ 
   --configurations file://./configurations.json \ 
   --region us-east-1 \ 
   --log-uri s3://myLogUri \ 
   --instance-type m5.xlarge \ 
   --instance-count 2 \ 
   --service-role EMR_DefaultRole_V2 \ 
   --ec2-attributes KeyName=YourKeyName,InstanceProfile=EMR_EC2_DefaultRole
   ```

------

### 실행 중인 클러스터에서 Java 11용 Flink 구성
<a name="flink-configure-java11-update"></a>

다음 단계를 사용하여 Flink 및 Java 11 런타임으로 실행 중인 EMR 클러스터를 업데이트합니다. Java 11 런타임 지원을 추가하는 구성 파일은 `flink-conf.yaml`입니다.

------
#### [ Console ]

**콘솔에서 Flink 및 Java 11 런타임으로 실행 중인 클러스터를 업데이트하는 방법**

1. 에 로그인 AWS Management Console하고 [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) Amazon EMR 콘솔을 엽니다.

1. 탐색 창에서 **EMR on EC2** 아래 **클러스터**를 선택하고 업데이트할 클러스터를 선택합니다.
**참고**  
클러스터가 Java 11을 지원하려면 Amazon EMR 릴리스 6.12.0 이상을 사용해야 합니다.

1. **구성** 탭을 선택합니다.

1. **인스턴스 그룹 구성** 섹션에서 업데이트하려는 **실행 중**인 인스턴스 그룹을 선택한 다음, 목록 작업 메뉴에서 **재구성**을 선택합니다.

1. 다음과 같이 **속성 편집** 옵션을 사용하여 인스턴스 그룹을 재구성합니다. 각 항목 이후에 **새 구성 추가**를 선택합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/flink-configure.html)

1. **변경 내용 저장**을 선택하여 구성을 추가합니다.

------
#### [ AWS CLI ]

**CLI에서 Flink 및 Java 11 런타임을 사용하도록 실행 중인 클러스터를 업데이트하는 방법**

`modify-instance-groups` 명령을 사용하여 실행 중인 클러스터의 인스턴스 그룹에 대해 새 구성을 지정합니다.

1. 먼저 Java 11을 사용하도록 Flink를 구성하는 `configurations.json` 구성 파일을 생성합니다. 다음 예제에서는 *ig-1xxxxxxx9*를 재구성하려는 인스턴스 그룹의 ID로 바꿉니다. `modify-instance-groups` 명령을 실행하는 동일한 디렉터리에 파일을 저장합니다.

   ```
   [
      {
         "InstanceGroupId":"ig-1xxxxxxx9",
         "Configurations":[
            {
               "Classification":"flink-conf",
               "Properties":{
                 "containerized.taskmanager.env.JAVA_HOME":"/usr/lib/jvm/jre-11",
                 "containerized.master.env.JAVA_HOME":"/usr/lib/jvm/jre-11",
                 "env.java.home":"/usr/lib/jvm/jre-11"
               },
               "Configurations":[]
            }
         ]
      }
   ]
   ```

1. 에서 다음 명령을 AWS CLI실행합니다. 재구성하려는 인스턴스 그룹의 ID를 바꿉니다.

   ```
   aws emr modify-instance-groups --cluster-id j-2AL4XXXXXX5T9 \
   --instance-groups file://configurations.json
   ```

------

### 실행 중인 클러스터에서 Flink의 Java 런타임 확인
<a name="flink-configure-java11-confirm"></a>

실행 중인 클러스터에 대한 Java 런타임을 확인하려면 [SSH를 사용하여 프라이머리 노드에 연결](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)에서 설명한 대로 SSH를 사용하여 프라이머리 노드에 로그인합니다. 그런 다음, 다음 명령을 실행합니다.

```
ps -ef | grep flink
```

`-ef` 옵션과 함께 `ps` 명령은 시스템에서 실행 중인 모든 프로세스를 나열합니다. `grep`로 해당 출력을 필터링하여 `flink` 문자열에 대한 언급을 찾을 수 있습니다. Java 런타임 환경(JRE) 값(`jre-XX`)에 대한 출력을 검토합니다. 다음 출력에서 `jre-11`은 런타임에 Flink용으로 Java 11이 선택되었음을 나타냅니다.

```
flink    19130     1  0 09:17 ?        00:00:15 /usr/lib/jvm/jre-11/bin/java -Djava.io.tmpdir=/mnt/tmp -Dlog.file=/usr/lib/flink/log/flink-flink-historyserver-0-ip-172-31-32-127.log -Dlog4j.configuration=file:/usr/lib/flink/conf/log4j.properties -Dlog4j.configurationFile=file:/usr/lib/flink/conf/log4j.properties -Dlogback.configurationFile=file:/usr/lib/flink/conf/logback.xml -classpath /usr/lib/flink/lib/flink-cep-1.17.0.jar:/usr/lib/flink/lib/flink-connector-files-1.17.0.jar:/usr/lib/flink/lib/flink-csv-1.17.0.jar:/usr/lib/flink/lib/flink-json-1.17.0.jar:/usr/lib/flink/lib/flink-scala_2.12-1.17.0.jar:/usr/lib/flink/lib/flink-table-api-java-uber-1.17.0.jar:/usr/lib/flink/lib/flink-table-api-scala-bridge_2.12-1.17.0.
```

또는 [SSH를 사용하여 프라이머리 노드에 로그인](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)하고 `flink-yarn-session -d` 명령을 사용하여 Flink YARN 세션을 시작합니다. 출력은 다음 예제에서 Flink용 가상 머신(JVM)(`java-11-amazon-corretto`)을 보여줍니다.

```
2023-05-29 10:38:14,129 INFO  org.apache.flink.configuration.GlobalConfiguration           [] - Loading configuration property: containerized.master.env.JAVA_HOME, /usr/lib/jvm/java-11-amazon-corretto.x86_64
```

# Amazon EMR에서 Flink 작업 사용
<a name="flink-jobs"></a>

콘솔을 통해 Amazon EMR 기반 Flink와 상호 작용하는 몇 가지 방법이 있으며, Flink 인터페이스는 ResourceManager Tracking UI와 명령줄에 있습니다. 이들 중 하나를 사용하여 JAR 파일을 Flink 애플리케이션에 제출할 수 있습니다. JAR 파일을 제출하면 Flink JobManager에서 관리하는 작업이 됩니다. JobManager는 Flink 세션 애플리케이션 마스터 대몬(daemon)을 호스팅하는 YARN 노드에 있습니다.

또한 Flink 애플리케이션을 장기 실행 YARN 작업이나 임시 클러스터로 실행할 수 있습니다. 장기 실행 클러스터에서는 Amazon EMR 클러스터에서 실행 중인 Flink 클러스터 하나로 여러 Flink 애플리케이션을 제출할 수 있습니다. Flink 작업을 임시 클러스터에서 실행할 경우 Amazon EMR 클러스터는 Flink 애플리케이션을 실행하는 데 걸리는 시간 동안만 존재하므로 사용한 리소스와 시간에 대해서만 요금이 청구됩니다. Amazon EMR `AddSteps` API 작업, 작업에 대한 단계 인수, 또는 `create-cluster` 명령을 `RunJobFlow` 통해 Flink 작업을 제출할 수 있습니다 AWS CLI `add-steps`.

## 장기 실행 클러스터에서 한 단계로 Flink YARN 애플리케이션 시작
<a name="flink-add-step"></a>

여러 클라이언트가 YARN API 작업을 통해 작업을 제출할 수 있는 Flink 애플리케이션을 시작하려면 클러스터를 생성하거나 Flink 애플리케이션을 기존 클러스터에 추가해야 합니다. 새 클러스터를 생성하는 방법에 대한 지침은 [Flink를 포함하는 클러스터 생성](flink-create-cluster.md) 부분을 참조하세요. 기존 클러스터에서 YARN 세션을 시작하려면 콘솔, AWS CLI또는 Java SDK에서 다음 단계를 수행합니다.

**참고**  
`flink-yarn-session` 명령은 실행을 간소화하기 위한 `yarn-session.sh` 스크립트 래퍼로 Amazon EMR 버전 5.5.0에 추가되었습니다. 이전 버전의 Amazon EMR을 사용하는 경우 콘솔에서 **인수**에 대해 `bash -c "/usr/lib/flink/bin/yarn-session.sh -d"`를 대체하거나 AWS CLI 명령에서 `Args`를 대체합니다.

**콘솔에서 기존 클러스터의 Flink 작업을 제출하는 방법**

기존 클러스터에서 `flink-yarn-session` 명령을 사용하여 Flink 세션을 제출합니다.

1. [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) Amazon EMR 콘솔을 엽니다.

1. 클러스터 목록에서 이전에 시작한 클러스터를 선택합니다.

1. 클러스터 세부 정보 페이지에서 **단계**, **Add Step(단계 추가)**을 선택합니다.

1. 아래 지침에 따라 파라미터를 입력하고 **추가**를 선택합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/flink-jobs.html)

**를 사용하여 기존 클러스터에서 Flink 작업을 제출하려면 AWS CLI**
+ `add-steps` 명령을 사용하여 장기 실행 클러스터에 Flink 작업을 추가합니다. 다음 예제 명령은 YARN 클러스터 내에서 분리된 상태(`-d`)로 Flink 세션을 시작하도록 `Args="flink-yarn-session", "-d"`를 지정합니다. 인수에 대한 자세한 내용은 최신 Flink 설명서에서 [YARN Setup](https://ci.apache.org/projects/flink/flink-docs-release-1.3/setup/yarn_setup.html#flink-yarn-session)을 참조하세요.

  ```
  aws emr add-steps --cluster-id <j-XXXXXXXX> --steps Type=CUSTOM_JAR,Name=<example-flink-step-name>,Jar=command-runner.jar,Args="flink-yarn-session","-d"
  ```

## 장기 실행 클러스터에서 기존 Flink 애플리케이션에 작업 제출
<a name="flink-submit-work"></a>

장기 실행 클러스터에 기존 Flink 애플리케이션이 이미 있는 경우 클러스터의 Flink 애플리케이션 ID를 지정하여 클러스터에 작업을 제출할 수 있습니다. 애플리케이션 ID를 얻으려면 `yarn application -list`에서 AWS CLI 또는 [YarnClient](https://hadoop.apache.org/docs/current/api/org/apache/hadoop/yarn/client/api/YarnClient.html) API 작업을 통해를 실행합니다.

```
$ yarn application -list
16/09/07 19:32:13 INFO client.RMProxy: Connecting to ResourceManager at ip-10-181-83-19.ec2.internal/10.181.83.19:8032
Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):1
Application-Id    Application-Name    Application-Type    User    Queue    State    Final-State    Progress    Tracking-URL
application_1473169569237_0002    Flink session with 14 TaskManagers (detached)	        Apache Flink	    hadoop	   default	           RUNNING	         UNDEFINED	           100%	http://ip-10-136-154-194.ec2.internal:33089
```

이 Flink 세션의 애플리케이션 ID는 AWS CLI 또는 SDK에서 애플리케이션에 작업을 제출하는 데 사용할 수 `application_1473169569237_0002`있는 입니다.

**Example SDK for Java**  

```
List<StepConfig> stepConfigs = new ArrayList<StepConfig>();
  
HadoopJarStepConfig flinkWordCountConf = new HadoopJarStepConfig()
    .withJar("command-runner.jar")
    .withArgs("flink", "run", "-m", "yarn-cluster", "-yid", "application_1473169569237_0002", "-yn", "2", "/usr/lib/flink/examples/streaming/WordCount.jar", 
      "--input", "s3://amzn-s3-demo-bucket/pg11.txt", "--output", "s3://amzn-s3-demo-bucket/alice2/");
  
StepConfig flinkRunWordCount = new StepConfig()
  .withName("Flink add a wordcount step")
  .withActionOnFailure("CONTINUE")
  .withHadoopJarStep(flinkWordCountConf);
  
stepConfigs.add(flinkRunWordCount); 
  
AddJobFlowStepsResult res = emr.addJobFlowSteps(new AddJobFlowStepsRequest()
   .withJobFlowId("myClusterId")
   .withSteps(stepConfigs));
```

**Example AWS CLI**  

```
aws emr add-steps --cluster-id <j-XXXXXXXX> \
--steps Type=CUSTOM_JAR,Name=Flink_Submit_To_Long_Running,Jar=command-runner.jar,\
Args="flink","run","-m","yarn-cluster","-yid","application_1473169569237_0002",\
"/usr/lib/flink/examples/streaming/WordCount.jar",\
"--input","s3://amzn-s3-demo-bucket/pg11.txt","--output","s3://amzn-s3-demo-bucket/alice2/" \
--region <region-code>
```

## 임시 Flink 작업 제출
<a name="flink-transient-job"></a>

다음 예제에서는 Flink 작업을 실행한 다음 완료 시 종료하는 임시 클러스터를 시작합니다.

**Example SDK for Java**  

```
import java.util.ArrayList;
import java.util.List;
import com.amazonaws.AmazonClientException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduce;
import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClientBuilder;
import com.amazonaws.services.elasticmapreduce.model.*;

public class Main_test {

	public static void main(String[] args) {
		AWSCredentials credentials_profile = null;
		try {
			credentials_profile = new ProfileCredentialsProvider("default").getCredentials();
		} catch (Exception e) {
			throw new AmazonClientException(
					"Cannot load credentials from .aws/credentials file. " +
							"Make sure that the credentials file exists and the profile name is specified within it.",
					e);
		}

		AmazonElasticMapReduce emr = AmazonElasticMapReduceClientBuilder.standard()
				.withCredentials(new AWSStaticCredentialsProvider(credentials_profile))
				.withRegion(Regions.US_WEST_1)
				.build();

		List<StepConfig> stepConfigs = new ArrayList<StepConfig>();
		HadoopJarStepConfig flinkWordCountConf = new HadoopJarStepConfig()
				.withJar("command-runner.jar")
				.withArgs("bash", "-c", "flink", "run", "-m", "yarn-cluster", "-yn", "2",
						"/usr/lib/flink/examples/streaming/WordCount.jar", "--input", "s3://path/to/input-file.txt", "--output",
						"s3://path/to/output/");

		StepConfig flinkRunWordCountStep = new StepConfig()
				.withName("Flink add a wordcount step and terminate")
				.withActionOnFailure("CONTINUE")
				.withHadoopJarStep(flinkWordCountConf);

		stepConfigs.add(flinkRunWordCountStep);

		Application flink = new Application().withName("Flink");

		RunJobFlowRequest request = new RunJobFlowRequest()
				.withName("flink-transient")
				.withReleaseLabel("emr-5.20.0")
				.withApplications(flink)
				.withServiceRole("EMR_DefaultRole")
				.withJobFlowRole("EMR_EC2_DefaultRole")
				.withLogUri("s3://path/to/my/logfiles")
				.withInstances(new JobFlowInstancesConfig()
						.withEc2KeyName("myEc2Key")
						.withEc2SubnetId("subnet-12ab3c45")
						.withInstanceCount(3)
						.withKeepJobFlowAliveWhenNoSteps(false)
						.withMasterInstanceType("m4.large")
						.withSlaveInstanceType("m4.large"))
				.withSteps(stepConfigs);

		RunJobFlowResult result = emr.runJobFlow(request);
		System.out.println("The cluster ID is " + result.toString());

	}

}
```

**Example AWS CLI**  
`create-cluster` 하위 명령을 사용하여 Flink 작업 완료 시 종료되는 임시 클러스터를 생성합니다.  

```
aws emr create-cluster --release-label emr-5.2.1 \
--name "Flink_Transient" \
--applications Name=Flink \
--configurations file://./configurations.json \
--region us-east-1 \
--log-uri s3://myLogUri \
--auto-terminate
--instance-type m5.xlarge \
--instance-count 2 \
--service-role EMR_DefaultRole_V2 \ 
--ec2-attributes KeyName=<YourKeyName>,InstanceProfile=EMR_EC2_DefaultRole \
--steps Type=CUSTOM_JAR,Jar=command-runner.jar,Name=Flink_Long_Running_Session,\
Args="bash","-c","\"flink run -m yarn-cluster /usr/lib/flink/examples/streaming/WordCount.jar
--input s3://amzn-s3-demo-bucket/pg11.txt --output s3://amzn-s3-demo-bucket/alice/""
```

# Scala 쉘 사용
<a name="flink-scala"></a>

EMR 클러스터용 Flink Scala 쉘은 새로운 YARN 세션을 시작하도록 구성됩니다. 아래 절차에 따라 Scala 셸을 사용할 수 있습니다.

**프라이머리 노드에서 Flink Scala 쉘 사용**

1. [SSH를 사용하여 프라이머리 노드에 연결](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)에서 설명한 대로 SSH를 사용하여 프라이머리 노드에 로그인합니다.

1. 다음을 입력하여 셸을 시작합니다.

   Amazon EMR 버전 5.5.0 이상에서는 다음 명령을 사용하여 하나의 TaskManager로 Scala 쉘용 Yarn 클러스터를 시작할 수 있습니다.

   ```
   % flink-scala-shell yarn 1
   ```

   이전 버전의 Amazon EMR에서는 다음을 사용합니다.

   ```
   % /usr/lib/flink/bin/start-scala-shell.sh yarn 1
   ```

   이렇게 하면 Flink Scala 셸이 시작되어 대화식으로 Flink를 사용할 수 있습니다. 다른 인터페이스 및 옵션과 마찬가지로, 셸에서 실행할 작업 수에 따라 이 예제에 사용된 `-n` 옵션 값을 조정할 수 있습니다.

   자세한 내용은 공식 Apache Flink 설명서에서 [Scala REPL](https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/scala_shell.html)을 참조하세요.

# Flink 웹 인터페이스 찾기
<a name="flink-web-interface"></a>

Flink 애플리케이션에 속하는 애플리케이션 마스터는 Flink 웹 인터페이스를 호스팅합니다. JAR을 작업으로 제출하거나 다른 작업의 현재 상태를 볼 수도 있습니다. Flink 웹 인터페이스는 실행 중인 Flink 세션이 있는 동안만 활성화됩니다. 장기 실행 YARN 작업이 이미 활성화되어 있는 경우, *Amazon EMR 관리 안내서*에서 [SSH를 사용하여 프라이머리 노드에 연결](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) 주제의 지침에 따라 YARN ResourceManager에 연결할 수 있습니다. 예를 들어 SSH 터널을 설정했으며 브라우저에서 프록시를 활성화한 경우 EMR 클러스터 세부 정보 페이지의 **연결**에서 ResourceManager 연결을 선택합니다.

![\[Resource Manager link under Connections section in 클러스터 details page.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/resourcemanager.png)


ResourceManager를 찾은 후에는 Flink 세션을 호스팅하고 있는 YARN 애플리케이션을 선택합니다. **Tracking UI(추적 UI)** 열에서 링크를 선택합니다.

![\[Application details table showing a running Apache Flink session with ApplicationMaster link.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/resourcemanager2.png)


Flink 웹 인터페이스에서는 구성을 보고 고유의 사용자 지정 JAR를 작업으로 제출하거나 진행 중인 작업을 모니터링할 수 있습니다.

![\[Apache Flink Dashboard overview showing task managers, slots, and job statistics.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/flink.png)


# Flink 오토스케일러
<a name="flink-autoscaler"></a>

## 개요
<a name="flink-autoscaler-overview"></a>

Amazon EMR 릴리스 6.15.0 이상에서는 Flink 오토스케일러를 지원합니다.** 작업 오토스케일러 조정 기능은 실행 중인 Flink 스트리밍 작업에서 지표를 수집하고 개별 작업 버텍스의 규모를 자동 조정합니다. 그 결과 역압이 줄고 설정한 사용률 목표를 달성할 수 있습니다.

자세한 내용을 확인하려면 Apache Flink Kubernetes 연산자 문서의 [오토스케일러](https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main/docs/custom-resource/autoscaler/) 섹션을 참조하세요.**

## 고려 사항
<a name="flink-autoscaler-considerations"></a>
+ Flink 오토스케일러는 Amazon EMR 6.15.0 이상에서 지원됩니다.
+ Flink 오토스케일러는 스트리밍 작업에 대해서만 지원됩니다.
+ 적응형 스케줄러만 지원됩니다. 기본 스케줄러는 지원되지 않습니다.
+ 동적 리소스 프로비저닝을 위해 클러스터 스케일링 기능을 활성화할 것을 권장합니다. Amazon EMR Managed Scaling이 선호되는 이유는 5\$110초마다 지표 평가가 발생하기 때문입니다. 이 간격에서 클러스터는 필요한 클러스터 리소스의 변화에 더 쉽게 적응할 수 있습니다.

## 오토스케일러 활성화
<a name="flink-autoscaler-start"></a>

EC2 클러스터에서 Amazon EMR을 만드는 경우 다음 단계를 사용하여 Flink 오토스케일러를 활성화하세요.

1. Amazon EMR 콘솔에서 새 EMR 클러스터를 생성합니다.

   1. Amazon EMR 릴리스 `emr-6.15.0` 이상을 선택합니다. **Flink** 애플리케이션 번들을 선택하고 클러스터에 포함하려는 다른 애플리케이션을 선택합니다.  
![\[Application bundle options for Amazon EMR클러스터, with Flink highlighted and selected.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/emr-flink-cluster-create.png)

   1. **클러스터 크기 조정 및 프로비저닝** 옵션에서 **EMR 관리형 크기 조정 사용**을 선택합니다.  
![\[클러스터 scaling options: manual, EMR-managed (selected), or custom automatic scaling.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/emr-flink-cluster-managedscaling.png)

1. **소프트웨어 설정** 섹션에서 다음 구성을 입력하고 Flink 오토스케일러를 활성화합니다. 테스트 시나리오의 경우에는, 결정 간격, 지표 창 간격 및 안정화 간격을 더 낮은 값으로 설정하여 작업에서 조정 결정이 즉시 내려져 검증이 수월해지도록 합니다.

   ```
   [
     {
       "Classification": "flink-conf",
       "Properties": {
         "job.autoscaler.enabled": "true",
         "jobmanager.scheduler": "adaptive",
         "job.autoscaler.stabilization.interval": "60s",
         "job.autoscaler.metrics.window": "60s",
         "job.autoscaler.decision.interval": "10s",
         "job.autoscaler.debug.logs.interval": "60s"
       }
     }
   ]
   ```

1. 원하는 기타 설정을 선택하거나 구성한 후 Flink 오토스케일러를 사용하는 클러스터를 만드세요.

## 오토스케일러 구성
<a name="flink-autoscaler-config"></a>

이 섹션에서는 특정한 요구 사항을 토대로 변경할 수 있는 구성들을 대부분 설명합니다.

**참고**  
`time`, `interval` 및 `window` 설정과 같은 시간 기반 구성을 사용하는 경우, 단위가 지정되지 않은 경우의 기본 단위는 밀리초입니다. 따라서 접미사가 없는 `30` 값은 30밀리초입니다. 기타 시간 단위의 경우에는, *초*의 경우 `s`, *분*의 경우 `m`, 또는 *시간*의 경우 `h`를 적절한 접미사로 포함하세요.

**Topics**
+ [루프 구성](#flink-autoscaler-config-loop)
+ [지표 및 기록 구성](#flink-autoscaler-config-metrics)
+ [버텍스 구성](#flink-autoscaler-config-vertex)
+ [백로그 구성](#flink-autoscaler-config-backlog)
+ [규모 조정 작업 구성](#flink-autoscaler-config-scale)

### 오토스케일러 루프 구성
<a name="flink-autoscaler-config-loop"></a>

오토스케일러는 몇 개의 구성 가능 시간 간격마다 작업 버텍스 레벨 지표를 가져와 실행 가능한 규모로 배율로 변환하고, 신규 작업 버텍스 병렬 처리를 예측하며, 이를 작업 스케줄러에 권장합니다. 지표는 작업 재시작 시간과 클러스터 안정화 간격 이후에만 수집됩니다.


| Config 키 | 기본값  | 설명 | 예제 값 | 
| --- | --- | --- | --- | 
| job.autoscaler.enabled | false | Flink 클러스터에서 오토스케일링을 활성화합니다. | true, false | 
| job.autoscaler.decision.interval | 60s | 오토스케일러 결정 간격입니다. | 30(기본 단위는 밀리초), 5m, 1h  | 
| job.autoscaler.restart.time | 3m | 운영자가 기록을 통해 확실하게 판단할 수 있을 때까지 사용하는 예상 재시작 시간입니다. | 30(기본 단위는 밀리초), 5m, 1h  | 
| job.autoscaler.stabilization.interval | 300s | 새로운 조정이 실행되지 않는 안정화 기간입니다. | 30(기본 단위는 밀리초), 5m, 1h  | 
| job.autoscaler.debug.logs.interval | 300s | 오토스케일러 디버그 로그 간격입니다. | 30(기본 단위는 밀리초), 5m, 1h  | 

### 지표 집계 및 기록 구성
<a name="flink-autoscaler-config-metrics"></a>

오토스케일러는 지표를 가져와 시간 기반 슬라이딩 창에 대해 집계하고, 이 항목에 대한 평가를 통해 규모 조정 결정이 내려집니다. 각 작업 버텍스에 대한 규모 조정 결정 기록은 새로운 병렬 처리를 추정하는 데 활용됩니다. 이러한 항목에는 연령 기반 만료일과 기록 크기(최소 1)가 모두 포함되어 있습니다.


| Config 키 | 기본값  | 설명 | 예제 값 | 
| --- | --- | --- | --- | 
| job.autoscaler.metrics.window | 600s | Scaling metrics aggregation window size. | 30(기본 단위는 밀리초), 5m, 1h  | 
| job.autoscaler.history.max.count | 3 | 버텍스당 유지할 과거 규모 조정 결정의 최대 수입니다. | 1\$1Integer.MAX\$1VALUE | 
| job.autoscaler.history.max.age | 24h | 버텍스당 유지할 과거 규모 조정 결정의 최소 수입니다. | 30(기본 단위는 밀리초), 5m, 1h  | 

### 작업 버텍스 수준 구성
<a name="flink-autoscaler-config-vertex"></a>

각 작업 버텍스의 병렬 처리는 목표 사용률을 근거로 수정되며 최소-최대 병렬 처리 한도에 의해 제한됩니다. 목표 사용률을 100%(즉, 값 1)에 가깝게 설정하는 것은 바람직하지 않으며 사용률 경계는 중간 부하 변동을 처리하기 위한 완충제 역할을 합니다.


| Config 키 | 기본값  | 설명 | 예제 값 | 
| --- | --- | --- | --- | 
| job.autoscaler.target.utilization | 0.7 | 목표 버텍스 사용률. | 0 - 1 | 
| job.autoscaler.target.utilization.boundary | 0.4 | 목표 버텍스 사용률 경계. 현재 처리 속도가 범위 [target\$1rate / (target\$1utilization - boundary)\$1(target\$1rate / (target\$1utilization \$1 boundary)] 이내인 경우에는 규모 조정이 수행되지 않습니다. | 0 - 1 | 
| job.autoscaler.vertex.min-parallelism | 1 | 오토스케일러에서 사용할 수 있는 최소 병렬 처리입니다. | 0 - 200 | 
| job.autoscaler.vertex.max-parallelism | 200 | 오토스케일러에서 사용할 수 있는 최대 병렬 처리입니다. 이 한도가 Flink 구성 또는 각 운영자에 구성된 최대 병렬 처리보다 더 높은 경우 이 한도는 무시됩니다. | 0 - 200 | 

### 백로그 처리 구성
<a name="flink-autoscaler-config-backlog"></a>

작업 버텍스에는 규모 조정 작업 기간 동안 누적되는 진행 중 이벤트 또는 백로그를 처리하기 위해 추가적인 리소스가 필요합니다. 이를 `catch-up` 기간이라고도 합니다. 백로그를 처리하는 데 걸리는 시간이 구성된 `lag -threshold` 값을 초과하면 작업 버텍스 목표 사용률이 최대 수준으로 높아집니다. 그 결과 백로그가 처리되는 동안 불필요한 규모 조정 작업을 막을 수 있습니다.


| Config 키 | 기본값  | 설명 | 예제 값 | 
| --- | --- | --- | --- | 
| job.autoscaler.backlog-processing.lag-threshold | 5m | 지연 임계값은 불필요한 크기 조정 작업을 방지하는 동시에 지연을 발생시키는 진행 중 메시지를 제거합니다. | 30(기본 단위는 밀리초), 5m, 1h  | 
| job.autoscaler.catch-up.duration | 15m | 규모 조정 작업 후에 백로그를 완전히 처리하는 데 걸리는 목표 기간입니다. 0으로 설정하여 백로그 기반 크기 조정을 비활성화합니다. | 30(기본 단위는 밀리초), 5m, 1h  | 

### 규모 조정 작업 구성
<a name="flink-autoscaler-config-scale"></a>

오토스케일러는 유예 기간 내에 스케일 업 작업 직후에 스케일 다운 작업을 수행하지 않습니다. 이 경우 일시적인 부하 변동으로 인해 스케일 업-다운-업-다운 작업이 불필요하게 반복되는 것을 막을 수 있습니다.

스케일 다운 작업 비율을 사용하여 병렬 처리를 단계적으로 줄이고 리소스를 릴리스하여 일시적인 부하 급상승에 대비할 수 있습니다. 이 작업을 통해 대규모 스케일 다운 작업 후에 불필요한 소규모 스케일 업 작업이 진행되는 것을 방지할 수도 있습니다.

과거 작업 버텍스 규모 조정 결정 기록을 근거로 무의미한 스케일 업 작업을 감지하여 추가적인 변경 처리의 변경을 방지할 할 수 있습니다.


| Config 키 | 기본값  | 설명 | 예제 값 | 
| --- | --- | --- | --- | 
| job.autoscaler.scale-up.grace-period | 1h | 버텍스가 스케일 업된 후에 스케일 다운이 허용되지 않는 기간입니다. | 30(기본 단위는 밀리초), 5m, 1h  | 
| job.autoscaler.scale-down.max-factor | 0.6 | 최대 스케일 다운 계수입니다. 값이 1이면 스케일 다운에 제한이 없음을 의미합니다. 0.6은 당초 병렬 처리의 60%로만 작업을 스케일 다운할 수 있음을 의미합니다. | 0 - 1 | 
| job.autoscaler.scale-up.max-factor | 100000. | 최대 스케일 업 비율입니다. 값이 2.0이면 작업은 현재 병렬 처리의 200%까지만 스케일 업될 수 있습니다. | 0 - Integer.MAX\$1VALUE | 
| job.autoscaler.scaling.effectiveness.detection.enabled | false | 무의미한 규모 조정 작업을 감지하고 자동 스케일러가 추가 스케일 업을 차단하도록 허용할지 여부입니다. | true, false | 

# 태스크 복구 및 작업 규모 조정을 위한 작업 재시작 시간 최적화
<a name="flink-restart"></a>

태스크가 실패하거나 규모 조정 작업이 발생할 경우 Flink는 마지막으로 완료된 체크포인트의 태스크를 다시 재실행하려고 시도합니다. 체크포인트 상태의 크기와 병렬 태스크의 수에 따라 재시작 프로세스를 실행하는 데 1분 이상 소요될 수 있습니다. 프로세스를 다시 시작하는 동안에는 작업에 대한 백로그 태스크가 누적될 수 있습니다. 그렇지만 Flink는 실행 그래프의 복구 및 재시작 속도를 최적화하여 작업 안정성을 향상시킬 수 있는 방법이 몇 가지 있습니다.

이 페이지에서는 Amazon EMR Flink를 사용하여 태스크 복구 및 규모 조정 작업에서 작업 재시작 시간을 단축할 수 있는 몇 가지 방법을 설명합니다.

**Topics**
+ [태스크-로컬 복구](#flink-restart-task-local)
+ [일반 로그 기반 증분 체크포인트](#flink-restart-log-check)
+ [세분화된 복구](#flink-restart-fine-grained)
+ [적응형 스케줄러의 결합된 재시작 메커니즘](#flink-restart-combined)

## 태스크-로컬 복구
<a name="flink-restart-task-local"></a>

**참고**  
태스크-로컬 복구는 Amazon EMR 6.0.0 이상에서 지원됩니다.

Flink 체크포인트를 사용할 경우 각 태스크에서 Flink가 Amazon S3와 같은 분산 스토리지에 기록하는 상태 스냅샷을 만듭니다. 복구의 경우 태스크는 분산 스토리지를 통해 해당 상태를 복원합니다. 분산 스토리지에서는 내결함성을 제공하며 모든 노드에서 액세스가 가능하기 때문에 크기 재조정이 이뤄지는 동안 상태를 재분배할 수 있습니다.

하지만 원격 분산 저장소에는 모든 태스크에서 네트워크를 통해 원격 위치에서 해당 상태를 읽어야 한다는 단점도 있습니다. 이러한 한계로 인해 태스크 복구 또는 규모 조정 작업 중에 대규모 상태의 복구 시간이 길어질 수 있습니다.

이와 같은 긴 복구 시간 문제는 **태스크-로컬 복구를 통해 해결됩니다. 태스크에서는 체크포인트의 상태를 로컬 디스크와 같이 해당 작업에 대해 로컬인 보조 스토리지에 기록합니다. 또한 태스크는 기본 스토리지(이 경우 Amazon S3)에 상태를 저장합니다. 복구가 진행되는 동안 스케줄러는 태스크가 이전에 실행된 동일한 태스크 관리자에서 태스크를 예약하기 때문에 원격 상태 저장소에서 데이터를 읽는 대신 로컬 상태 저장소에서 복구할 수 있습니다. 자세한 내용을 알아보려면 *Apache Flink 설명서*의 [태스크 로컬 복구](https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/large_state_tuning/#task-local-recovery)를 참조하세요.

샘플 작업을 사용한 벤치마크 테스트 결과에 따르면 태스크-로컬 복구가 활성화된 상태에서는 복구 시간이 몇 분에서 몇 초로 단축된 것으로 확인되었습니다.

태스크-로컬 복구를 활성화하려면 `flink-conf.yaml` 파일에 다음과 같은 구성을 설정하세요. 체크포인트 간격의 값을 밀리초 단위로 지정하세요.

```
    state.backend.local-recovery: true
    state.backend: hasmap or rocksdb
    state.checkpoints.dir: s3://storage-location-bucket-path/checkpoint
    execution.checkpointing.interval: 15000
```

## 일반 로그 기반 증분 체크포인트
<a name="flink-restart-log-check"></a>

**참고**  
일반 로그 기반 증분 체크포인트는 Amazon EMR 6.10.0 이상에서 지원됩니다.

체크포인트의 속도를 높이기 위해 일반 로그 기반 증분 체크포인트가 Flink 1.16에 추가되었습니다. 체크포인트 간격을 빠르게 하면 복구 후 다시 처리해야 하는 이벤트가 줄어들기 때문에 복구 작업이 적어지는 경우가 많습니다. 자세한 내용은 *Apache Flink 블로그*에서 [일반 로그 기반 증분 체크포인트로 체크포인트의 속도 및 안정성 강화](https://flink.apache.org/2022/05/30/improving-speed-and-stability-of-checkpointing-with-generic-log-based-incremental-checkpoints/)를 참조하세요.

샘플 작업을 이용하여 수행한 벤치마크 테스트에서 일반 로그 기반 증분 체크포인트를 사용하면 체크포인트 시간이 몇 분에서 몇 초로 단축된 것이 확인되었습니다.

일반 로그 기반 증분 체크포인트를 활성화하려면 `flink-conf.yaml` 파일에 다음 구성을 설정하세요. 체크포인트 간격의 값을 밀리초 단위로 지정하세요.

```
    state.backend.changelog.enabled: true 
    state.backend.changelog.storage: filesystem
    dstl.dfs.base-path: s3://bucket-path/changelog
    state.backend.local-recovery: true
    state.backend: rocksdb
    state.checkpoints.dir: s3://bucket-path/checkpoint
    execution.checkpointing.interval: 15000
```

## 세분화된 복구
<a name="flink-restart-fine-grained"></a>

**참고**  
기본 스케줄러에 대한 세분화된 복구 지원은 Amazon EMR 6.0.0에서 이용할 수 있습니다. 적응형 스케줄러에서의 세분화된 복구 지원은 Amazon EMR 6.15.0 이상에서 이용할 수 있습니다.

실행 중에 태스크가 실패하면 Flink에서는 전체 실행 그래프를 재설정하고 마지막으로 완료된 체크포인트에서 전체 재실행을 트리거합니다. 이 방식은 실패한 태스크를 재실행하는 것보다 비용이 많이 듭니다. 세분화된 복구에서는 실패한 태스크의 파이프라인으로 연결된 구성 요소만 재시작합니다. 다음 예제의 작업 그래프에는 버텍스가 5개(`A`\$1`E`) 있습니다. 버텍스 사이에 있는 모든 연결은 포인트별 분포로 파이프라인되며 작업의 `parallelism.default`는 `2`로 설정됩니다.

```
A → B → C → D → E
```

이 예시에서는 태스크가 총 10개 실행 중입니다. 첫 번째 파이프라인(`a1`\$1`e1`)은 TaskManager(`TM1`)에서 실행되고 두 번째 파이프라인(`a2`\$1`e2`)은 또 다른 TaskManager(`TM2`)에서 실행됩니다.

```
a1 → b1 → c1 → d1 → e1
a2 → b2 → c2 → d2 → e2
```

`a1 → e1` 및 `a2 → e2`라는 두 개의 구성 요소가 파이프라인으로 연결되어 있습니다. `TM1` 또는 `TM2` 중에 하나가 실패하면 실패는 TaskManager가 중이던 파이프라인에 있는 태스크 5개에만 영향을 미칩니다. 재시작 전략에 따라 영향을 받는 파이프라인 구성 요소만 시작됩니다.

세분화된 복구는 완벽히 병렬화된 Flink 작업에서만 작동합니다. `keyBy()` 또는 `redistribute()` 작업에서는 지원되지 않습니다. 자세한 내용은 *Flink 개선 제안* Jira 프로젝트의 [FLIP-1: 태스크 실패에서 세분화된 복구](https://cwiki.apache.org/confluence/display/FLINK/FLIP-1%3A+Fine+Grained+Recovery+from+Task+Failures)를 참조하세요.

세분화된 복구를 활성화하려면 `flink-conf.yaml` 파일에 다음과 같은 구성을 설정하세요.

```
jobmanager.execution.failover-strategy: region 
restart-strategy: exponential-delay or fixed-delay
```

## 적응형 스케줄러의 결합된 재시작 메커니즘
<a name="flink-restart-combined"></a>

**참고**  
적응형 스케줄러의 결합된 재시작 메커니즘은 Amazon EMR 6.15.0 이상에서 지원됩니다.

적응형 스케줄러에서는 가용 슬롯을 기반으로 작업 병렬성을 조정할 수 있습니다. 이 스케줄러는 구성된 작업 병렬 처리에 적합한 가용 슬롯이 충분하지 않은 경우 병렬 처리의 수를 자동으로 줄입니다. 새 슬롯이 가용 상태가 되면 작업은 구성된 작업 병렬 처리로 다시 확장됩니다. 적응형 스케줄러는 가용 리소스가 충분하지 않은 경우 작업에서 가동 중지가 발생하는 것은 방지합니다. Flink Autoscaler에 대해 지원되는 스케줄러입니다. 이러한 이유들로 인해 적응형 스케줄러를 Amazon EMR Flink와 함께 사용하는 것이 좋습니다. 단, 적응형 스케줄러는 짧은 시간 내에 여러 번 재시작을 수행할 수 있으며, 새 리소스가 추가될 때마다 한 번씩 다시 시작됩니다. 이로 인해 작업 성능이 떨어질 수 있습니다.

Amazon EMR 6.15.0 이상에서는 Flink에 첫 번째 리소스가 추가될 때 재시작 기간을 연 다음, 구성된 기본 1분 간격까지 기다리는 적응형 스케줄러의 결합된 재시작 메커니즘이 있습니다. 이 메커니즘에서는 구성된 병렬 처리로 작업을 실행하기 위한 가용 리소스가 충분하거나 간격 제한 시간이 초과될 경우 단일 재시작을 수행합니다.

샘플 작업을 이용한 벤치마크 테스트에서는 적응형 스케줄러와 Flink Autoscaler를 사용할 경우 이 기능이 기본 동작보다 10% 더 많은 레코드를 처리하는 것이 입증되었습니다.

결합된 재시작 메커니즘을 활성화하려면 `flink-conf.yaml` 파일에 다음 구성을 설정하세요.

```
jobmanager.adaptive-scheduler.combined-restart.enabled: true 
jobmanager.adaptive-scheduler.combined-restart.window-interval: 1m
```

# Amazon EMR의 Zeppelin에서 Flink 작업
<a name="flink-zeppelin"></a>

## 소개
<a name="flink-zeppelin-intro"></a>

Amazon EMR 릴리스 6.10.0 이상에서는 Apache Flink와 [Apache Zeppelin](emr-zeppelin.md)의 통합을 지원합니다. Zeppelin 노트북을 통해 대화형 방식으로 Flink 작업을 제출할 수 있습니다. Flink 인터프리터를 사용하면 Flink 쿼리를 실행하고, Flink 스트리밍 및 배치 작업을 정의하며, Zeppelin 노트북 내에서 출력을 시각화할 수 있습니다. Flink 인터프리터는 Flink REST API를 기반으로 빌드됩니다. 이를 통해 Zeppelin 환경 내에서 Flink 작업에 액세스하고 해당 작업을 조작하여 실시간 데이터 처리 및 분석을 수행할 수 있습니다.

Flink 인터프리터에는 4개의 하위 인터프리터가 있습니다. 용도는 다양하지만 모두 JVM에 속하며 Flink에 사전 구성된 동일한 진입점(`ExecutionEnviroment`, `StreamExecutionEnvironment`, `BatchTableEnvironment`, `StreamTableEnvironment`)을 공유합니다. 인터프리터는 다음과 같습니다.
+ `%flink` - `ExecutionEnvironment`, `StreamExecutionEnvironment`, `BatchTableEnvironment`, `StreamTableEnvironment`를 생성하고 Scala 환경 제공
+ `%flink.pyflink` - Python 환경 제공
+ `%flink.ssql` - 스트리밍 SQL 환경 제공
+ `%flink.bsql` - 배치 SQL 환경 제공

## 사전 조건
<a name="flink-zeppelin-prerequisites"></a>
+ Amazon EMR 6.10.0 이상에서 생성된 클러스터에 대해 Flink와 Zeppelin의 통합이 지원됩니다.
+ 이러한 단계에 필요한 EMR 클러스터에 호스팅되는 웹 인터페이스를 보려면 인바운드 액세스를 허용하도록 SSH 터널을 구성해야 합니다. 자세한 내용은 [프라이머리 노드에서 호스팅되는 웹 사이트를 표시하도록 프록시 설정 구성](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-proxy.html)을 참조하세요.

## EMR 클러스터에서 Zeppelin-Flink 구성
<a name="flink-zeppelin-configure"></a>

다음 단계를 사용하여 Apache Zeppelin 기반 Apache Flink가 EMR 클러스터에서 실행되도록 구성합니다.

1. Amazon EMR 콘솔에서 새 클러스터를 생성합니다. Amazon EMR 릴리스의 경우 emr-6.10.0 이상을 선택합니다. 그런 다음 사용자 지정 옵션을 사용하여 애플리케이션 번들을 사용자 지정하도록 선택합니다. 번들에 최소한 Flink, Hadoop, Zeppelin을 포함합니다.  
![\[Amazon EMR 콘솔에서 사용자 지정 옵션을 통해 애플리케이션 번들을 사용자 지정합니다. 번들에 최소한 Flink, Hadoop, Zeppelin 포함\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/emr-flink-zeppelin-console.png)

1. 원하는 설정으로 나머지 클러스터를 생성합니다.

1. 클러스터가 실행되면 콘솔에서 클러스터를 선택하여 세부 정보를 확인하고 애플리케이션 탭을 엽니다. 애플리케이션 사용자 인터페이스 섹션에서 Zeppelin을 선택하여 Zeppelin 웹 인터페이스를 엽니다. [사전 조건](#flink-zeppelin-prerequisites)에 설명된 대로 프라이머리 노드에 대한 SSH 터널과 프록시 연결을 사용하여 Zeppelin 웹 인터페이스에 대한 액세스를 설정했는지 확인합니다.  
![\[Zeppelin 웹 인터페이스에서 새 노트북을 가져오고 생성할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/welcome-to-zeppelin.png)

1. 이제 Flink를 기본 인터프리터로 사용하여 Zeppelin 노트북에서 새 노트를 생성할 수 있습니다.  
![\[Flink를 기본 인터프리터로 사용하여 Zeppelin 노트북에서 새 노트를 생성할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/emr-flink-zeppelin-create-notebook.png)

1. Zeppelin 노트북에서 Flink 작업을 실행하는 방법을 보여주는 다음 코드 예제를 참조하세요.

## EMR 클러스터에서 Zeppelin-Flink를 사용하여 Flink 작업 실행
<a name="flink-zeppelin-run-jobs"></a>
+ 예제 1, Flink Scala

  a) 배치 WordCount 예제(SCALA)

  ```
  %flink
  
  val data = benv.fromElements("hello world", "hello flink", "hello hadoop")
  data.flatMap(line => line.split("\\s"))
               .map(w => (w, 1))
               .groupBy(0)
               .sum(1)
               .print()
  ```

  b) WordCount 스트리밍 예제(SCALA)

  ```
  %flink
  
  val data = senv.fromElements("hello world", "hello flink", "hello hadoop")
  data.flatMap(line => line.split("\\s"))
    .map(w => (w, 1))
    .keyBy(0)
    .sum(1)
    .print
  
  senv.execute()
  ```  
![\[예를 들어 Zeppelin 노트북에서 배치 WordCount를 실행하고 WordCount 작업을 스트리밍할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/streaming-wordcount-example.png)
+ 예제 2, Flink 스트리밍 SQL

  ```
  %flink.ssql
  SET 'sql-client.execution.result-mode' = 'tableau';
  SET 'table.dml-sync' = 'true';
  SET 'execution.runtime-mode' = 'streaming';
  
  create table dummy_table (
    id int,
    data string
  ) with (
    'connector' = 'filesystem',
    'path' = 's3://s3-bucket/dummy_table',
    'format' = 'csv'
  );
  
  INSERT INTO dummy_table SELECT * FROM (VALUES (1, 'Hello World'), (2, 'Hi'), (2, 'Hi'), (3, 'Hello'), (3, 'World'), (4, 'ADD'), (5, 'LINE'));
  
  SELECT * FROM dummy_table;
  ```  
![\[이 예제는 Flink 스트리밍 SQL 작업을 실행하는 방법을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/flink-streaming-sql.png)
+ 예제 3, Pyflink. 샘플 텍스트 파일 `word.txt`를 S3 버킷에 업로드해야 합니다.

  ```
  %flink.pyflink
  
  import argparse
  import logging
  import sys
  
  from pyflink.common import Row
  from pyflink.table import (EnvironmentSettings, TableEnvironment, TableDescriptor, Schema,
                             DataTypes, FormatDescriptor)
  from pyflink.table.expressions import lit, col
  from pyflink.table.udf import udtf
  
  def word_count(input_path, output_path):
      t_env = TableEnvironment.create(EnvironmentSettings.in_streaming_mode())
      # write all the data to one file
      t_env.get_config().set("parallelism.default", "1")
  
      # define the source
      if input_path is not None:
          t_env.create_temporary_table(
              'source',
              TableDescriptor.for_connector('filesystem')
                             .schema(Schema.new_builder()
                                     .column('word', DataTypes.STRING())
                                     .build())
                             .option('path', input_path)
                             .format('csv')
                             .build())
          tab = t_env.from_path('source')
      else:
          print("Executing word_count example with default input data set.")
          print("Use --input to specify file input.")
          tab = t_env.from_elements(map(lambda i: (i,), word_count_data),
                                    DataTypes.ROW([DataTypes.FIELD('line', DataTypes.STRING())]))
  
      # define the sink
      if output_path is not None:
          t_env.create_temporary_table(
              'sink',
              TableDescriptor.for_connector('filesystem')
                             .schema(Schema.new_builder()
                                     .column('word', DataTypes.STRING())
                                     .column('count', DataTypes.BIGINT())
                                     .build())
                             .option('path', output_path)
                             .format(FormatDescriptor.for_format('canal-json')
                                     .build())
                             .build())
      else:
          print("Printing result to stdout. Use --output to specify output path.")
          t_env.create_temporary_table(
              'sink',
              TableDescriptor.for_connector('print')
                             .schema(Schema.new_builder()
                                     .column('word', DataTypes.STRING())
                                     .column('count', DataTypes.BIGINT())
                                     .build())
                             .build())
  
      @udtf(result_types=[DataTypes.STRING()])
      def split(line: Row):
          for s in line[0].split():
              yield Row(s)
  
      # compute word count
      tab.flat_map(split).alias('word') \
         .group_by(col('word')) \
         .select(col('word'), lit(1).count) \
         .execute_insert('sink') \
         .wait()
  
  
  logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="%(message)s")
  
  
  word_count("s3://s3_bucket/word.txt", "s3://s3_bucket/demo_output.txt")
  ```

1. Zeppelin UI에서 **FLINK JOB**을 선택하여 Flink 웹 UI에 액세스하고 이를 확인합니다.  
![\[Flink code snippet for word count with output showing counts for "hello", "flink", "hadoop", and "world".\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/batch-wordcount-example.png)

1. **FLINK JOB** 경로를 선택하여 브라우저의 다른 탭에서 Flink 웹 콘솔로 이동합니다.  
![\[FLINK JOB을 선택하면 브라우저의 다른 탭에서 Flink 웹 콘솔이 열립니다.\]](http://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/images/flink-web-console.png)

# Flink 릴리스 기록
<a name="Flink-release-history"></a>

다음 테이블에는 애플리케이션과 함께 설치된 구성 요소 외에도 Amazon EMR의 최신 릴리스에 포함된 Flink의 버전이 나열되어 있습니다. 각 릴리스의 구성 요소 버전은 [Amazon EMR 7.x 릴리스 버전](emr-release-7x.md), [Amazon EMR 6.x 릴리스 버전](emr-release-6x.md) 또는 [Amazon EMR 5.x 릴리스 버전](emr-release-5x.md)의 릴리스의 구성 요소 버전 섹션을 참조하세요.


**Flink 버전 정보**  

| Amazon EMR 릴리스 레이블 | Flink 버전 | Flink와 함께 설치된 구성 요소 | 
| --- | --- | --- | 
| emr-7.12.0 | 1.20.0-amzn-6 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.11.0 | 1.20.0-amzn-5 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.10.0 | 1.20.0-amzn-4 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.9.0 | 1.20.0-amzn-3 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.8.0 | 1.20.0-amzn-2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.7.0 | 1.20.0-amzn-1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.6.0 | 1.20.0-amzn-0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.5.0 | 1.19.1-amzn-1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.4.0 | 1.19.1-amzn-0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.3.0 | 1.18.1-amzn-2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.2.0 | 1.18.1-amzn-1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-5.36.2 | 1.14.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-7.1.0 | 1.18.1-amzn-0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta | 
| emr-7.0.0 | 1.18.0-amzn-0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 
| emr-6.15.0 | 1.17.1-amzn-1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 
| emr-6.14.0 | 1.17.1-amzn-0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 
| emr-6.13.0 | 1.17.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 
| emr-6.12.0 | 1.17.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 
| emr-6.11.1 | 1.16.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 
| emr-6.11.0 | 1.16.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi, delta-standalone-connectors | 
| emr-6.10.1 | 1.16.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.10.0 | 1.16.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.9.1 | 1.15.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.9.0 | 1.15.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.8.1 | 1.15.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.8.0 | 1.15.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.7.0 | 1.14.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-5.36.1 | 1.14.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.36.0 | 1.14.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-6.6.0 | 1.14.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-5.35.0 | 1.14.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-6.5.0 | 1.14.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.4.0 | 1.13.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config, hudi | 
| emr-6.3.1 | 1.12.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-6.3.0 | 1.12.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-6.2.1 | 1.11.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-6.2.0 | 1.11.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-6.1.1 | 1.11.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-6.1.0 | 1.11.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.34.0 | 1.13.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.33.1 | 1.12.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.33.0 | 1.12.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.32.1 | 1.11.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.32.0 | 1.11.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.31.1 | 1.11.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.31.0 | 1.11.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client, flink-jobmanager-config | 
| emr-5.30.2 | 1.10.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.30.1 | 1.10.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.30.0 | 1.10.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.29.0 | 1.9.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.28.1 | 1.9.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.28.0 | 1.9.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.27.1 | 1.8.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.27.0 | 1.8.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.26.0 | 1.8.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.25.0 | 1.8.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.24.1 | 1.8.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.24.0 | 1.8.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.23.1 | 1.7.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.23.0 | 1.7.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.22.0 | 1.7.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.21.2 | 1.7.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.21.1 | 1.7.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.21.0 | 1.7.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.20.1 | 1.6.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.20.0 | 1.6.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.19.1 | 1.6.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.19.0 | 1.6.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.18.1 | 1.6.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.18.0 | 1.6.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.17.2 | 1.5.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.17.1 | 1.5.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.17.0 | 1.5.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.16.1 | 1.5.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.16.0 | 1.5.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.15.1 | 1.4.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.15.0 | 1.4.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.14.2 | 1.4.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.14.1 | 1.4.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.14.0 | 1.4.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.13.1 | 1.4.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.13.0 | 1.4.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.12.3 | 1.4.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.12.2 | 1.4.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.12.1 | 1.4.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.12.0 | 1.4.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.11.4 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.11.3 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.11.2 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.11.1 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.11.0 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.10.1 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.10.0 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.9.1 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.9.0 | 1.3.2 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.8.3 | 1.3.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.8.2 | 1.3.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.8.1 | 1.3.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.8.0 | 1.3.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.7.1 | 1.3.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.7.0 | 1.3.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.6.1 | 1.2.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.6.0 | 1.2.1 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, flink-client | 
| emr-5.5.4 | 1.2.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.5.3 | 1.2.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.5.2 | 1.2.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.5.1 | 1.2.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.5.0 | 1.2.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.4.1 | 1.2.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.4.0 | 1.2.0 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.3.2 | 1.1.4 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.3.1 | 1.1.4 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.3.0 | 1.1.4 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.2.3 | 1.1.3 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.2.2 | 1.1.3 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.2.1 | 1.1.3 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.2.0 | 1.1.3 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.1.1 | 1.1.3 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 
| emr-5.1.0 | 1.1.3 | emrfs, hadoop-client, hadoop-mapred, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-httpfs-server, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, flink-client | 

# 버전별 Flink 릴리스 정보
<a name="Flink-release-history-versions"></a>

전체 릴리스 정보는 다음 섹션을 참조하세요.

# Amazon EMR 7.10.0 - Flink 릴리스 정보
<a name="Flink-release-history-7100"></a>

**Amazon EMR 7.10.0 - Flink 변경 사항**


| Type | 설명 | 
| --- | --- | 
|  새로운 기능  |  Amazon EMR 버전 7.10.0부터 구성 설정을 사용하여 Kafka 및 Kinesis Flink 커넥터를 더 쉽게 활성화할 수 있습니다. 클러스터 생성 중에 `flink-conf` 분류에 `kafka.enabled: true` 또는 `kinesis.enabled: true`를 추가하여 각 커넥터를 자동으로 구성합니다. 이렇게 간소화된 방법은 이전에 필요했던 수동 구성 단계를 제거합니다.  | 

# Amazon EMR 7.9.0 - Flink 릴리스 정보
<a name="Flink-release-history-790"></a>

**Amazon EMR 7.9.0 - Flink 변경 사항**


| Type | 설명 | 
| --- | --- | 
|  새로운 기능  |  Amazon EMR 7.9.0부터 Apache Flink는 Avro, Parquet 및 ORC 파일 형식을 out-of-the-box 지원합니다. 추가 구성 없이 모든 Flink API(DataStream, Table 또는 SQL)에서 이러한 형식을 직접 사용할 수 있습니다.  | 
|  새로운 기능  |  Amazon EMR 버전 7.9.0부터 구성 설정을 사용하여 Hive 메타스토어 또는 AWS Glue 데이터 카탈로그를 더 쉽게 활성화할 수 있습니다. 클러스터 생성 중에 `flink-conf` 분류에 `hive.enabled: true` 또는 `glue.enabled: true`를 추가하여 각 데이터 카탈로그를 자동으로 구성합니다. 이렇게 간소화된 방법은 이전에 필요했던 수동 구성 단계를 제거합니다.  | 

# Amazon EMR 7.8.0 - Flink 릴리스 정보
<a name="Flink-release-history-780"></a>

**구성** - EMR Flink는 모든 AWS 리전/파티션에서 S3A와 함께 즉시 작동합니다.

# Amazon EMR 7.7.0 - Flink 릴리스 정보
<a name="Flink-release-history-770"></a>
+ `/usr/lib/flink/bin/sql-client.sh`에 대칭 연결된 `flink-sql-client` 명령을 사용하여 Flink SQL 쉘을 쉽게 호출할 수 있습니다.

# Amazon EMR 7.6.0 - Flink 릴리스 정보
<a name="Flink-release-history-760"></a>

## Amazon EMR 7.6.0 - Flink 기능
<a name="Flink-release-history-760-features"></a>
+ 이 릴리스에는 변경 사항이 없습니다.

# Amazon EMR 7.5.0 - Flink 릴리스 정보
<a name="Flink-release-history-750"></a>


| Type | 설명 | 
| --- | --- | 
|  기능  |  원격 jar을 사용한 Flink 작업 실행에 대한 지원이 추가되었습니다.  | 
|  개선  |  버텍스 제외 및 포함 스레드를 안전하게 만듭니다.  | 

## Amazon EMR 7.5.0 - Flink 기능
<a name="Flink-release-history-750-features"></a>
+ Amazon EMR 7.5.0부터 `run` 및 `run-application` Apache Flink CLI 명령을 사용할 때 Amazon S3 위치를 JAR 경로로 지정할 수 있습니다. Amazon S3 경로를 제공하면 EMR은 Amazon S3에서 클러스터의 EBS 스토리지로 JAR 파일을 자동으로 다운로드합니다. 동일한 JAR 파일을 지정할 때마다 EMR은 클러스터의 기존 JAR 파일을 재사용하는 대신 Amazon S3에서 최신 버전을 다운로드합니다.
+ Amazon EMR 7.5.0부터 고객은 `run` 및 `run-application` Flink CLI 명령을 사용하여 원격 경로(S3 위치)를 JAR 경로로 전달할 수 있습니다. 그러면 JAR이 S3 스토어에서 클러스터의 EBS 스토리지로 자동으로 가져옵니다. 동일한 JAR이 다시 제공되면 S3에서 최신 JAR을 다운로드하고 클러스터에서 기존 JAR을 재사용하지 않습니다.

# Amazon EMR 7.4.0 - Flink 릴리스 정보
<a name="Flink-release-history-740"></a>


| Type | 설명 | 
| --- | --- | 
|  업그레이드  |  Flink를 버전 1.19.1로 업그레이드함  | 

# Amazon EMR 7.3.0 - Flink 릴리스 정보
<a name="Flink-release-history-730"></a>
+ 기본적으로 보안 구성을 통해 전송 중 데이터 암호화가 활성화된 클러스터는 Flink 프로세스, 작업 관리자 REST 엔드포인트 및 Flink 작업 기록 서버 간 내부 통신에 TLS 1.3을 사용합니다.

# Amazon EMR 7.2.0 - Flink 릴리스 정보
<a name="Flink-release-history-720"></a>


| Type | 설명 | 
| --- | --- | 
|  개선 사항  |  `kubernetes.service.labels` 구성을 통해 Flink 작업당 Kubernetes 서비스에 사용자 지정 레이블 추가를 지원합니다.  | 