

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

# HBase 구성
<a name="emr-hbase-configure"></a>

대부분의 애플리케이션에서는 기본 HBase 설정으로도 충분하지만, HBase 구성 설정을 수정할 수 있습니다. 이렇게 하려면 HBase 구성 분류의 속성을 사용하세요. 자세한 내용은 [애플리케이션 구성](emr-configure-apps.md) 단원을 참조하십시오.

다음 예제에서는 Amazon S3에 저장된 `myConfig.json` 구성 파일에 따라 대체 HBase 루트 디렉터리가 있는 클러스터를 생성합니다.

**참고**  
가독성을 위해 Linux 줄 연속 문자(\\)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

```
aws emr create-cluster --release-label {{emr-7.13.0}} --applications Name=HBase \
--instance-type m5.xlarge --instance-count 3 --configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json
```

다음 예제에 표시된 대로 `myConfig.json` 파일은 `hbase.rootdir` 구성 분류에 대한 `hbase-site` 속성을 지정합니다. {{ip-XXX-XX-XX-XXX.ec2.internal}}을 클러스터 프라이머리 노드의 내부 DNS 호스트 이름으로 바꿉니다.

```
[
  {
    "Classification":"hbase-site",
    "Properties": {
       "hbase.rootdir": "hdfs://{{ip-XXX-XX-XX-XXX.ec2.internal}}:8020/user/myCustomHBaseDir"
    }
  }
]
```

**참고**  
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)을 참조하세요.

## YARN의 메모리 할당 변경
<a name="emr-hbase-configure-yarn"></a>

HBase가 YARN 애플리케이션으로 실행되고 있지 않으므로 YARN 및 해당 애플리케이션에 할당된 메모리를 다시 계산해야 합니다. 그러면 HBase가 설치된 경우 YARN에서 사용할 수 있는 전체 메모리가 줄어듭니다. 동일한 클러스터에서 YARN 애플리케이션과 HBase를 함께 배치할 때 이를 고려해야 합니다. 64GB보다 적은 메모리를 가진 인스턴스 유형은 NodeManager에서 사용할 수 있는 메모리의 절반을 차지하고, HBase RegionServer에 할당됩니다. 예를 들어, 메모리가 64GB보다 큰 인스턴스 유형의 경우 HBase RegionServer 메모리는 32GB로 제한됩니다. 일반적으로 YARN 설정 메모리는 MapReduce reducer 작업 메모리의 여러 배입니다.

