本文向您介紹本地和分布式環境運行MapReduce的差異和MapReduce本地運行示例。

各階段介紹

本地運行前:通過在Jar命令中設置–local參數,在本地模擬MapReduce的運行過程,從而進行本地調試。

本地運行時:客戶端會從MaxCompute中下載本地調試所需要的輸入表的元信息、數據,所需要的資源以及輸出表的元信息,并將這些信息保存到一個名為warehouse的本地目錄中。

本地運行結束后:程序運行結束后,會將計算結果輸出到warehouse目錄內的一個文件中。如果本地的warehouse目錄下已經下載了輸入表及被引用的資源,在下一次運行時,會直接引用warehouse下的數據及文件,無需重復下載。

本地運行和分布式環境運行差異

在本地運行的過程中,仍然會啟動多個Map及Reduce進程處理數據,但這些進程不是并發運行,而是依次串行運行。

此外,這個本地模擬運行過程與真正的分布式運行有如下差別:
  • 輸入表行數限制:目前最多只支持下載100行數據。
  • 資源的使用:在分布式環境中,MaxCompute會限制引用資源的大小,詳情請參見MR限制匯總。但在本地運行環境中,不會有資源大小的限制。
  • 安全限制:MaxCompute MapReduce及UDF程序在分布式環境中運行時受到Java沙箱的限制。但在本地運行時,沒有此限制。

本地運行示例

本地運行的示例如下。
    odps:my_project> jar -l com.aliyun.odps.mapred.example.WordCount wc_in wc_out
    Summary:
    counters: 10
        map-reduce framework
                combine_input_groups=2
                combine_output_records=2
                map_input_bytes=4
                map_input_records=1
                map_output_records=2
                map_output_[wc_out]_bytes=0
                map_output_[wc_out]_records=0
                reduce_input_groups=2
                reduce_output_[wc_out]_bytes=8
                reduce_output_[wc_out]_records=2
    OK

關于WordCount示例的代碼介紹請參見WordCount示例。

如果您是第一次運行本地調試命令,命令成功結束后,會在當前路徑下看到一個名為warehouse的路徑。warehouse的目錄結構如下所示。
<warehouse>
   |____my_project(項目空間目錄)
          |____ <__tables__>
          |       |__wc_in(表數據目錄)
          |       |      |____ data(文件)
          |       |      |
          |       |      |____ <__schema__> (文件)
          |       |__wc_out(表數據目錄)
          |               |____ data(文件)
          |               |
          |               |____ <__schema__> (文件)
          |
          |____ <__resources__>
                  |
                  |___table_resource_name (表資源)
                  |         |____<__ref__>
                  |
                  |___ file_resource_name(文件資源)
  • my_project的同級目錄表示項目空間。wc_inwc_out表示數據表,您在Jar命令中讀寫的表文件數據會被下載到這級目錄下。
  • <__schema__>文件中的內容表示表的元信息,其文件格式定義如下。
      project=local_project_name
      table=local_table_name
      columns=col1_name:col1_type,col2_name:col2_type
      partitions=p1:STRING,p2:BIGINT    --本示例中不需要此字。

    其中,列名與列類型使用英文冒號分隔,列與列之間使用英文逗號分隔。<__schema__>文件的最前面需要聲明Project名字及Table名字,即project_name.table_name,并通過英文逗號與列的定義做分隔,即project_name.table_name,col1_name:col1_type,col2_name:col2_type,……。

  • tables目錄中data文件表示表的數據。列的數量及數據必須與_schema_文件的定義相符,不能多列或者少列,列之間使用逗號分隔。
    wc_in_schema_文件內容如下。
    my_project.wc_in,key:STRING,value:STRING
    data文件內容如下。
    0,2
    客戶端會從MaxCompute中下載表的元信息及部分數據內容,并保存到上述兩個文件中。如果再次運行此示例,將直接使用wc_in目錄下的數據,不會再次下載。
    說明 僅在MapReduce的本地運行模式下支持從MaxCompute中下載數據的功能。
    wc_out_schema_文件內容如下。
    my_project.wc_out,key:STRING,cnt:BIGINT
    data文件內容如下。
      0,1
      2,1
    客戶端會從MaxCompute中下載wc_out表的元信息,并保存到_schema_文件中。而本地運行后,生成的結果數據,則保存到data文件中。
    說明
    • 您也可以自行編輯_schema_data文件,而后將這兩個文件放置在對應的表目錄下。
    • 在本地運行時,客戶端檢測到表目錄已經存在,則不會從MaxCompute中下載這個表的信息。本地的表目錄可以是MaxCompute中不存在的表。