Hadoop MR编程中main()函数参数注入

下面介绍MapReduce的主要的六个类,只有了解了这六个类的作用,才能在编写程序中知道哪个类是要自己实现,哪些类可以调用默认的类,才能真正的做到游刃有余,关于需要自己编写的类(用户制定类)可以参考:http://www.cnblogs.com/liqizhou/archive/2012/05/14/2499498.html

  1.  InputFormat类。该类的作用是将输入的文件和数据分割成许多小的split文件,并将split的每个行通过LineRecorderReader解析成<Key,Value>,通过job.setInputFromatClass()函数来设置,默认的情况为类TextInputFormat,其中Key默认为字符偏移量,value是该行的值。

  2. Map类。根据输入的<Key,Value>对生成中间结果,默认的情况下使用Mapper类,该类将输入的<Key,Value>对原封不动的作为中间按结果输出,通过job.setMapperClass()实现。实现Map函数。

  3. Combine类。实现combine函数,该类的主要功能是合并相同的key键,通过job.setCombinerClass()方法设置,默认为null,不合并中间结果。实现map函数

  4. Partitioner类。 该该主要在Shuffle过程中按照Key值将中间结果分成R份,其中每份都有一个Reduce去负责,可以通过job.setPartitionerClass()方法进行设置,默认的使用hashPartitioner类。实现getPartition函数

  5. Reducer类。 将中间结果合并,得到中间结果。通过job.setReduceCalss()方法进行设置,默认使用Reducer类,实现reduce方法。

  6. OutPutFormat类,该类负责输出结果的格式。可以通过job.setOutputFormatClass()方法进行设置。默认使用TextOUtputFormat类,得到<Key,value>对。

note:hadoop主要是上面的六个类进行mapreduce操作,使用默认的类,处理的数据和文本的能力很有限,具体的项目中,用户通过改写这六个类(重载六个类),完成项目的需求。说实话,我刚开始学的时候,我怀疑过Mapreudce处理数据功能,随着学习深入,真的很钦佩mapreduce的设计,基本就二个函数,通过重载,可以完成所有你想完成的工作。

public  static void main(String[] args)throws IOException {
        Configuration conf = new Configuration();
        Job job = new Job(conf);
        job.setInputFormatClass(TextInputFormat.class);
        job.setMapperClass(Mapper.class);
        job.setCombinerClass(null);
        job.setPartitionerClass(HashPartitioner.class);
        job.setReducerClass(Reducer.class);
        job.setOutputFormatClass(TextOutFormat.class);
    }
}


### 关于Hadoop MapReduce中的`NullPointerException` 在Hadoop MapReduce环境中遇到`java.lang.NullPointerException`通常意味着某些对象未被正确初始化即尝试访问其成员变量或方法。此类错误可能源于配置不当、数据源问题或是编码逻辑缺陷。 当面对`Exception in thread "main" java.lang NullPointerExceptioin`这样的异常时,这表明主线程遇到了空指针的情况[^1]。更具体的,在比较器相关部分出现问题的情况下,如`WritableComparator.compare()`函数处抛出了该异常,则可能是由于试图操作未经实例化的对象所引起的[^3]。 对于上述提到的`writeSplits`函数实现细节来看,如果涉及到的对象未能成功创建或者返回为空值而后续又进行了属性访问的话也会触发同样的异常情况[^2]。 #### 可能原因 - **输入路径不存在**:指定的数据集位置不正确或者是集群上的相应目录缺失。 - **依赖类加载失败**:自定义类型的序列化反序列化过程中缺少必要的注册步骤。 - **资源分配不足**:内存溢出可能导致临时对象无法正常构建完成。 - **代码逻辑漏洞**:业务处理环节存在潜在的风险点,比如数组越界读取等。 #### 解决方案建议 针对以上分析可以采取如下措施来排查并修复: ```bash # 检查输入参数合法性 hdfs dfs -test -e /path/to/input || echo "Input path does not exist!" ``` 确保所有外部依赖项都已妥善声明,并且应用程序能够找到它们;特别是当你引入了第三方库的时候要格外注意版本兼容性问题。 仔细审查涉及复杂结构体的操作语句,确认每一个新实体都被显式地赋予初值后再投入使用。 最后也是最容易忽视的一点是要保证整个工作流的设计合理有效——任何不合理之处都有可能间接造成难以预料的结果!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值