[작업 구성 설정의 기본값](emr-hadoop-task-config.md#emr-hadoop-task-jvm)의 테이블은 HBase에 필요한 메모리를 기반으로 YARN 설정이 변경되었음을 보여줍니다.

## HBase 포트 번호
<a name="emr-hbase-ports"></a>

HBase용으로 선택된 일부 포트 번호는 기본값과 다릅니다. Amazon EMR의 HBase에 대한 인터페이스와 포트는 다음과 같습니다.


**HBase 포트**  

| 인터페이스 | 포트 | 프로토콜 | 
| --- | --- | --- | 
| HMaster | 16000 | TCP | 
| HMaster UI | 16010 | HTTP | 
| RegionServer | 16020 | TCP | 
| RegionServer 정보 | 16030 | HTTP | 
| REST 서버 | 8070 | HTTP | 
| REST UI | 8085 | HTTP | 
| Thrift 서버 | 9090 | TCP | 
| Thrift 서버 UI | 9095 | HTTP | 

**중요**  
Amazon EMR 릴리스 버전 4.6.0 이상에서 `kms-http-port`는 9700이며 `kms-admin-port`는 9701입니다.

## 최적화할 HBase 사이트 설정
<a name="emr-hbase-settings-optimize"></a>

애플리케이션의 워크로드에 맞게 HBase 클러스터를 최적화하도록 HBase 사이트 설정 중 일부 또는 전부를 설정할 수 있습니다. 다음 설정을 조사의 시작점으로 삼는 것이 좋습니다.

### zookeeper.session.timeout
<a name="emr-hbase-zookeeper.session.timeout"></a>

기본 제한 시간은 40초(40000밀리초)입니다. 리전 서버가 충돌할 경우, 이는 마스터 서버가 리전 서버의 부재를 감지하고 복구를 시작하는 데 걸리는 시간입니다. 마스터 서버의 복구 속도를 높이려면 이 값을 더 짧은 기간으로 줄이세요. 다음 예에서는 30초 또는 30000밀리초를 사용합니다.

```
[
  {
    "Classification":"hbase-site",
    "Properties": {
       "zookeeper.session.timeout": "30000"
    }
  }
]
```

### hbase.regionserver.handler.count
<a name="emr-hbase-hbase.regionserver.handler.count"></a>

리전 서버가 테이블에 대한 요청을 처리하기 위해 열고 있는 스레드의 수를 정의합니다. 동시 클라이언트의 수가 많은 대형 쓰기 버퍼를 사용할 때 사용자가 리전 서버를 종료하지 못하게 하려면 기본값 10이 낮습니다. 요청당 페이로드가 MB 범위에 가까울 때(빅 puts, 라지 캐시를 사용한 스캔)는 이 값을 낮게 유지하고, 페이로드가 작을 때(gets, 스몰 puts, ICVs, deletes)는 이 값을 높게 유지하는 것이 경험적 규칙입니다. 다음 예제에서는 열린 스레드의 수를 30으로 늘립니다.

```
[
  {
    "Classification":"hbase-site",
    "Properties": {
       "hbase.regionserver.handler.count": "30"
    }
  }
]
```

### hbase.hregion.max.filesize
<a name="emr-hbase-hbase.hregion.max.filesize"></a>

이 파라미터는 개별 리전의 크기(바이트)를 제어합니다. 기본적으로 `10737418240`로 설정됩니다. HBase 클러스터에 많은 양의 데이터를 쓰고 있어서 분할이 자주 발생하는 경우 이 크기를 늘려 개별 리전을 더 크게 만들 수 있습니다. 분할은 줄이지만 한 서버에서 다른 서버로 리전 로드를 분산하는 데 더 많은 시간이 필요합니다.

```
[
  {
    "Classification":"hbase-site",
    "Properties": {
       "hbase.hregion.max.filesize": "10737418240"
    }
  }
]
```

### hbase.hregion.memstore.flush.size
<a name="emr-hbase-hbase.hregion.memstore.flush.size"></a>

이 파라미터는 디스크로 플러시되기 전에 memstore의 최대 크기를 바이트 단위로 관리합니다. 기본 설정은 `134217728`입니다. 워크로드가 짧은 쓰기 작업으로 구성되는 경우 이 제한을 늘려 모든 쓰기가 버스트 기간 동안 메모리에 남아있게 하고 나중에 디스크로 플러시되도록 할 수 있습니다. 이 경우 버스트 동안 성능을 향상시킬 수 있습니다.

```
[
  {
    "Classification":"hbase-site",
    "Properties": {
       "hbase.hregion.memstore.flush.size": "134217728"
    }
  }
]
```

## 성능 고려 사항
<a name="hbase-performance-considerations"></a>

### HBase에 ZGC(Z Garbage Collector) 활성화
<a name="hbase-performance-considerations-enable"></a>

Amazon EMR 버전 7.10.0 이상을 사용하면 사용자가 HBase 클러스터에 대한 가비지 수집(GC) 설정을 원활하게 구성할 수 있습니다. 지연 시간이 짧고 GC 일시 중지 시간이 밀리초 미만인 경우 ZGC(Z Garbage Collector)를 활성화하는 것이 좋습니다.

다음은 HBase RegionServer에 대해 ZGC를 활성화하는 구성입니다.

```
[
    {
        "Classification": "hbase-env",
        "Properties": {},
        "Configurations": [
            {
                "Classification": "export",
                "Properties": {
                    "JAVA_HOME": "/usr/lib/jvm/jre-21",
                    "HBASE_REGIONSERVER_GC_OPTS": "\"-XX:+UseZGC -XX:+ZGenerational\""
                }
            }
        ]
    }
]
```

**참고**  
**JAVA\_HOME** 환경 변수는 세대 ZGC(권장)를 사용할 때 JDK 21에 도입되었으므로 설정합니다. ZGC의 비세대 모드( 제외`-XX:+ZGenerational`)를 사용하려면 **JAVA\_HOME**을 설정할 필요가 없습니다. JDK 24에서는 ZGC의 비세대 모드가 제거되었습니다.

#### ZGC 튜닝
<a name="hbase-performance-considerations-tuning-"></a>

1. **JVM 고정 힙 활성화**

   ZGC(Z Garbage Collector)는 고정 힙 메모리로 구성할 때 더 효율적으로 작동하므로 운영 체제에 메모리를 반환하는 오버헤드가 발생하지 않습니다. HBase 클러스터에 고정 힙 메모리를 구성하려면 다음 구성을 사용합니다.

   ```
   [
       {
           "Classification": "hbase",
           "Properties": {
               "hbase.regionserver.fixed.heap.enabled": "true"
           }
       }
   ]
   ```

1. **사전 터치 활성화**

   프리터치를 활성화하면 초기 지연 시간을 줄이고 보다 예측 가능한 성능을 제공하여 가비지 수집(GC) 성능이 향상됩니다. HBase 클러스터에 대한 사전 터치를 활성화하려면 다음 구성을 사용합니다.

   ```
   [
       {
           "Classification": "hbase-env",
           "Properties": {},
           "Configurations": [
               {
                   "Classification": "export",
                   "Properties": {
                       "JAVA_HOME": "/usr/lib/jvm/jre-21",
                       "HBASE_REGIONSERVER_GC_OPTS": "\"-XX:+UseZGC -XX:+ZGenerational -XX:+AlwaysPreTouch\""
                   }
               }
           ]
       }
   ]
   ```