

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

# 使用 Amazon EMR 匯入具有分散式快取的檔案
<a name="emr-plan-input-distributed-cache"></a>

DistributedCache 是 Hadoop 功能，可在映射或降低任務需要存取共用資料時提升效率。如果您的叢集是根據現有的應用程式或是在建立叢集時未安裝的二進位，您可以使用 DistributedCache 來匯入這些檔案。此功能可讓叢集節點從其本機檔案系統讀取匯入的檔案，而不是從其他叢集節點擷取檔案。

如需詳細資訊，請前往 [http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html](http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html)。

建立叢集時，您會調用 DistributedCache。Hadoop 任務開始之前會將檔案快取，並在任務期間保持快取。您可以快取儲存在任何 Hadoop 相容的檔案系統的檔案，例如，HDFS 或 Amazon S3。檔案快取的預設大小為 10 GB。若要變更快取大小，請使用引導操作重新設定 Hadoop 參數 `local.cache.size`。如需詳細資訊，請參閱[建立引導操作，以使用 Amazon EMR 叢集安裝其他軟體](emr-plan-bootstrap.md)。

**Topics**
+ [支援的檔案類型](#emr-dev-supported-file-types)
+ [快取檔案的位置](#locationofcache)
+ [從串流應用程式存取快取檔案](#cachemapper)
+ [從串流應用程式存取快取檔案](#cacheinconsole)

## 支援的檔案類型
<a name="emr-dev-supported-file-types"></a>

DistributedCache 可允許單一檔案和存檔。個別檔案會快取成唯讀檔案。可執行檔和二進位檔有執行權限設定。

存檔是使用公用程式 (例如 `gzip`) 封裝的一個或多個檔案。DistributedCache 將壓縮檔案傳遞至每個核心節點，並將存檔解壓縮為快取的一部分。DistributedCache 支援以下壓縮格式：
+ zip
+ tgz
+ tar.gz
+ tar
+ jar

## 快取檔案的位置
<a name="locationofcache"></a>

DistributedCache 僅會將檔案複製到核心節點。如果叢集中沒有核心節點，則 DistributedCache 會將檔案複製到主節點。

DistributedCache 會使用 symlinks 將快取檔案關聯至映射器和縮減器的目前工作目錄。符號連結是檔案位置的別名，而非實際的檔案位置。參數的值 (`yarn-site.xml` 中的 `yarn.nodemanager.local-dirs`) 會指定暫時檔案的位置。Amazon EMR 會將此參數設定為 `/mnt/mapred`，或根據執行個體類型和 EMR 版本而變化。例如，設定可能會有 `/mnt/mapred` 和 `/mnt1/mapred`，因為執行個體類型有兩個暫時性磁碟區。快取檔案位於 `/mnt/mapred/taskTracker/archive` 中的臨時檔案位置的子目錄。

如果您快取單一檔案，DistributedCache 會將該檔案放在 `archive` 目錄中。如果您快取存檔，DistributedCache 會解壓縮檔案，在 `/archive` 中建立子目錄，其名稱與封存檔案名稱相同。個別檔案位於新的子目錄。

您只能在使用串流時使用 DistributedCache。

## 從串流應用程式存取快取檔案
<a name="cachemapper"></a>

若要從您的映射器或縮減器應用程式存取快取的檔案，務必將目前的工作目錄 (./) 新增到您的應用程式，並且如同目前工作目錄中的檔案一般參考快取的檔案。

## 從串流應用程式存取快取檔案
<a name="cacheinconsole"></a>

您可以使用 AWS 管理主控台 和 AWS CLI 來建立使用分散式快取的叢集。

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

**使用新主控台來指定分散式快取檔案**

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) 開啟 Amazon EMR 主控台。

1. 在左側導覽窗格中的 **EC2 上的 EMR** 下，選擇**叢集**，然後選擇**建立叢集**。

1. 在**步驟**下，選擇**新增步驟**。這會開啟**新增步驟**對話方塊。在**引數**欄位中，納入檔案和存檔以儲存至快取。檔案大小 (或在封存檔案中的檔案大小總和) 必須少於分配的快取大小。

   如果要將個別檔案新增至分散式快取，在檔案放置在本機快取中時，在檔案的名稱和位置、井字號 (\$1)，以及您想要提供給檔案的名稱後面接著指定 `-cacheFile`。下列範例示範如何將個別檔案新增至分散式快取。

   ```
   -cacheFile \
   s3://amzn-s3-demo-bucket/file-name#cache-file-name
   ```

   如果要將封存檔案新增至分散式快取，請在 Amazon S3 中的檔案的位置、井字號 (\$1)，以及您想要提供給本機快取中檔案集合的名稱後面接著輸入 `-cacheArchive`。下列範例示範如何將封存檔案新增至分散式快取。

   ```
   -cacheArchive \
   s3://amzn-s3-demo-bucket/archive-name#cache-archive-name
   ```

   在其他對話方塊欄位中輸入適當的值。選項視步驟類型而異。若要新增步驟並結束對話方塊，請選擇**新增步驟**。

1. 選擇適用於您的叢集的任何其他選項。

1. 若要啟動您的叢集，請選擇**建立叢集**。

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

**使用 指定分散式快取檔案 AWS CLI**
+ 若要在叢集建立時提交串流步驟，輸入含 `create-cluster` 參數的 `--steps` 命令。若要使用 指定分散式快取檔案 AWS CLI，請在提交串流步驟時指定適當的引數。

  如果要將個別檔案新增至分散式快取，在檔案放置在本機快取中時，在檔案的名稱和位置、井字號 (\$1)，以及您想要提供給檔案的名稱後面接著指定 `-cacheFile`。

  如果要將封存檔案新增至分散式快取，請在 Amazon S3 中的檔案的位置、井字號 (\$1)，以及您想要提供給本機快取中檔案集合的名稱後面接著輸入 `-cacheArchive`。下列範例示範如何將封存檔案新增至分散式快取。

  如需在 中使用 Amazon EMR 命令的詳細資訊 AWS CLI，請參閱 [https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)。

**Example 1**  
輸入以下命令來啟動叢集並提交使用 `-cacheFile` 的串流步驟，將一個檔案 `sample_dataset_cached.dat` 新增至快取。  

```
aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 --steps Type=STREAMING,Name="Streaming program",ActionOnFailure=CONTINUE,Args=["--files","s3://my_bucket/my_mapper.py s3://my_bucket/my_reducer.py","-mapper","my_mapper.py","-reducer","my_reducer.py,"-input","s3://my_bucket/my_input","-output","s3://my_bucket/my_output", "-cacheFile","s3://my_bucket/sample_dataset.dat#sample_dataset_cached.dat"]
```
如果您在未使用 `--instance-groups` 參數的情況下指定執行個體計數，即會啟動單一主節點，且剩餘執行個體會以核心節點的形式啟動。所有節點都將使用命令中指定的執行個體類型。  
如果您先前尚未建立預設 EMR 服務角色和 EC2 執行個體設定檔，請先鍵入 `aws emr create-default-roles` 來建立這些設定檔，然後再鍵入 `create-cluster` 子命令。

**Example 2**  
以下命令會顯示串流叢集的建立，並使用 `-cacheArchive` 將封存檔案新增到快取。  

```
aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 --steps Type=STREAMING,Name="Streaming program",ActionOnFailure=CONTINUE,Args=["--files","s3://my_bucket/my_mapper.py s3://my_bucket/my_reducer.py","-mapper","my_mapper.py","-reducer","my_reducer.py,"-input","s3://my_bucket/my_input","-output","s3://my_bucket/my_output", "-cacheArchive","s3://my_bucket/sample_dataset.tgz#sample_dataset_cached"]
```
如果您在未使用 `--instance-groups` 參數的情況下指定執行個體計數，即會啟動單一主節點，且剩餘執行個體會以核心節點的形式啟動。所有節點都將使用命令中指定的執行個體類型。  
如果您先前尚未建立預設 EMR 服務角色和 EC2 執行個體設定檔，請先鍵入 `aws emr create-default-roles` 來建立這些設定檔，然後再鍵入 `create-cluster` 子命令。

------