当前位置: 首页 > 知识库问答 >
问题:

Hadoop:在本地模式下运行的奇怪的空点异常

颜英博
2023-03-14

我刚开始学习Hadoop,我从一本书中摘录了一个例子。所以我创建了一个本地运行的MapReducer,它可以从NCDC免费数据文件中提取温度。这是一个数据样本:

0143023780999992012010100004+61450+017167FM-12+002799999V0209999C...cut...;

每一个文件(我下载了大约100个文件)都由许多这样的行组成。

我的映射程序执行简单的解析操作,从这些文件中提取温度。整个过程将返回最高温度。

映射器和相关测试:

public class MaxTemperatureMapper extends Mapper<LongWritable,Text,Text,IntWritable> {

@Override
public void map(LongWritable key, Text value, Context context) {
    String record = value.toString();
    String year = record.substring(15,19);
    int airTemperature = extractTemp(record);
    if (isNotValidTemp(record, airTemperature)) return;
    try {
        context.write(new Text(year), new IntWritable(airTemperature));
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private boolean isNotValidTemp(String record, int airTemperature) {
    return airTemperature == 9999 || !record.substring(92, 93).matches("[01459]");
}

private int extractTemp(String record) {
    String temp = (record.charAt(87) == '+')
            ? record.substring(88,92)
            : record.substring(87,92);
    return Integer.parseInt(temp);
}

}

public class MaxTemperatureMapperTest {

@Test
public void processRecord() {
    Text value = new Text("0111011120999992012010100004+65450+012217FM-12+000999999V0201301N014019999999N9999999N1+00031-00791099271ADDMA1999999099171MD1810341+9999REMSYN070AAXX  01001 01112 46/// /1314 10003 21079 39917 49927 58034 333 91124;");

    new MapDriver<LongWritable, Text, Text, IntWritable>()
            .withMapper(new MaxTemperatureMapper())
            .withInputValue(value)
            .withOutput(new Text("2012"), new IntWritable(3))
            .runTest();
}

@Test
public void processRecordsFromSuspiciousFile() throws IOException {
    final InputStream is = getClass().getClassLoader().getSystemResource("023780-99999-2012").openStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line;
    Iterator<Integer> ii = Arrays.asList(-114, -120, -65, -45, 1, 4, 6, 6, 10, 16, 18, 29, 32, 17, 7, 16, 22, 8, 8, 20).iterator();
    while ((line = br.readLine()) != null) {
        new MapDriver<LongWritable, Text, Text, IntWritable>()
                .withMapper(new MaxTemperatureMapper())
                .withInputValue(new Text(line))
                .withOutput(new Text("2012"), new IntWritable(ii.next()))
                .runTest();
    }
    br.close();


}
}

减速器及相关测试:

public class MaxTemperatureReducer extends Reducer<Text,IntWritable,Text,IntWritable> {

@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) {
    int maxValue = Integer.MIN_VALUE;
    for (IntWritable value : values) {
        maxValue = Math.max(value.get(), maxValue);
    }
    try {
        context.write(key, new IntWritable(maxValue));
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

public class MaxTemperatureReducerTest {

@Test
public void processRecord() {

    new ReduceDriver<Text,IntWritable,Text,IntWritable>()
            .withReducer(new MaxTemperatureReducer())
            .withInputKey(new Text("2012"))
            .withInputValues(Arrays.asList(new IntWritable(5), new IntWritable(10)))
            .withOutput(new Text("2012"), new IntWritable(10))
            .runTest();
}
}

最后是驾驶员等级测试:

public class MaxTemperatureDriver extends Configured implements Tool {

@Override
public int run(String[] args) throws Exception {
    if (args.length != 2) {
        System.err.printf("Usage: %s [generic options] <input> <output>\n", getClass().getSimpleName());
        ToolRunner.printGenericCommandUsage(System.err);
        return -1;
    }

    Job job = new Job(getConf(), "Max Temperature");
    job.setJarByClass(getClass());

    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.setMapperClass(MaxTemperatureMapper.class);
    job.setCombinerClass(MaxTemperatureReducer.class);
    job.setReducerClass(MaxTemperatureReducer.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Iterable.class);

    return job.waitForCompletion(true) ? 0 : 1;
}

public static void main(String[] args) throws Exception {
    int exitCode = ToolRunner.run(new MaxTemperatureDriver(), args);
    System.exit(exitCode);
}
}

public class MaxTemperatureDriverTest {

@Test
public void test() throws Exception {
    Configuration conf = new Configuration();
    conf.set("fs.default.name", "file:///");
    conf.set("mapred.job.tracker", "local");

    Path input = new Path("file:////home/user/big-data/ncdc/");
    Path output = new Path("output");

    FileSystem fs = FileSystem.getLocal(conf);
    fs.delete(output, true);

    MaxTemperatureDriver driver = new MaxTemperatureDriver();
    driver.setConf(conf);

    int exitCode = driver.run(new String[] { input.toString(), output.toString() });
    assertThat(exitCode, is(0));
}
}

我使用命令行运行整个过程:

$> hadoop doop.MaxTemperatureDriver -fs file:/// -jt local ~/big-data/ncdc/ output

MaxTemperatureDriverTest中的测试,但在这两种情况下,我都得到:

    13/09/21 19:45:13 INFO mapred.MapTask: Processing split: file:/home/user/big-data/ncdc/023780-99999-2012:0+5337
13/09/21 19:45:13 INFO mapred.MapTask: io.sort.mb = 100
13/09/21 19:45:14 INFO mapred.MapTask: data buffer = 79691776/99614720
13/09/21 19:45:14 INFO mapred.MapTask: record buffer = 262144/327680
13/09/21 19:45:14 INFO mapred.LocalJobRunner: Map task executor complete.
13/09/21 19:45:14 WARN mapred.LocalJobRunner: job_local462595973_0001
java.lang.Exception: java.lang.NullPointerException
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.NullPointerException
    at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:970)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:223)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

以一种“过于通用”的方式,当试图解析文件“023780-99999-2012”时,它总是返回空指针异常。所以我为它写了一个测试(你可以在映射器测试“进程记录”中看到),但它不返回错误。我也检查了日志,但没有成功。

是否与错误或缺少本地模式参数(线程数、堆内存等)有关?还是密码有问题?

共有1个答案

郑功
2023-03-14

Hadoop完全不知道如何序列化Iterable。如果您真的打算使用Iterable作为输出值类,那么还需要为Iterable指定一个序列化程序。Hadoop使用的典型I/O类型是可写的子类。

更新:我现在知道您打算使用intwriteable作为输出值类。你的问题是这条驱动线:

job.setOutputValueClass(Iterable.class)

应该是

job.setOutputValueClass(IntWritable.class)    
 类似资料:
  • 我试图理解,为什么Netty SSL模式工作在奇怪的方式?此外,问题如下,当任何SSL客户端(https浏览器,使用ssl的java客户端,也任何ssl客户端应用程序)连接到Netty服务器时,我开始完整的消息,在那里我可以正确识别所使用的协议,但只要通道保持连接,任何下面的消息都有奇怪的结构,与非ssl模式不同。例如,当https浏览器连接到我的服务器时,MessageRec的方法: 我已使用P

  • 我在集群模式和本地模式中尝试火花上的简单字数示例它在本地模式中工作良好,但在集群模式中抛出类铸造异常这里是代码片段... 针对scala 2.11构建环境Spark 1.6。7. 例外情况: 火花壳输出:

  • 下面是未启动的Datanode的日志: 2012-08-03 17:47:33,873 INFO org.mortbay.log:Stopped SelectChannelConnector@0.0.0.0:50075 2012-08-03 17:47:33,980 INFO org.apache.hadoop.IPC.server:停止50020上的服务器2012-08-03 17:47:33,

  • Hadoop版本=2.4.1 hbase版本=0.98.6 我已经在下面的conf上启动并顺利运行了hadoop: 107.108.86.119-hadoop namenode,secondarynamenode 107.109.155.100-datanode1 107.109.155.102-datanode2 现在我按以下方式安装hbase:- 107.108.86.114:-hmaster

  • 问题内容: 基本上,该网站可以正常运行12多个小时,然后突然停止工作。我将开始在以前运行良好的LINQ查询中引发奇怪的异常。 我在这篇文章的底部提供了堆栈跟踪。 根据在类似SO帖子上找到的建议,我通过直接从Server Explorer中的DB拖动表来删除并重新制作了DBML。比较Git中的新旧内容,我发现了一些不同的字段: 在dbml中将varchar(255)的一个实例设置为nchar(10)

  • 我正在使用Mapstruct映射将一个POJO转换为另一个POJO模型 以下是mapstruct自动生成的方法 该方法基本上获取源POJO的映射,并将其转换为目标模型的映射。生成正在通过。 当我运行代码时,我在这个方法中得到了ClassCast异常:HeaderAttributeGenericDataTypeMaptoStringEnergiectAttributeDataMap 堆栈跟踪: 我还