Hadoop 串流

Hadoop 串流

Hadoop 串流是 Hadoop 發行版附帶的公用程式。此公用程式允許您使用任何可執行檔或指令碼作為 mapper 和/或 reducer 來建立和執行 Map/Reduce 作業。例如

mapred streaming \
  -input myInputDirs \
  -output myOutputDir \
  -mapper /bin/cat \
  -reducer /usr/bin/wc

串流運作方式

在上述範例中,mapper 和 reducer 都是從 stdin(逐行)讀取輸入,並將輸出發射到 stdout 的可執行檔。此公用程式會建立 Map/Reduce 作業,將作業提交到適當的叢集,並監控作業進度,直到作業完成。

當為 mapper 指定可執行檔時,每個 mapper 作業會在 mapper 初始化時將可執行檔啟動為一個獨立的程序。當 mapper 作業執行時,它會將其輸入轉換為行,並將這些行提供給程序的 stdin。同時,mapper 會從程序的 stdout 收集以行為導向的輸出,並將每行轉換為一個鍵值對,該鍵值對會收集為 mapper 的輸出。預設情況下,一行中第一個 tab 字元之前的字首key,而該行的其餘部分(不含 tab 字元)將會是value。如果該行沒有 tab 字元,則整行會被視為 key,而 value 為 null。不過,這可以透過設定-inputformat命令選項自訂,如下所述。

當可執行檔指定給 reducer 時,每個 reducer 任務會將可執行檔啟動為一個獨立的程序,然後初始化 reducer。當 reducer 任務執行時,它會將其輸入的鍵/值對轉換為行,並將這些行提供給程序的 stdin。同時,reducer 會從程序的 stdout 收集以行為導向的輸出,將每行轉換為鍵/值對,並將其收集為 reducer 的輸出。預設情況下,行開頭到第一個 tab 字元的字首為鍵,而行的其餘部分(不包含 tab 字元)為值。不過,這可以透過設定 -outputformat 命令選項來自訂,稍後會討論。

這是 Map/Reduce 架構與串流 mapper/reducer 之間通訊協定的基礎。

使用者可以將 stream.non.zero.exit.is.failure 指定為 truefalse,以讓結束狀態為非零的串流任務分別為 失敗成功。預設情況下,結束狀態為非零的串流任務會被視為失敗的任務。

串流命令選項

串流支援串流命令選項以及 一般命令選項。一般的命令列語法如下所示。

注意:務必在串流選項之前放置一般選項,否則命令會失敗。如需範例,請參閱 讓任務可以使用檔案

mapred streaming [genericOptions] [streamingOptions]

Hadoop 串流命令選項在此列出

參數 選用/必要 說明
-input 目錄名稱或檔案名稱 必要 mapper 的輸入位置
-output 目錄名稱 必要 reducer 的輸出位置
-mapper 可執行檔或 JavaClassName 選用 mapper 可執行檔。如果未指定,IdentityMapper 會用作預設值
-reducer 可執行檔或 JavaClassName 選用 reducer 可執行檔。如果未指定,IdentityReducer 會用作預設值
-file 檔案名稱 選用 讓 mapper、reducer 或 combiner 可執行檔在運算節點上本地可用
-inputformat JavaClassName 選用 您提供的類別應傳回 Text 類別的鍵/值對。如果未指定,TextInputFormat 會用作預設值
-outputformat JavaClassName 選用 您提供的類別應採用 Text 類別的鍵/值對。如果未指定,則 TextOutputformat 會用作預設值
-partitioner JavaClassName 選用 決定將哪個縮減傳送至鍵的類別
-combiner streamingCommand 或 JavaClassName 選用 用於縮減輸出資料的合併器可執行檔
-cmdenv name=value 選用 傳遞環境變數至串流命令
-inputreader 選用 為了向後相容性:指定記錄讀取器類別(而非輸入格式類別)
-verbose 選用 詳細輸出
-lazyOutput 選用 延遲建立輸出。例如,如果輸出格式基於 FileOutputFormat,則只會在第一次呼叫 Context.write 時建立輸出檔案
-numReduceTasks 選用 指定縮減器的數量
-mapdebug 選用 在縮減工作失敗時呼叫的指令碼
-reducedebug 選用 在縮減工作失敗時呼叫的指令碼

指定 Java 類別作為 Mapper/Reducer

您可以提供 Java 類別作為 Mapper 和/或 Reducer。

