zoukankan      html  css  js  c++  java
  • Hadoop on Mac with IntelliJ IDEA

    本文讲述使用KeyValueTextInputFormat在Hadoop 0.x正常工作、Hadoop 1.2.1失效的解决过程。

    环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1

    Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机。IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6。

    还在折腾Hadoop In Action第4章的代码,书的写法,如下所示。

    job.setInputFormat(KeyValueTextInputFormat.class);
    job.set("key.value.separator.in.input.line", ",");

    在hadoop 1.2.1上运行正常。但是,我强迫症又发作了,想把代码改成符合hadoop 1.2.1的范式,如下所示。

    configuration.set("key.value.separator.in.input.line", ",");
    Job job = new Job(configuration, "Patent Job");
    job.setInputFormatClass(KeyValueTextInputFormat.class);

    运行时,从日志上看,数据没按预期切割,而是将整行作为key值,即是设置的分隔符失效,此为无制表符时默认操作的结果,如下图所示。

    数据源如下图所示

    按如下方式修改[1],则结果正常。

    // 原语句
    configuration.set("key.value.separator.in.input.line", ",");
    // 改成
    configuration.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator",",");

    Hadoop 1.x之后,Job和Configuration之间的职责有了更清晰的划分。以上语句可工作的原因是,当设置job的InputFormatClass值为KeyValueTextInputFormatj时,从源码可看到

    1 public RecordReader<Text, Text> createRecordReader(InputSplit genericSplit,
    2   TaskAttemptContext context) throws IOException {
    3     context.setStatus(genericSplit.toString());
    4     return new KeyValueLineRecordReader(context.getConfiguration());
    5 }

    即,返回一个KeyValueLineRecordReader读取输入数据的行记录,在其源码,可看到KEY_VALUE_SEPERATOR字段。

    public static final String KEY_VALUE_SEPERATOR = 
        "mapreduce.input.keyvaluelinerecordreader.key.value.separator";

    在其构造函数中,可看到读取语句

    1 public KeyValueLineRecordReader(Configuration conf)
    2     throws IOException {
    3         lineRecordReader = new LineRecordReader();
    4         String sepStr = conf.get(KEY_VALUE_SEPERATOR, "	");
    5         this.separator = (byte) sepStr.charAt(0);
    6 }

    可见,默认值分隔符为 。

    Configuration类加载hadoop-site.xml、core-default.xml、core-site.xml等配置文件。

    参考

    [1]http://stackoverflow.com/questions/12540145/hadoop-use-keyvaluetextinputformat

  • 相关阅读:
    H5调用本地摄像头
    zepto和jquery的区别,zepto的不同使用8条小结
    web前端页面性能优化小结
    超赞!聊聊WEB APP、HYBRID APP与NATIVE APP的设计差异
    activemq生产者和消费者的双向通信
    消息队列同步和异步机制
    postman使用教程
    spring boot mybatis sql打印到控制台
    spring boot 整合 mybatis 以及原理
    spring 框架整合mybatis的源码分析
  • 原文地址:https://www.cnblogs.com/michaellfx/p/4003186.html
Copyright © 2011-2022 走看看