Hadoop 运行过程深入分析

2019-03-28 13:44|来源: 网络

我们照着 Hadoop教程简单的写了一个例子,它可以用于分析天气数据然后找到某年的最高气温。

我们是用hadoop 0.20的新的API写的,具体代码如下:

Mapper类:

 
   
  1. /*  
  2.  */ 
  3. package com.charles.parseweather; 
  4.  
  5. import java.io.IOException; 
  6.  
  7. import org.apache.hadoop.io.IntWritable; 
  8. import org.apache.hadoop.io.LongWritable; 
  9. import org.apache.hadoop.io.Text; 
  10. import org.apache.hadoop.mapreduce.Mapper; 
  11.  
  12. /** 
  13.  * 
  14.  * Description: 这是map类,之中定义了map函数, 这是基于Hadoop0.20的新的API 
  15.  * base class有4个类型参数,分别是输入key,输入value,输出key,输出value的类型 
  16.  * 在我们的例子中, 
  17.  * 输入key:LongWritable的偏移量,代表某一行起始位置相对于文件起始位置的偏移量 
  18.  * 输入value: 指定行的单行文本,这里面涵盖了包括气温信息在内的其他信息 
  19.  * 输出key: 这行中的年份信息 
  20.  * 输出value:这行中的气温 
  21.  *  
  22.  *所以对于其中的某一行:比如: 
  23.  *0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999 
  24.  * 假如每一行都是106个字符,而且这个是第2行,那么 
  25.  * 输入key 为 106  (偏移量,LongWritable类型) 
  26.  * 输入value 为全部文本 
  27.  * 输出key:年份信息,这里是第15-19个字符,所以是1901 
  28.  * 输出value:气温信息,这里是第87-92个字符(因为可能是零下温度),所以是0 (IntWritable类型) 
  29.  *  
  30.  * 
  31.  * @author charles.wang 
  32.  * @created May 24, 2012 5:10:27 PM 
  33.  *  
  34.  */ 
  35. public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> { 
  36.  
  37.     //定义了一个不可能的气温值,如果这一行的气温是这个数字,则表示这一年没有统计气温 
  38.     private static final int MISSING = 9999
  39.      
  40.     //这个map方法将(文本偏移量,这行文本)映射为(年份,气温),并且写入Context中 
  41.     //这里使用了Hadoop自身提供的数据类型,他们的作用只是在网络序列化过程中优化 
  42.     //但是最终我们还是要吧他们转为java.lang中的基本类型来处理 
  43.     public void map(LongWritable key,Text value ,Context context) 
  44.         throws IOException ,InterruptedException{ 
  45.          
  46.         //因为value代表了这行文本,所以我们先要从其中提取信息 
  47.         //将网络传输的文本转为String类型的行 
  48.         String line = value.toString(); 
  49.         //从行中提取了年份信息,这个将作为输出的key 
  50.         String year = line.substring(15,19); 
  51.          
  52.          
  53.         int airTemperature; 
  54.          
  55.         //对于气温,因为有正负之分,所以要区别对待,第87位是符号位 
  56.         //对于正的气温值,从下一个位置开始截取到92位置,然后转为整数类型 
  57.         //对于负的气温值,直接截取到92位置,然后转为整数类型 
  58.          
  59.         if(line.charAt(87) == '+'){ 
  60.             airTemperature = Integer.parseInt(line.substring(88,92)); 
  61.         }else
  62.             airTemperature =  Integer.parseInt(line.substring(87,92)); 
  63.         } 
  64.          
  65.          
  66.         String quantity = line.substring(92,93); 
  67.         //quantity的参数为正则表达式,quantity.matches("[01459]")表明数量只可能是以0,1,4,5,9才有效 
  68.         if(airTemperature != MISSING && quantity.matches("[01459]")){ 
  69.             //只把正确的气温数值写入Context对象,写的时候又要转为Hadoop数据类型,因为要通过网络传输到reduce中 
  70.             //这里可以看出key为年份,value为这一行中包含的气温值 
  71.             context.write(new Text(year),new IntWritable(airTemperature)); 
  72.         } 
  73.          
  74.     } 
  75.  

相关问答