mapred streaming \
  -input myInputDirs \
  -output myOutputDir \
  -inputformat org.apache.hadoop.mapred.KeyValueTextInputFormat \
  -mapper org.apache.hadoop.mapred.lib.IdentityMapper \
  -reducer /usr/bin/wc

您可以將 stream.non.zero.exit.is.failure 指定為 truefalse,以讓結束狀態為非零的串流工作成為 FailureSuccess。預設情況下,結束狀態為非零的串流工作會被視為失敗的工作。

使用工作提交封裝檔案

您可以指定任何可執行檔作為 Mapper 和/或 Reducer。這些可執行檔不需要預先存在於叢集中的機器上;但是,如果它們不存在,您需要使用「-file」選項告訴架構將您的可執行檔檔案打包為工作提交的一部分。例如

mapred streaming \
  -input myInputDirs \
  -output myOutputDir \
  -mapper myPythonScript.py \
  -reducer /usr/bin/wc \
  -file myPythonScript.py

上述範例指定使用者定義的 Python 可執行檔作為 Mapper。選項「-file myPythonScript.py」會讓 Python 可執行檔作為工作提交的一部分運送至叢集機器。

除了可執行檔檔案之外,您還可以封裝其他輔助檔案(例如字典、組態檔等),這些檔案可能會由 Mapper 和/或 Reducer 使用。例如

mapred streaming \
  -input myInputDirs \
  -output myOutputDir \
  -mapper myPythonScript.py \
  -reducer /usr/bin/wc \
  -file myPythonScript.py \
  -file myDictionary.txt

為工作指定其他外掛程式

就像一般的 Map/Reduce 工作一樣,您可以為串流工作指定其他外掛程式

 -inputformat JavaClassName
 -outputformat JavaClassName
 -partitioner JavaClassName
 -combiner streamingCommand or JavaClassName

您提供用於輸入格式的類別應傳回 Text 類別的鍵值對。如果您未指定輸入格式類別,則 TextInputFormat 會用作預設值。由於 TextInputFormat 會傳回 LongWritable 類別的鍵,而這些鍵實際上並非輸入資料的一部分,因此會捨棄這些鍵;只有值會傳輸到串流對應器。

您提供用於輸出格式的類別預期會採用 Text 類別的鍵值對。如果您未指定輸出格式類別,則 TextOutputFormat 會用作預設值。

設定環境變數

若要在串流指令中設定環境變數,請使用

 -cmdenv EXAMPLE_DIR=/home/example/dictionaries/

一般指令選項

串流支援 串流指令選項 和一般指令選項。一般命令列語法如下所示。

注意:務必在串流選項之前放置一般選項,否則命令會失敗。如需範例,請參閱 讓任務可以使用檔案

hadoop command [genericOptions] [streamingOptions]

您可以在串流中使用的 Hadoop 一般指令選項如下所列

參數 選用/必要 說明
-conf configuration_file 選用 指定應用程式設定檔
-D property=value 選用 使用給定屬性的值
-fs host:port 或 local 選用 指定名稱節點
-files 選用 指定要複製到 Map/Reduce 群集的逗號分隔檔案
-libjars 選用 指定要包含在類別路徑中的逗號分隔 jar 檔案
-archives 選用 指定要在運算機器上解壓縮的逗號分隔檔案

使用 -D 選項指定設定檔變數

您可以使用「-D <property>=<value>」指定其他設定檔變數。

指定目錄

若要變更本機暫存目錄,請使用

 -D dfs.data.dir=/tmp

若要指定其他本機暫存目錄,請使用

 -D mapred.local.dir=/tmp/local
 -D mapred.system.dir=/tmp/system
 -D mapred.temp.dir=/tmp/temp

注意:有關作業設定檔參數的更多詳細資料,請參閱:mapred-default.xml

指定僅對應的作業

通常,您可能只想使用對應函數處理輸入資料。若要執行此操作,請將 mapreduce.job.reduces 設定為零。Map/Reduce 架構不會建立任何簡約器作業。相反地,對應器作業的輸出將會是作業的最終輸出。

 -D mapreduce.job.reduces=0

為了向後相容,Hadoop 串流也支援「-reducer NONE」選項,這相當於「-D mapreduce.job.reduces=0」。

指定 Reducer 數目

若要指定 Reducer 數目,例如兩個,請使用

