我正在从mapper生成两个输出文件。我使用Multipleoutput api生成两个输出。我不确定这样做是否正确。这是我的代码。。请仔细检查一下,给我你的建议。。当我运行代码时,我得到了一个错误:java。lang.NullPointerException。。
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.TaskInputOutputContext;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class Export_Column_Mapping
{
public static void main(String[] args) throws Exception
{
String Output_filetype = args[2];
String Input_column_number = args[3];
String Output_column_number = args[4];
Configuration conf = new Configuration();
conf.setStrings("output_filetype",Output_filetype);
conf.setStrings("Input_column_number",Input_column_number);
conf.setStrings("Output_column_number",Output_column_number);
Job job = new Job(conf, "Export_Column_Mapping");
job.setJarByClass(Export_Column_Mapping.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setMapperClass(Export_Column_Mapping_Mapper.class);
job.setNumReduceTasks(0);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
public static class Export_Column_Mapping_Mapper extends Mapper<LongWritable,Text,Text,Text>
{
private MultipleOutputs<Text, LongWritable> mos ;
public void setup(TaskInputOutputContext<?, ?, Text, LongWritable> context) {
mos = new MultipleOutputs<Text, LongWritable>(context);
}
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
String str_Output_filetype = context.getConfiguration().get("output_filetype");
String str_Input_column_number = context.getConfiguration().get("Input_column_number");
String[] input_columns_number = str_Input_column_number.split(",");
String str_Output_column_number= context.getConfiguration().get("Output_column_number");
String[] output_columns_number = str_Output_column_number.split(",");
String str_line = value.toString();
String[] input_column_array = str_line.split(",");
String[] Detail_output_column_array = new String[27];
String[] Shop_output_column_array = new String[8];
String details_output = null ;
String Shop_output = null;
try
{
for(int i = 0;i<=input_column_array.length+1; i++)
{
int int_outputcolumn = Integer.parseInt(output_columns_number[i]);
int int_inputcolumn = Integer.parseInt(input_columns_number[i]);
if((int_inputcolumn != 0) && (int_outputcolumn != 0) && output_columns_number.length == input_columns_number.length){
Detail_output_column_array[int_outputcolumn-1] = input_column_array[int_inputcolumn-1];
Shop_output_column_array[0] = Detail_output_column_array[0];
Shop_output_column_array[1] = Detail_output_column_array[1];
Shop_output_column_array[2] = Detail_output_column_array[2];
Shop_output_column_array[3] = Detail_output_column_array[3];
Shop_output_column_array[4] = Detail_output_column_array[14];
if(details_output != null)
{
details_output = details_output+" "+ Detail_output_column_array[int_outputcolumn-1];
Shop_output = Shop_output+" "+ Shop_output_column_array[int_outputcolumn-1];
}else
{
details_output = Detail_output_column_array[int_outputcolumn-1];
Shop_output = Shop_output_column_array[int_outputcolumn-1];
}
}
}
}catch (Exception e)
{
}
mos.write("Details File", null, details_output);
mos.write("Shop File", null, Shop_output);
}
}
}
这是日志...
错误:java。com上的lang.NullPointerException。尼尔森。grfe。Export\u Column\u Mapping$Export\u Column\u Mapping\u Mapper。在com上映射(Export\u Column\u Mapping.java:113)。尼尔森。格菲。Export\u Column\u Mapping$Export\u Column\u Mapping\u Mapper。在组织中映射(Export\u Column\u Mapping.java:1)。阿帕奇。hadoop。mapreduce。映射器。在org上运行(Mapper.java:145)。阿帕奇。hadoop。映射。MapTask。在org上运行NewMapper(MapTask.java:787)。阿帕奇。hadoop。映射。MapTask。在组织上运行(MapTask.java:341)。阿帕奇。hadoop。映射。YarnChild 2美元。在java上运行(YarnChild.java:163)。安全AccessController。javax上的doPrivileged(本机方法)。安全授权。主题doAs(Subject.java:415)位于org。阿帕奇。hadoop。安全用户组信息。doAs(UserGroupInformation.java:1671)位于org。阿帕奇。hadoop。映射。YarnChild。main(YarnChild.java:158)
多输出的定义如下:
private MultipleOutputs<Text, LongWritable> mos ;
同时编写以下是代码:-
mos.write("Details File", null, details_output);
mos.write("Shop File", null, Shop_output);
应该是这样的
mos.write(your key in definition, your value in definition, output directory name as string)
改变你的定义,写和对应的东西如下:
private MultipleOutputs<NullWritable, Text> mos ;
mos.write(NullWritable.get(),new Text(details_output),"Details File");
mos.write(NullWritable.get(),new Text(Shop_output),"Shop File");
public static class Export_Column_Mapping_Mapper extends Mapper<LongWritable,Text,NullWritable,Text>
{
job.setOutputKeyClass(NullWritable.class);
还包括清理代码:
protected void cleanup(Context context)
throws IOException, InterruptedException {
multipleOutputs.close();
}
问题内容: 我正在尝试将我的reducer的结果输出到多个文件。数据结果全部包含在一个文件中,其余结果根据它们所尊重的文件中的类别进行划分。我知道使用0.18可以使用MultipleOutputs做到这一点,并且它尚未被删除。但是,我正在尝试使我的应用程序兼容0.20+。现有的多输出功能仍然需要JobConf(我的应用程序使用Job和Configuration)。如何根据密钥生成多个输出? 问题答
我是Hadoop的新手,但这是我上个月的一个学习项目。 为了使这一点足够模糊,以便对其他人有用,让我先抛出基本目标……假设: < li >显然,您有一个大型数据集,包含数百万个基本ASCII文本文件。 < ul > < li >每个文件都是一个“记录” e. g. /user/hduser/data/customer1/YYYY-MM-DD, /user/hduser/data/customer2
问题内容: 我的用例如下: 我有一个仅地图的mapreduce作业,该作业需要一个输入文件,进行了大量的解析和调整,然后再写回。但是,某些行的格式可能正确也可能不正确,如果是这样,我想将原始行写入单独的文件中。 看来,执行此操作的一种方法是将文件名添加到我正在打印的行的前面,并使用multipleOutputFormat参数。例如,如果我最初有: 我可以改为: 此解决方案唯一的问题是我不希望fil
我遇到了一个非常非常奇怪的问题。还原器确实工作,但如果我检查输出文件,我只能找到映射器的输出。当我尝试调试时,在将映射器的输出值类型从Longwritable更改为Text之后,我发现了与单词计数示例相同的问题 这是结果。 然后我在输出文件中发现了奇怪的结果。这个问题发生在我将map的输出值类型和reducer的输入键类型更改为Text之后,无论我是否更改了reduce输出值的类型。我还被迫更改j
我使用的是hadoop版本0.20和hadoop-core:1.2.0.jar 有没有可能使用新的hadoop API做到这一点?
在Hadoop MapReduce中是否有可能使用多个不同的映射器有多个输入?每个映射器类都在一组不同的输入上工作,但它们都会发出由同一个减速器使用的键值对。请注意,我不是在这里谈论链接映射器,我是在谈论并行运行不同的映射器,而不是顺序运行。