更多
  • 现在hadoop1.0都出了 简单说一下吧 你的java jdk的环境变量没有设置吧? 最好按以下步骤再做一遍: 1 用root用户安装jdk1.6以上 2 用root用户 创建hadoop用户 3 在hadoop用户下安装hadoop(你上面说的1到4) 4 修改/home/hadoop/.bash_profile将JDK和hadoop的环境变量设置好 5 安装ssh(伪集群也需要ssh)
  • hadoop 运行问题[2021-09-25]

    解决方案: 1. 格式化namenode: # hadoop namenode -format 2. 重新启动hadoop# sh stop-all.sh# sh start-all.sh 3. 查看后台进程# jps13508 NameNode11008 SecondaryNameNode14393 Jps11096 JobTracker此时namenode启动 4. 运行# hadoop fs -ls12/01/31 14:04:39 INFO security.Groups: Group mappin ...
  • 做了一个全新安装的hadoop并用同一个罐子运行工作,问题就消失了。 似乎是一个错误,而不是编程错误。 Did a fresh installation of hadoop and ran the job with the same jar, the problem disappeared. Seems to be a bug rather than programming errors.
  • 您需要为openCV安装所需的包。 这篇文章介绍如何安装openCV: http : //www.samontab.com/web/2012/06/installing-opencv-2-4-1-ubuntu-12-04-lts/ 您需要的是以下命令: sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python- ...
  • Hadoop有asm 3.2而我使用的是ASM 5.在ASM5中,ClassVisitor是一个超类,而在3.2中它是一个接口。 出于某种原因,错误是Throwable(信任Shevek),catch块只捕获异常。 任何hadoop日志都没有捕获throwable错误。 因此,调试非常困难。 使用jar jar链接修复asm版本问题,现在一切正常。 如果你正在使用Hadoop并且某些东西不起作用并且没有日志显示任何错误,那么请尝试抓住Throwable。 阿伦 Hadoop had asm 3.2 and ...
  • TaggedWritable类没有空构造函数,因此在应该读取序列化数据的reduce阶段,app会因为无法通过反射创建TaggedWritable键入键而TaggedWritable 。 您应该添加一个空构造函数。 您的地图阶段已成功完成,因为在地图阶段,您的映射器会TaggedWritable创建TaggedWritable类型的键。 This code solves the problem and gives the expected result. It is from here, public st ...
  • 我认为这会帮助你更好地理解Spark和Haddop之间的关系: Hadoop本质上是一个分布式数据基础架构:它在大量商品服务器中的多个节点上分发海量数据集合,这意味着您不需要购买和维护昂贵的定制硬件。 它还对这些数据进行索引和跟踪,使大数据处理和分析能够比以前更有效。 另一方面,Spark是一种数据处理工具,可以对这些分布式数据集进行操作; 它不会做分布式存储。 欲了解更多信息,请阅读。 I think this will help you understand better the relation be ...
  • 这可能发生在作业仅检测到本地文件系统的情况下,它使用LocalFileSystem API与本地文件系统中的文件进行交互。 请参考以下链接, 使用MiniDFSCluster单元测试hadoop hdfs着作 这是我们在开发环境中开发的mapreduce / hdfs代码的单元测试选项之一。虽然在hadoop clsuter中部署相同的代码,但输入文件将在HDFS位置。 This probably happens in the scenario where the job only detects the ...
  • 看起来你正在使用hadoop的后级版本。 检查您的图形构建器版本所需的hadoop版本,并确保它是您正在运行的版本。 Looks like you're using a back level version of hadoop. Check the version of hadoop that your version of graph builder needs and make sure that's the version you're running.
  • 你是部分正确的。 为了避免Jobtracker做出调度和监控的负担,YARN被引入了画面。 因此,对于YARN,您没有任何作业跟踪器或任务跟踪器。 Job跟踪器完成的工作现在由资源管理器完成,资源管理器有两个主要组件Scheduler(为应用程序分配资源)和ApplicationsManager(接受作业提交并在发生任何故障时重新启动ApplicationMaster)。 现在每个应用程序都有一个ApplicationMaster,它从调度程序协调容器(将运行作业的位置)以运行应用程序。 Nodemanag ...