mapred streaming \
  -D mapreduce.job.reduces=2 \
  -input myInputDirs \
  -output myOutputDir \
  -mapper /bin/cat \
  -reducer /usr/bin/wc

自訂如何將行拆分為 Key/Value 成對

如前所述,當 Map/Reduce 架構從 mapper 的 stdout 讀取一行時,它會將該行拆分為 key/value 成對。預設情況下,行中直到第一個 tab 字元的字首為 key,而該行的其餘部分(不包括 tab 字元)為 value。

不過,您可以自訂此預設值。您可以指定一個欄位分隔符,而非 tab 字元(預設值),並且您可以指定一行中的第 n 個(n >= 1)字元,而非第一個字元(預設值)作為 key 和 value 之間的分隔符。例如

mapred streaming \
  -D stream.map.output.field.separator=. \
  -D stream.num.map.output.key.fields=4 \
  -input myInputDirs \
  -output myOutputDir \
  -mapper /bin/cat \
  -reducer /bin/cat

在上述範例中,「-D stream.map.output.field.separator=.」指定「.」作為 map 輸出的欄位分隔符,而一行中直到第四個「.」的字首將會是 key,而該行的其餘部分(不包括第四個「.」)將會是 value。如果一行少於四個「.」時,則整行將會是 key,而 value 將會是一個空的 Text 物件(例如由 new Text(””)) 建立的物件)。

類似地,您可以使用「-D stream.reduce.output.field.separator=SEP」和「-D stream.num.reduce.output.fields=NUM」來指定 reduce 輸出的行中的第 n 個欄位分隔符作為 key 和 value 之間的分隔符。

類似地,您可以指定「stream.map.input.field.separator」和「stream.reduce.input.field.separator」作為 Map/Reduce 輸入的輸入分隔符。預設情況下,分隔符為 tab 字元。

處理大型檔案和歸檔檔

「-files」和「-archives」選項讓您可以讓檔案和歸檔檔可供作業使用。引數是您已上傳至 HDFS 的檔案或歸檔檔的 URI。這些檔案和歸檔檔會在作業間快取。您可以從 fs.default.name 設定變數中擷取主機和 fs_port 值。

注意:「-files」和「-archives」選項為一般選項。請務必將一般選項置於命令選項之前,否則命令會失敗。

讓檔案可供作業使用

「-files」選項會在作業的目前工作目錄中建立一個符號連結,指向檔案的本機副本。

在此範例中,Hadoop 會自動在作業的目前工作目錄中建立一個名為 testfile.txt 的符號連結。此符號連結指向 testfile.txt 的本機副本。

-files hdfs://host:fs_port/user/testfile.txt

使用者可以使用 # 為「-files」指定不同的符號連結名稱。

-files hdfs://host:fs_port/user/testfile.txt#testfile

可以像這樣指定多個項目

-files hdfs://host:fs_port/user/testfile1.txt,hdfs://host:fs_port/user/testfile2.txt

讓歸檔檔可供作業使用

-archives 選項允許您將 jar 檔案複製到工作目錄,並自動解壓縮檔案。

在此範例中,Hadoop 會自動在工作目錄中建立一個名為 testfile.jar 的符號連結。此符號連結指向儲存上傳 jar 檔案解壓縮內容的目錄。

-archives hdfs://host:fs_port/user/testfile.jar

使用者可以使用 # 為 -archives 指定不同的符號連結名稱。

-archives hdfs://host:fs_port/user/testfile.tgz#tgzdir

在此範例中,input.txt 檔案有兩行,指定兩個檔案的名稱:cachedir.jar/cache.txt 和 cachedir.jar/cache2.txt。「cachedir.jar」是已封存目錄的符號連結,其中有檔案「cache.txt」和「cache2.txt」。

mapred streaming \
                -archives 'hdfs://hadoop-nn1.example.com/user/me/samples/cachefile/cachedir.jar' \
                -D mapreduce.job.maps=1 \
                -D mapreduce.job.reduces=1 \
                -D mapreduce.job.name="Experiment" \
                -input "/user/me/samples/cachefile/input.txt" \
                -output "/user/me/samples/cachefile/out" \
                -mapper "xargs cat" \
                -reducer "cat"

$ ls test_jar/
cache.txt  cache2.txt

$ jar cvf cachedir.jar -C test_jar/ .
added manifest
adding: cache.txt(in = 30) (out= 29)(deflated 3%)
adding: cache2.txt(in = 37) (out= 35)(deflated 5%)

