1.写hadoop的map-reduce程序之前所必须知道的基础知识:
1)hadoop map-reduce的自带的数据类型:
 Hadoop提供了如下内容的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。(如果是自定义的key,value的数据类型,必须也要写其大小比较的方法)
BooleanWritable:标准布尔型数值

ByteWritable:单字节数值

DoubleWritable:双字节数

FloatWritable:浮点数

IntWritable:整型数

LongWritable:长整型数

Text:使用UTF8格式存储的文本

NullWritable:当<key,value>中的key或value为空时使用

 
2)hadoop的 map -combiner - reduce 之间的输入输出数据类型的关系:

一个Map/Reduce 作业的输入和输出类型如下所示:

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

特别注意:combine的输入输出和map的输出完全一样
 
2.在写第一个hadoop程序中出现的问题:
1)由以上map-reduce的输入输出数据类型关系可以看出:
在hadoop中,只要定义了map和reduce的输出类型,那么整个hadoop的运行流程中的数据类型基本都确定了
hadoop程序在job中配置输出类型
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(Text.class); //combine的输入输出一定是<Text,Text,Text,Text>,reduce的输入一定是<Text,Text>
 
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(NullWritable.class);
 
2)以上job中的配置一定要与程序中mapper、combiner和reducer中定义的数据类型一致:
如果job中是以上配置,那么mapper,combiner和reducer的定义一定要是下面这样:
mapper:
  public static class MyMapper  extends Mapper<Object, Text, Text1, Text1>
combiner:
  public static class MyCombiner  extends Reducer<Text1,Text1,Text1,Text1>
reducer:
  public static class MyReducer  extends Reducer<Text1,Text1,Text,NullWritable>
注意:以上标红的地方类型必须完全一致(实际程序中应是Text类型,这里为了表明对应关系用Text)
 
3.调试map-reduce程序中,发现在eclipse中写map-reduce程序中经常程序会莫名其妙的终止,但是在eclipse中的console中却没有任何错误的提示——因为hadoop的很多输出时输出到log或系统的标准输出流中,如果想要看程序到底在哪里出现了问题,必须要在命令行中运行,才会显示所有的错误,如何在命令行中配置编译hadoop map-reduce程序的环境请看上一篇hadoop——在命令行下编译并运行map-reduce程序
 
4.调试程序中,每次编译好生成.class和.jar后,都要输入命令,运行完还得输入查询结果的命令,下一次运行还要清除上次放在hdfs中的文件,因此可以将整个程序执行过程通过写bash脚本来完成
具体的bash脚本如下:
#!/bin/bash
rm -f *.class *.jar && #删除当前目录下上次生成的jar包和.class文件
javac Hw2Part1.java &&#重新编译map-reduce程序
jar cfm Hw2Part1.jar WordCount-manifest.txt Hw2Part1*.class &&#生成jar包
hdfs dfs -rm -f -r hw2/output  hw2/example-input.txt#删除hdfs中上次的输入输出文件
hdfs dfs -put ./example-input.txt hw2/&&;#将选择的输入文件放到hdfs中
hadoop jar ./Hw2Part1.jar hw2/example-input.txt hw2/output &&#执行map-reduce程序
hdfs dfs -cat 'hw2/output/part-*'#查看map-reduce的输出

注意:在bash脚本中&&表示上条命令正确执行完后才会继续执行下条指令

值得注意的是:hadoop程序的输入可以是目录也可以是某个具体的文件,如果输入是目录就会顺序读取该目录下所有的文件,如果输入是文件,那么就只会读取这一个指定的文件
 
5。每次调试运行以上脚本后,就可以看到程序执行中具体哪个地方有问题,如果程序执行正确会直接在控制台上输出运行的结果
 
转:http://blog.csdn.net/guoqingpei/article/details/45620153

