簡體   English   中英

hadoop map中的多個目錄作為輸入格式減少

[英]Multiple directories as Input format in hadoop map reduce

我正在嘗試使用hadoop在分布式系統中運行圖形驗證程序。 我有以下格式的輸入:

directory1中

---file1.dot

---file2.dot

... ..

---filen.dot

Directory2

---file1.dot

---file2.dot

... ..

---filen.dot

Directory670

---file1.dot

---file2.dot

... ..

---filen.dot

.dot文件是存儲圖形的文件。

對我而言,使用FileInputFormat.addInputPath()添加輸入目錄路徑是否足夠?

我希望hadoop處理同一節點中每個目錄的內容,因為每個目錄中存在的文件都包含取決於同一目錄中其他文件是否存在的數據。

hadoop框架是否會負責將目錄平均分配給群集的各個節點(例如,目錄1到node1,目錄2到node2 ....等等)並並行處理?

每個目錄中的文件相互依賴的數據(准確地說是...

  • 每個目錄都包含一個文件(main.dot,該文件具有非循環圖,其頂點為其余文件的名稱,
  • 因此,我的驗證程序將遍歷main.dot中存在的圖形的每個頂點,在同一目錄中搜索相同名稱的文件,如果找到,則處理該文件中的數據。

  • 類似地,將處理所有文件,並顯示目錄中每個文件處理后的組合輸出,

  • 其余目錄使用相同的步驟。)

簡而言之,就像在著名的單詞計數應用程序中一樣(如果輸入是一本書),hadoop將拆分輸入並將任務分配給群集中的每個節點,在該節點中,映射器處理每一行並計算相關單詞。 我如何在這里拆分任務(我是否需要拆分?)

在這種情況下,我如何利用hadoop的功能,一些示例代碼模板肯定會有所幫助:)

Alexey Shestakov給出的解決方案將起作用。 但是它沒有利用MapReduce的分布式處理框架。 可能只有一個映射過程會讀取該文件(包含所有輸入文件路徑的文件),然后處理輸入數據。 我們如何將目錄中的所有文件分配給一個映射器,以使映射器的數量等於目錄的數量? 一種解決方案是使用“ org.apache.hadoop.mapred.lib.MultipleInputs”類。 使用MultipleInputs.addInputPath()為每個目錄路徑添加目錄和映射類。 現在,每個映射器都可以獲取一個目錄並處理其中的所有文件。

您可以創建一個包含所有要處理目錄的文件:

/path/to/directory1
/path/to/directory2
/path/to/directory3

每個映射器將處理一個目錄,例如:

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            FileSystem fs = FileSystem.get(context.getConfiguration());
            for (FileStatus status : fs.listStatus(new Path(value.toString()))) {
                // process file
            }
        }

hadoop框架是否會負責將目錄平均分配給群集的各個節點(例如,目錄1到node1,目錄2到node2 ....等等)並並行處理?

不,不會。 從文件復制到要處理的節點的意義上說,文件未分發到每個節點。 相反,簡單地說,每個節點都具有一組要處理的文件路徑,而不能保證位置或數據的局部性。 然后,datanode從HDFS中提取該文件並進行處理。

沒有理由不能只從HDFS直接打開可能需要的其他文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM