我正在创建大量的输出文件,例如500.我正在创建异常,如下面的shoen。当输出文件的数量很小时,程序会自动恢复。对于前者如果它的50个文件,虽然发生了这种异常,程序会在多次打印此异常后开始成功运行。
但是,对于许多文件,最终失败的是IOException
。
我已粘贴错误,然后是以下代码:
12/10/29 15:47:27 INFO mapred.JobClient: Task Id : attempt_201210231820_0235_r_000004_3, Status : FAILED
org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException: failed to create file /home/users/mlakshm/preopa406/data-r-00004 for DFSClient_attempt_201210231820_0235_r_000004_3 on client 10.0.1.100, because this file is already being created by DFSClient_attempt_201210231820_0235_r_000004_2 on 10.0.1.130
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:1406)
我已粘贴代码:
在Reduce方法中,我有以下逻辑来生成输出:
int data_hash = (int)data_str.hashCode();
int data_int1 = 0;
int k = 500;
int check1 = 0;
for (int l = 10; l>0; l++)
{
if((data_hash%l==0)&&(check1 == 0))
{
check1 = 1;
int range = (int) k/10;
String check = "true";
while(range > 0 && check.equals("true"))
{
if(data_hash % range-1 == 0)
{
check = "false";
data_int1 = range*10;
}
}
}
}
mos.getCollector("/home/users/mlakshm/preopa407/cdata"+data_int1, reporter).collect(new Text(t+" "+alsort.get(0)+" "+alsort.get(1)), new Text(intersection));
PLs help!
答案 0 :(得分:0)
问题是所有reducer都试图用相同的命名方案编写文件。 之所以这样做是因为
mos.getCollector("/home/users/mlakshm/preopa407/cdata"+data_int1, reporter).collect(new Text(t+" "+alsort.get(0)+" "+alsort.get(1)), new Text(intersection));
根据数据的特征而不是reducer的标识设置文件名。
您有几个选择:
重做地图作业,以便发出的密钥与您在此作业中计算的哈希值相匹配。这将确保每个减速器都有一个价值范围。
你能解释为什么你在这里使用多个输出吗?我觉得你不需要。