![](/img/trans.png)
[英]Hadoop Mapreduce MultipleInputs cannot load the mapper classes
[英]Multiple Inputs and multiple Mapper classes in EMR (Is there anything similar in EMR to MultipleInputs on Hadoop)
我在使用hadoop時使用過MultipleInputs。 在那我有多個映射器分配給不同的輸入。 我想知道EMR是否也支持它。
在hadoop中,我是這樣做的。 這些是我用於不同文件的映射器。 這里我需要這些,因為我必須對不同的輸入執行一些操作,這些操作應該分別識別輸入並在化簡器中執行單獨的操作。
public static class Map1 extends Mapper<Object, Text, Text, Text> {
Text out=new Text();
Text value1= new Text();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException
{
try
{
String line= value.toString();
Configuration conf=context.getConfiguration();
Float CVsTime=conf.getFloat("CVstartTime",0);
String dimension=conf.get("CVdimension");
String CVfilter=conf.get("CVfilters");
Float CVeTime=conf.getFloat("CVendTime",0);
Float CVstartTime=CVsTime;
Float CVendTime=CVeTime;
JSONParser parser = new JSONParser();
Object obj=parser.parse(line);
JSONObject jsonObject=(JSONObject)obj;
Object datasttime=jsonObject.get("client_received_start_timestamp");
String ddimension="";
Object odimension=jsonObject.get(dimension);
if(odimension!=null)
ddimension=odimension.toString();
String dst=datasttime.toString();
dst=dst.substring(0,6)+"."+dst.substring(6,dst.length());
String metric=conf.get("CVmetric");
Float tim=0.0f,/* sttime=0,endtime=0,*/CVval=0.0f;
tim=Float.parseFloat(dst.toString());
Object met=jsonObject.get(metric);
CVval=Float.parseFloat(met.toString());
int CVfiltercount = CVfilter.length() - CVfilter.replace(" ", "").length();
String CVfilters[][]=new String[CVfiltercount][];
StringTokenizer tokenizer=new StringTokenizer(CVfilter);
int k=0;
while(tokenizer.hasMoreTokens())
{
String temptoken=tokenizer.nextToken();
if(temptoken.indexOf("=")!=-1)
{
CVfilters[k]=temptoken.split("=");
CVfilters[k][1]=CVfilters[k][1].replace("\"","");
k++;
}
}
int count=k;
int flag=0;
for(int i=0;i<k;i++)
{
Object filter=jsonObject.get(CVfilters[i][0]);
if(filter==null)
{
flag=1;
break;
}
if(!filter.toString().equals(CVfilters[i][1]))
{
flag=1;
break;
}
}
if((odimension!=null)&&(CVstartTime<=tim)&&(CVendTime>=tim)&&(flag==0))
{
value1.set("key1"+" "+tim.toString()+" "+CVval.toString());
out.set(ddimension);
context.write(out,value1);
}
flag=0;
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public static class Map2 extends Mapper<Object, Text, Text, Text>
{
Text out = new Text();
Text value2= new Text();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException
{
try
{
Configuration conf=context.getConfiguration();
Float CTVstartTime=conf.getFloat("CTVstartTime",0);
Float CTVendTime=conf.getFloat("CTVendTime",0);
String CTVfilter=conf.get("CTVfilters");
String dimension=conf.get("CTVdimension");
String line= value.toString();
JSONParser parser = new JSONParser();
Object obj=parser.parse(line);
JSONObject jsonObject=(JSONObject)obj;
Object datasttime=jsonObject.get("client_received_start_timestamp");
Object odimension=jsonObject.get(dimension);
String ddimension="";
if(odimension!=null)
ddimension=odimension.toString();
String dst=datasttime.toString();
dst=dst.substring(0,6)+"."+dst.substring(6,dst.length());
String metric=conf.get("CTVmetric");
Float tim=0.0f,/*sttime=0,endtime=0,*/ctvvalue=0.0f;
StringTokenizer st=new StringTokenizer(line);
tim=Float.parseFloat(dst.toString());
Object met=jsonObject.get(metric);
ctvvalue=Float.parseFloat(met.toString());
int CTVfiltercount = CTVfilter.length() - CTVfilter.replace(" ", "").length();
StringTokenizer tokenizer=new StringTokenizer(CTVfilter);
String CTVfilters[][]=new String[CTVfiltercount][];
int k=0;
while(tokenizer.hasMoreTokens())
{
String temptoken=tokenizer.nextToken();
if(temptoken.indexOf("=")!=-1)
{
CTVfilters[k]=temptoken.split("=");
CTVfilters[k][1]=CTVfilters[k][1].replace("\"","");
k++;
}
}
int count=k;
int flag=0;
for(int i=0;i<k;i++)
{
Object filter=jsonObject.get(CTVfilters[i][0]);
if(filter==null)
{
flag=1;
break;
}
if(!filter.toString().equals(CTVfilters[i][1]))
flag=1;
}
if((odimension!=null)&&(CTVstartTime<=tim)&&(CTVendTime>=tim)&&(flag==0))
{
value2.set("key2"+" "+tim.toString()+" "+ctvvalue.toString());
out.set(ddimension);
context.write(out,value2);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
我的主要部分是在hadoop中使用MultipleInputs的。 在這里,我為不同的輸入設置了單獨的映射器類,即Map1.class和Map2.class
job.setJobName("alert");
String MapPath1[]=args[1].split(",");
String MapPath2[];
MapPath2 = type.equals("comparative") ? args[2].split(",") : null;
Path outputPath;
if (MapPath2!=null)
outputPath = new Path(args[3]);
else
outputPath = new Path(args[2]);
job.setMapperClass(Map1.class);
if(type.equals("comparative"))
job.setMapperClass(Map2.class);
job.setReducerClass(Reduce.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
for(int i=0;i<MapPath1.length;i++)
MultipleInputs.addInputPath(job,new Path(MapPath1[i]),TextInputFormat.class,Map1.class);
if(type.equals("comparative"))
for(int i=0;i<MapPath2.length;i++)
MultipleInputs.addInputPath(job,new Path(MapPath2[i]),TextInputFormat.class,Map2.class);
FileOutputFormat.setOutputPath(job, outputPath);
在這里,我采用了兩種不同的輸入路徑,並為它們分配了以上定義的不同的Mappers,並且效果很好。 我被問到是否可以在EMR中實現同樣的功能,而我之前在EMR上沒有做過任何事情,我曾嘗試使用谷歌搜索,但找不到任何有用的方法。 我想知道是否有與EMR相同的方法或任何解決方法。 除了我不想使用(Path filePath =(((FileSplit)context.getInputSplit())。getPath();)以外的任何地方,我試圖查找當前輸入的路徑以確定哪個數據塊或文件它屬於。
任何幫助表示贊賞。
當然,它是受支持的,而EMR正是運行Hadoop的地方。 您的問題等同於說“我可以同時在筆記本電腦和台式機上使用Web瀏覽器”嗎? 嗯,這就是我從您的問題中了解的內容。
http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-hadoop-differences.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.