簡體   English   中英

如何在Hadoop Map / Reduce中寫入映射器中的多個文件?

[英]How to write to multiple files in the mapper in Hadoop map/reduce?

我有一個map reduce作業,沒有任何reducer可以解析輸入文件並以Parquet格式在映射器中的磁盤上寫入一些輸出。 由於此作業可以將多個文件夾中的文件作為輸入(每個日期一個文件夾),因此我也希望將輸出分成多個文件夾,例如:

01JAN15
    output-0000
    output-0001

02JAN15
    output-0000
    output-0001

我查看了文檔中的MultipleOutput格式類,但是它似乎只在歸約部分中的幾個文件夾中起作用。

不知何故,寫入同一目錄中的多個文件是可行的,但是一旦嘗試寫入多個目錄,我就會遇到異常(也許是因為某些映射器試圖同時創建同一目錄嗎?)。

僅供參考,我的代碼在映射器中看起來像這樣:

mos.write("pb", null, message, date + "/output");

我定義了這樣的輸出格式:

MultipleOutputs.addNamedOutput(job, "pb", ProtoParquetOutputFormat.class,
Void.class, com.google.protobuf.Message.class);

我得到的異常是:

15/01/11 15:05:09 WARN ipc.Client: interrupted waiting to send rpc request to server
java.lang.InterruptedException
    at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:400)
    at java.util.concurrent.FutureTask.get(FutureTask.java:187)
    at org.apache.hadoop.ipc.Client$Connection.sendRpcRequest(Client.java:1046)
    at org.apache.hadoop.ipc.Client.call(Client.java:1441)
    at org.apache.hadoop.ipc.Client.call(Client.java:1399)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:232)
    at com.sun.proxy.$Proxy9.getBlockLocations(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getBlockLocations(ClientNamenodeProtocolTranslatorPB.java:254)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy10.getBlockLocations(Unknown Source)
    at org.apache.hadoop.hdfs.DFSClient.callGetBlockLocations(DFSClient.java:1220)
    at org.apache.hadoop.hdfs.DFSClient.getLocatedBlocks(DFSClient.java:1210)
    at org.apache.hadoop.hdfs.DFSClient.getLocatedBlocks(DFSClient.java:1200)
    at org.apache.hadoop.hdfs.DFSInputStream.fetchLocatedBlocksAndGetLastBlockLength(DFSInputStream.java:271)
    at org.apache.hadoop.hdfs.DFSInputStream.openInfo(DFSInputStream.java:238)
    at org.apache.hadoop.hdfs.DFSInputStream.<init>(DFSInputStream.java:231)
    at org.apache.hadoop.hdfs.DFSClient.open(DFSClient.java:1498)
    at org.apache.hadoop.hdfs.DistributedFileSystem$3.doCall(DistributedFileSystem.java:302)
    at org.apache.hadoop.hdfs.DistributedFileSystem$3.doCall(DistributedFileSystem.java:298)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.open(DistributedFileSystem.java:298)
    at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:766)
    at parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:272)
    at parquet.hadoop.ParquetFileReader$2.call(ParquetFileReader.java:180)
    at parquet.hadoop.ParquetFileReader$2.call(ParquetFileReader.java:176)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

你知道我想做什么嗎? 我究竟做錯了什么? 謝謝 !

我知道,您的意思是,但是不幸的是(據我所知),您需要自己做

只需創建從Configured and Implementationing Tool接口擴展的Driver類。 然后,您只需配置一個MapRed執行完成后將調用的回調,然后只需編寫代碼即可將文件移動到相應文件夾中。

鏈接在這里

Mapred完成后的回調

您可以使用分區輸出到其他文件。

一個輸出文件不能由多個進程(映射器或化簡器)寫入 ,因此,為了生成多個輸出文件,我要么必須定義自定義分區,要么將數據歸入化簡器中,並在輸出文件名中包含鍵。 映射器不可能將來自多個輸入文件的數據寫入同一文件。

暫無
暫無

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

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