$ hdfs dfs -put cachedir.jar samples/cachefile

$ hdfs dfs -cat /user/me/samples/cachefile/input.txt
cachedir.jar/cache.txt
cachedir.jar/cache2.txt

$ cat test_jar/cache.txt
This is just the cache string

$ cat test_jar/cache2.txt
This is just the second cache string

$ hdfs dfs -ls /user/me/samples/cachefile/out
Found 2 items
-rw-r--r-* 1 me supergroup        0 2013-11-14 17:00 /user/me/samples/cachefile/out/_SUCCESS
-rw-r--r-* 1 me supergroup       69 2013-11-14 17:00 /user/me/samples/cachefile/out/part-00000

$ hdfs dfs -cat /user/me/samples/cachefile/out/part-00000
This is just the cache string
This is just the second cache string

更多使用範例

Hadoop 分割器類別

Hadoop 有個函式庫類別 KeyFieldBasedPartitioner,對許多應用程式很有用。此類別允許 Map/Reduce 架構根據特定金鑰欄位(而非整個金鑰)分割 map 輸出。例如

mapred streaming \
  -D stream.map.output.field.separator=. \
  -D stream.num.map.output.key.fields=4 \
  -D map.output.key.field.separator=. \
  -D mapreduce.partition.keypartitioner.options=-k1,2 \
  -D mapreduce.job.reduces=12 \
  -input myInputDirs \
  -output myOutputDir \
  -mapper /bin/cat \
  -reducer /bin/cat \
  -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

在此,-D stream.map.output.field.separator=.-D stream.num.map.output.key.fields=4 的說明如前一個範例所述。串流會使用這兩個變數來識別 mapper 的金鑰/值配對。

上述 Map/Reduce 工作的 map 輸出金鑰通常有四個欄位,以「.」分隔。不過,Map/Reduce 架構會使用 -D mapred.text.key.partitioner.options=-k1,2 選項,根據金鑰的前兩個欄位分割 map 輸出。在此,-D map.output.key.field.separator=. 指定分割的區隔符號。這可確保金鑰中前兩個欄位相同的金鑰/值配對會分割到同一個 reducer。

這實際上等於將前兩個欄位指定為主要金鑰,後兩個欄位指定為次要金鑰。主要金鑰用於分割,主要金鑰和次要金鑰的組合用於排序。以下為簡單的說明

map 的輸出(金鑰)

11.12.1.2
11.14.2.3
11.11.4.1
11.12.1.1
11.14.2.2

分割為 3 個 reducer(前 2 個欄位用作分割的金鑰)

11.11.4.1
-----------
11.12.1.2
11.12.1.1
-----------
11.14.2.3
11.14.2.2

為 reducer 在每個分割中排序(所有 4 個欄位用於排序)

11.11.4.1
-----------
11.12.1.1
11.12.1.2
-----------
11.14.2.2
11.14.2.3

Hadoop 比較器類別

Hadoop 有個函式庫類別 KeyFieldBasedComparator,對許多應用程式很有用。此類別提供 Unix/GNU Sort 提供的部分功能。例如

mapred streaming \
  -D mapreduce.job.output.key.comparator.class=org.apache.hadoop.mapreduce.lib.partition.KeyFieldBasedComparator \
  -D stream.map.output.field.separator=. \
  -D stream.num.map.output.key.fields=4 \
  -D mapreduce.map.output.key.field.separator=. \
  -D mapreduce.partition.keycomparator.options=-k2,2nr \
  -D mapreduce.job.reduces=1 \
  -input myInputDirs \
  -output myOutputDir \
  -mapper /bin/cat \
  -reducer /bin/cat

上述 Map/Reduce 任務的地圖輸出鍵通常有四個欄位,以「.」分隔。不過,Map/Reduce 架構會使用 -D mapreduce.partition.keycomparator.options=-k2,2nr 選項,依據鍵的第二個欄位來排序輸出。在此,-n 指定排序為數字排序,而 -r 指定結果應反轉。以下為簡單的說明

map 的輸出(金鑰)

11.12.1.2
11.14.2.3
11.11.4.1
11.12.1.1
11.14.2.2

為 Reducer 排序輸出(其中第二個欄位用於排序)

11.14.2.3
11.14.2.2
11.12.1.2
11.12.1.1
11.11.4.1

Hadoop Aggregate 套件

