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. oracle创建表空间,创建用户(转)

    //创建临时表空间 create temporary tablespace test_temp tempfile 'E:\oracle\product\10.2.0\oradata\testserve ...

  2. LINUX进程控制

    1. 引言 一个程序是存储在文件中的机器指令序列.一般它是由编译器将源代码编译成二进制格式的代码.运行一个程序意味着将这个机器指令序列载入内存然后让处理器(cpu)逐条执行这些指令. 在Unix术语中 ...

  3. iphone 异常捕获处理

    iphone 异常捕获处理 1 void UncaughtExceptionHandler(NSException *exception) { 2 NSArray *arr = [exception ...

  4. C#基本语句

    1.创建个控制台应用程序(显示当前时间)然后在默认生成的Main函数里下如下代码:Console.WriteLine("显示当前时间:{0}",DateTime.Now.ToStr ...

  5. DXT纹理压缩

    转:http://blog.csdn.net/lhc717/article/details/6802951 我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩 ...

  6. SRM 620 DIV1 L2

    题意:有n个等长的string(设string的长度为m),string中的字符从'A'到'Z',容许对m列执行稳定的排序操作,问说是否能通过这m种操作将这n个string调整成对应的顺序. 题解: ...

  7. Java 类加载器(转)

    java虚拟机中可以安装多个类加载,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap(内嵌在java虚拟机中由C++编写),ExtClassLoader,AppClassLoa ...

  8. spring springmvc mybatis 整合

    环境 apache-tomcat-8.0.33.jdk1.8.0_05 maven Dynamic Web Module 2.5 1.各个xml配置文件的配置 (1)pom.xml 配置清单文件 连接 ...

  9. vc 6.0 连接数据库

    在mysql的文档(C:\Program Files\MySQL\MySQL Server 5.5\lib)里面找到libmysql.dll和libmysql.lib 两个文件,将他们移到 工程文件下 ...

  10. sqlserver取得本月一号

    select convert(datetime,convert(varchar(7),getdate(),120)+'-01',120) select convert(datetime,convert ...