hadoop-初学者写map-reduce程序中容易出现的问题 3的更多相关文章

  1. Hadoop学习笔记2 - 第一和第二个Map Reduce程序

    转载请标注原链接http://www.cnblogs.com/xczyd/p/8608906.html 在Hdfs学习笔记1 - 使用Java API访问远程hdfs集群中,我们已经可以完成了访问hd ...

  2. eclipse 中运行 Hadoop2.7.3 map reduce程序 出现错误(null) entry in command string: null chmod 0700

    运行map reduce任务报错: (null) entry in command string: null chmod 0700 解决办法: 在https://download.csdn.net/d ...

  3. Hadoop学习:Map/Reduce初探与小Demo实现

    原文地址:https://blog.csdn.net/liyong199012/article/details/25423221 一.    概念知识介绍 Hadoop MapReduce是一个用于处 ...

  4. map reduce程序示例

    map reduce程序示例 package test2; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop. ...

  5. 使用Python实现Map Reduce程序

    使用Python实现Map Reduce程序 起因 想处理一些较大的文件,单机运行效率太低,多线程也达不到要求,最终采用了集群的处理方式. 详细的讨论可以在v2ex上看一下. 步骤 MapReduce ...

  6. 第一个map reduce程序

    完成了第一个mapReduce例子,记录一下. 实验环境: hadoop在三台ubuntu机器上部署 开发在window7上进行 hadoop版本2.2.0 下载了hadoop-eclipse-plu ...

  7. Hadoop 使用Combiner提高Map/Reduce程序效率

    众所周知,Hadoop框架使用Mapper将数据处理成一个<key,value>键值对,再网络节点间对其进行整理(shuffle),然后使用Reducer处理数据并进行最终输出. 在上述过 ...

  8. Hadoop实战:使用Combiner提高Map/Reduce程序效率

    好不easy算法搞定了.小数据測试也得到了非常好的结果,但是扔到进群上.挂上大数据就挂了.无休止的reduce不会结束了. .. .. .... .. ... .. ================= ...

  9. hadoop自己写的最高温度程序源码

    package com.teset; import java.io.IOException; import java.util.StringTokenizer; import org.apache.h ...

  10. Hadoop Map/Reduce教程

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html 目的 先决条件 概述 输入与输出 例子:WordCount v1.0 ...

随机推荐

  1. 在Unity中使用贝塞尔曲线(转)

    鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是 ...

  2. Android安卓开发环境搭建详细教程

    安装目录:步骤1 安装JDK步骤2 安装 Android SDK ----http://www.androiddevtools.cn/ 步骤3 安装Tomcat步骤4 安装Ant步骤5 安装Eclip ...

  3. mysql 复杂的查询语句,工作中用到的记录下

    1  去重查询 select distinct id from user_info where xxxxxx 2 group by 分组查询中排序 group by本身没有排序功能,这可能是mysql ...

  4. iOS开发--UITableView

    -.建立 UITableView  DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)];  [Data ...

  5. WebService另一种轻量级实现—Hessian 学习笔记

    最近和同事聊天,得知他们在使用一种叫做Hessian的WebService实现方式实现远 程方法调用,是轻量级的,不依赖JavaEE容器,同时也是二进制数据格式传输,效率比SOAP的XML方式要高.感 ...

  6. Partitioner

    partitioner 是map中的数据映射到不同的reduce时的根据.一般情况下,partitioner会根据数据的key来把数据平均分配给不同的reduce,同时保证相同的key分发到同一个re ...

  7. c++异常 连续抛出异常

      今天天遇到这样一个问题,连续两次抛出异常,但是只有一个catch,会导致core这个时候会导致core, 单线程编程中可能很少遇到这样的问题,但是多线程中是很容易遇到的, 举个例子:catch代码 ...

  8. jenkins的搭建和使用

    Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和 ...

  9. Linux中__init、__devinit等内核优化宏【转】

    转自:http://blog.csdn.net/joker0910/article/details/7171626 内核使用了大量不同的宏来标记具有不同作用的函数和数据结构.如宏__init .__d ...

  10. C# 中通过API实现的打印类

    using System;using System.Collections;using System.Text;using System.Runtime.InteropServices; using ...