

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

# Amazon EMR 操作期間的叢集輸入和輸出錯誤
<a name="emr-troubleshoot-errors-io"></a>

以下是在叢集輸入和輸出操作時常見的錯誤。使用本主題中的指引來疑難排解和檢查您的組態。

**Topics**
+ [您的 Amazon Simple Storage Service (Amazon S3) 路徑是否至少包含三條斜線？](#threeslashes)
+ [您是否想要嘗試以遞迴的方式周遊輸入目錄？](#recurseinput)
+ [您的輸出目錄是否已存在？](#directoryexist)
+ [您是否想要嘗試使用 HTTP URL 來指定資源？](#httpurl)
+ [您是否使用無效名稱格式來參考 Amazon S3 儲存貯體？](#validdnsname)
+ [您在 Amazon S3 之間來回載入資料時是否遇到困難？](#emr-troubleshoot-errors-io-1)

## 您的 Amazon Simple Storage Service (Amazon S3) 路徑是否至少包含三條斜線？
<a name="threeslashes"></a>

 指定 Amazon S3 儲存貯體時，您必須在 URL 結尾包含終止斜線。例如，您應該使用 "s3n：//amzn-s3-demo-bucket1"，而不是將儲存貯體參考為 "s3n：//amzn-s3-demo-bucket1/"，否則 Hadoop 在大多數情況下會讓您的叢集失敗。

## 您是否想要嘗試以遞迴的方式周遊輸入目錄？
<a name="recurseinput"></a>

 Hadoop 不會以遞迴的方式搜尋檔案的輸入目錄。如果您的目錄結構是 /corpus/01/01.txt、/corpus/01/02.txt、/corpus/02/01.txt 等等，而且您對於叢集指定 /corpus/ 做為輸入參數，則 Hadoop 會找不到該輸入檔，因為 /corpus/ 目錄是空的，而且 Hadoop 不會檢查子目錄的內容。同樣地，Hadoop 不會以遞迴的方式檢查 Amazon S3 儲存貯體的子目錄。

 輸入檔案必須直接在輸入目錄中或您指定的 Amazon S3 儲存貯體，而不是在子目錄中。

## 您的輸出目錄是否已存在？
<a name="directoryexist"></a>

 如果您指定的輸出路徑已存在，在大部分情況下，Hadoop 叢集將叢集視為失敗。這表示如果您執行叢集一次，然後使用完全相同的參數重新執行一次，很可能第一次會成功，但在第一次執行後就不再能夠運作，因為該輸出路徑已存在且會導致連續執行失敗。

## 您是否想要嘗試使用 HTTP URL 來指定資源？
<a name="httpurl"></a>

 Hadoop 不接受使用 http:// 字首的資源位置。您不能使用 HTTP URL 來參考資源。例如，使用 http://mysite/myjar.jar 做為 JAR 參數的傳遞會導致叢集失敗。

## 您是否使用無效名稱格式來參考 Amazon S3 儲存貯體？
<a name="validdnsname"></a>

 如果您嘗試搭配 Amazon EMR 使用儲存貯體名稱，例如 "amzn-s3-demo-bucket1.1"，您的叢集將會失敗，因為 Amazon EMR 要求儲存貯體名稱必須是有效的 RFC 2396 主機名稱；名稱結尾不能是數字。此外，由於 Hadoop 的要求，與 Amazon EMR 搭配使用的 Amazon S3 儲存貯體名稱必須僅包含小寫字母、數字、句點 (.) 和連字號 (-)。如需有關格式化 Amazon S3 儲存貯體名稱的詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[儲存貯體限制與局限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/index.html?BucketRestrictions.html)。

## 您在 Amazon S3 之間來回載入資料時是否遇到困難？
<a name="emr-troubleshoot-errors-io-1"></a>

 Amazon S3 是 Amazon EMR 最熱門的輸入和輸出來源。一般錯誤是將 Amazon S3 視為一般檔案系統。您在執行叢集時，需要考量 Amazon S3 與檔案系統之間的差異。
+  如果在 Amazon S3 中發生內部錯誤，您的應用程式需要從容地處理此問題和重新嘗試操作。
+  如果對 Amazon S3 的呼叫需時太久，您的應用程式可能需要降低它呼叫 Amazon S3 的頻率。
+  列出 Amazon S3 儲存貯體中的所有物件是一種昂貴的呼叫。您的應用程式應將此類操作的執行次數降到最低。

 有多種方法可改善叢集與 Amazon S3 互動的方式。
+  使用 Amazon EMR 的最新版本來啟動您的叢集。
+ 使用 S3DistCp 將物件傳入和傳出 Amazon S3。S3DistCp 實作錯誤處理、重試和退避來符合 Amazon S3 的需求。如需詳細資訊，請參閱[使用 S3DistCp 的分散式複製](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/UsingEMR_s3distcp.html)。
+  設計您的應用程式，並保持最終一致性。在叢集執行中時使用中繼資料儲存體的 HDFS，而 Amazon S3 僅會輸出初始資料並輸出最終結果。
+  如果您的叢集每秒會將 200 個或多個交易遞交至 Amazon S3，請[聯絡支援](https://aws.amazon.com/contact-us/)以準備讓儲存貯體獲得每秒更佳的交易，請考慮使用 [Amazon S3 效能秘訣和技巧](https://aws.amazon.com/blogs/aws/amazon-s3-performance-tips-tricks-seattle-hiring-event/)中所述的金鑰分割區策略。
+  將 Hadoop 組態設定 io.file.buffer.size 設定為 65536。這可讓 Hadoop 花費較少的時間來搜尋 Amazon S3 物件。
+  如果您的叢集不斷發生 Amazon S3 並行問題，請考量停用 Hadoop 推測性執行功能。在針對緩慢叢集進行故障排除時也很有用。您可以藉由將 `mapreduce.map.speculative` 和 `mapreduce.reduce.speculative` 屬性設為 `false` 來執行此操作。當您啟動叢集時，可以使用 `mapred-env` 組態分類來設定這些值。如需詳細資訊，請參閱《Amazon EMR 版本指南》中的[設定應用程式](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。
+  如果您執行的是 Hive 叢集，請參閱 [您在 Amazon S3 與 Hive 之間來回載入資料時是否遇到困難？](emr-troubleshoot-error-hive.md#emr-troubleshoot-error-hive-3)。

 如需其他資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [Amazon S3 錯誤最佳實務](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ErrorBestPractices.html)。