Hadoop 有個名為 Aggregate 的函式庫套件。Aggregate 提供一個特殊 Reducer 類別和一個特殊 Combiner 類別,以及一個簡單聚合器清單,可對一系列值執行「總和」、「最大值」、「最小值」等聚合。Aggregate 允許您定義一個預期為 Mapper 的每個輸入鍵/值對產生「可聚合項目」的 Mapper 外掛程式類別。Combiner/Reducer 會呼叫適當的聚合器來聚合這些可聚合項目。

要使用 Aggregate,只需指定「-reducer aggregate」

mapred streaming \
  -input myInputDirs \
  -output myOutputDir \
  -mapper myAggregatorForKeyCount.py \
  -reducer aggregate \
  -file myAggregatorForKeyCount.py

Python 程式 myAggregatorForKeyCount.py 如下所示

#!/usr/bin/python3

import sys

def generateLongCountToken(id):
    return "LongValueSum:" + id + "\t" + "1"

def main(argv):
    line = sys.stdin.readline()
    try:
        while line:
            line = line[:-1]
            fields = line.split("\t")
            print(generateLongCountToken(fields[0]))
            line = sys.stdin.readline()
    except "end of file":
        return None

if __name__ == "__main__":
     main(sys.argv)

Hadoop 欄位選取類別

Hadoop 有個函式庫類別 FieldSelectionMapReduce,可讓您有效地處理文字資料,就像 unix 的「cut」工具程式一樣。類別中定義的地圖函式將每個輸入鍵/值對視為一個欄位清單。您可以指定欄位分隔符號(預設為 tab 字元)。您可以選擇任意欄位清單作為地圖輸出鍵,以及任意欄位清單作為地圖輸出值。同樣地,類別中定義的縮減函式將每個輸入鍵/值對視為一個欄位清單。您可以選擇任意欄位清單作為縮減輸出鍵,以及任意欄位清單作為縮減輸出值。例如

mapred streaming \
  -D mapreduce.map.output.key.field.separator=. \
  -D mapreduce.partition.keypartitioner.options=-k1,2 \
  -D mapreduce.fieldsel.data.field.separator=. \
  -D mapreduce.fieldsel.map.output.key.value.fields.spec=6,5,1-3:0- \
  -D mapreduce.fieldsel.reduce.output.key.value.fields.spec=0-2:5- \
  -D mapreduce.map.output.key.class=org.apache.hadoop.io.Text \
  -D mapreduce.job.reduces=12 \
  -input myInputDirs \
  -output myOutputDir \
  -mapper org.apache.hadoop.mapred.lib.FieldSelectionMapReduce \
  -reducer org.apache.hadoop.mapred.lib.FieldSelectionMapReduce \
  -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

選項「-D mapreduce.fieldsel.map.output.key.value.fields.spec=6,5,1-3:0-」指定地圖輸出的鍵/值選取。鍵選取規格和值選取規格以「:」分隔。在此情況下,地圖輸出鍵將包含欄位 6、5、1、2 和 3。地圖輸出值將包含所有欄位(0- 表示欄位 0 和所有後續欄位)。

選項「-D mapreduce.fieldsel.reduce.output.key.value.fields.spec=0-2:5-」指定縮減輸出的鍵/值選取。在此情況下,縮減輸出鍵將包含欄位 0、1、2(對應到原始欄位 6、5、1)。縮減輸出值將包含從欄位 5 開始的所有欄位(對應到所有原始欄位)。

常見問題

如何使用 Hadoop Streaming 執行一組任意(半)獨立的任務?

您通常不需要 Map Reduce 的全部功能,而只需要執行同一程式多個執行個體,無論是在資料的不同部分上執行,或是在相同的資料上執行,但使用不同的參數。您可以使用 Hadoop Streaming 來執行此操作。

如何處理檔案,每個檔案對應一個 map?

舉例來說,考慮在 Hadoop 群集中壓縮(壓縮)一組檔案的問題。您可以透過使用 Hadoop Streaming 和自訂的 mapper 腳本來達成此目標

  • 產生一個包含輸入檔案完整 HDFS 路徑的檔案。每個 map 任務會取得一個檔案名稱作為輸入。

  • 建立一個 mapper 腳本,給定一個檔案名稱,它會取得檔案到本機磁碟、將檔案 gzip 壓縮,並將其放回所需的輸出目錄中。

我應該使用多少個 reducer?

請參閱 MapReduce 教學課程以取得詳細資訊:Reducer

如果我在 shell 腳本中設定別名,在 -mapper 之後是否會運作?

例如,假設我執行:alias c1=‘cut -f1’。-mapper “c1” 是否會運作?

使用別名不會運作,但變數替換是允許的,如本範例所示

$ hdfs dfs -cat /user/me/samples/student_marks
alice   50
bruce   70
charlie 80
dan     75

$ c2='cut -f2'; mapred streaming \
  -D mapreduce.job.name='Experiment' \
  -input /user/me/samples/student_marks \
  -output /user/me/samples/student_out \
  -mapper "$c2" -reducer 'cat'

$ hdfs dfs -cat /user/me/samples/student_out/part-00000
50
70
75
80

我可以使用 UNIX 管道嗎?

例如,-mapper “cut -f1 | sed s/foo/bar/g” 是否會運作?

目前此功能無法運作,且會產生「java.io.IOException: Broken pipe」錯誤。這可能是需要調查的錯誤。

如果我收到「裝置上沒有剩餘空間」錯誤,我該怎麼辦?

例如,當我透過 -file 選項散佈大型可執行檔(例如 3.6G)來執行串流工作時,我收到「裝置上沒有剩餘空間」錯誤。

jar 封裝會在由組態變數 stream.tmpdir 指出的目錄中發生。stream.tmpdir 的預設值為 /tmp。將值設定為具有更多空間的目錄

-D stream.tmpdir=/export/bigspace/…

如何指定多個輸入目錄?

您可以使用多個「-input」選項來指定多個輸入目錄

mapred streaming \
  -input '/user/foo/dir1' -input '/user/foo/dir2' \
    (rest of the command)

如何產生 gzip 格式的輸出檔案?

您可以產生 gzip 檔案作為您的產生輸出,而非純文字檔案。將「-D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec」作為選項傳遞給您的串流工作。

如何使用串流提供我自己的輸入/輸出格式?

您可以打包自訂類別並將自訂 jar 檔案放入 $HADOOP_CLASSPATH 來指定您自己的自訂類別。

如何使用串流剖析 XML 文件?

您可以使用記錄讀取器 StreamXmlRecordReader 來處理 XML 文件。

mapred streaming \
  -inputreader "StreamXmlRecord,begin=BEGIN_STRING,end=END_STRING" \
    (rest of the command)

在 BEGIN_STRING 和 END_STRING 之間找到的任何內容都將被視為地圖任務的一個記錄。

StreamXmlRecordReader 了解的名稱值屬性為

  • (字串) ‘begin’ - 標示記錄開頭的字元,以及 ‘end’ - 標示記錄結尾的字元。
  • (布林) ‘slowmatch’ - 切換為在 CDATA 中尋找開頭和結尾字元,而不是在一般標籤中尋找。預設為 false。
  • (整數) ‘lookahead’ - 使用 ‘slowmatch’ 時同步 CDATA 的最大前瞻位元組,應大於 ‘maxrec’。預設為 2*‘maxrec’。
  • (整數) ‘maxrec’ - 在 ‘slowmatch’ 期間每次比對之間讀取的最大記錄大小。預設為 50000 位元組。

如何在串流應用程式中更新計數器?

串流處理可以透過 stderr 發出計數器資訊。應將 reporter:counter:<group>,<counter>,<amount> 傳送至 stderr 以更新計數器。

如何在串流應用程式中更新狀態?

串流處理可以透過 stderr 發出狀態資訊。若要設定狀態,應將 reporter:status:<message> 傳送至 stderr。

如何在串流作業的映射器/簡約器中取得作業變數?

請參閱 已設定參數。在執行串流作業期間,「mapred」參數的名稱會轉換。句點 ( . ) 會變成底線 ( _ )。例如,mapreduce.job.id 會變成 mapreduce_job_id,而 mapreduce.job.jar 會變成 mapreduce_job_jar。在您的程式碼中,請使用帶有底線的參數名稱。

如果我收到「error=7, Argument list too long」怎麼辦

作業會將整個組態複製到環境中。如果作業正在處理大量輸入檔案,將作業組態新增至環境中可能會導致環境超載。環境中的作業組態複製對於執行作業並非必要,可以透過設定來加以截斷

-D stream.jobconf.truncate.limit=20000

預設值不會被截斷 (-1)。零 (0) 將只複製名稱,而不複製值。對於幾乎所有情況,20000 都是一個安全值,可以防止環境溢位。