Hadoop 运行过程深入分析

 我们照着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.  

Reducer类:

  
  
  
  
  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.Text; 
  9. import org.apache.hadoop.mapreduce.Reducer; 
  10.  
  11. /** 
  12.  * 
  13.  * Description:这是reduce类,之中定义了reduce函数 
  14.  * base class有4个类型参数,分别是输入key,输入value,输出key,输出value的类型 
  15.  *  
  16.  * reduce的输入类型必须和map的输出类型匹配,因为在 MaxTemperatureMapper中,我们输出类型是(Text,IntWritable) 
  17.  * 所以我们这里的reduce的输入类型必须是 (Text,IntWritable),这样才可以吧(年份,气温)传递给这个reduce 
  18.  *  
  19.  * 在我们的例子中, 
  20.  * 输入key:从Mapper传过来的年份数据,Text类型 
  21.  * 输入value: 从Mapper传过来的当年的气温信息,IntWritable类型 
  22.  * 输出key: 年份 
  23.  * 输出value:这 一年的最高气温 
  24.  *  
  25.  * 所以对于其中从Mapper传递过来的一组原始数据,比如(1949,111),(1949,78),最终会被reduce为(1949,111) 
  26.  *  
  27.  
  28.  * @author charles.wang 
  29.  * @created May 24, 2012 5:19:46 PM 
  30.  *  
  31.  */ 
  32. public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> { 
  33.  
  34.     //reduce函数可以将(年份,<气温,气温,气温>)的列表进行比较,找到最大值 
  35.     //因为map函数中,所有的气温信息是依次存入到 context中的,所以这个年份对应的气温是一个List 
  36.      
  37.     public void reduce(Text key,Iterable<IntWritable> values, Context context) 
  38.       throws IOException, InterruptedException{ 
  39.          
  40.          
  41.         int maxValue=Integer.MIN_VALUE; 
  42.         //循环找到最大气温,如果是比当前最大的大,那么久取而代之 
  43.         for (IntWritable value : values){ 
  44.             maxValue=Math.max(maxValue, value.get()); 
  45.         } 
  46.          
  47.         //遍历完,找到最大气温后,把(年份,最大气温) 写入Context对象 
  48.         context.write(key,new IntWritable(maxValue)); 
  49.     } 

驱动类,它会负责提交数据给Map-Reduce过程,然后输出结果:

  
  
  
  
  1. package com.charles.parseweather; 
  2.  
  3.  
  4. import org.apache.hadoop.conf.Configuration; 
  5. import org.apache.hadoop.fs.Path; 
  6. import org.apache.hadoop.io.IntWritable; 
  7. import org.apache.hadoop.io.Text; 
  8. import org.apache.hadoop.mapreduce.Job; 
  9. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
  10. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
  11. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
  12. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 
  13.  
  14.  
  15. /** 
  16.  *  
  17.  * 
  18.  * Description: 这个类定义并且运行作业 
  19.  * 
  20.  * @author charles.wang 
  21.  * @created May 24, 2012 5:29:12 PM 
  22.  * 
  23.  */ 
  24.  
  25. public class MaxTemperature { 
  26.  
  27.     /** 
  28.      * @param args 
  29.      */ 
  30.     public static void main(String[] args) throws Exception{ 
  31.         // TODO Auto-generated method stub 
  32.  
  33.          
  34.         if (args.length !=2){ 
  35.             System.err.println("Usage: MaxTemperature <input path> <output path>"); 
  36.             System.exit(-1); 
  37.         } 
  38.          
  39.         //创建一个Map-Reduce的作业 
  40.         Configuration conf = new Configuration(); 
  41.         conf.set("hadoop.job.ugi""hadoop-user,hadoop-user"); 
  42.          
  43.         Job job = new Job(conf,"Get Maximum Weather Information! ^_^"); 
  44.          
  45.         //设定作业的启动类/  
  46.         job.setJarByClass(MaxTemperature.class); 
  47.          
  48.         //解析输入和输出参数,分别作为作业的输入和输出,都是文件 
  49.         FileInputFormat.addInputPath(job, new Path(args[0])); 
  50.         FileOutputFormat.setOutputPath(job, new Path(args[1])); 
  51.         
  52.         //配置作业,设定Mapper类,Reducer类 
  53.         job.setMapperClass(MaxTemperatureMapper.class); 
  54.         job.setReducerClass(MaxTemperatureReducer.class); 
  55.         job.setOutputKeyClass(Text.class); 
  56.        job.setOutputValueClass(IntWritable.class); 
  57.          
  58.         System.exit(job.waitForCompletion(true)?0:1); 
  59.         
  60.          
  61.          
  62.          
  63.          
  64.  
  65.     } 
  66.  

因为驱动要2个参数,第一个参数是HDFS文件系统中包含样本数据的文件位置,第二个参数是HDFS文件系统中处理完后的输出文件所在的目录。

我们先把样本数据(1901.txt)放入指定位置并且确认其存在:

当然了,你也可以在IDE中用Hadoop 视图来查看文件系统:

然后传入2个参数 (HDFS中输入文件位置和输出目录):

 

运行时报错,堆内存溢出:

 

因为默认JDK设置的堆内存是64M,所以我们把它调大:

 

最终运行成功,并且正确的显示整个过程在控制台上:

  
  
  
  
  1. 12/05/25 18:33:37 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId= 
  2. 12/05/25 18:33:37 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 
  3. 12/05/25 18:33:37 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String). 
  4. 12/05/25 18:33:42 INFO input.FileInputFormat: Total input paths to process : 1 
  5. 12/05/25 18:33:42 INFO mapred.JobClient: Running job: job_local_0001 
  6. 12/05/25 18:33:42 INFO input.FileInputFormat: Total input paths to process : 1 
  7. 12/05/25 18:33:42 INFO mapred.MapTask: io.sort.mb = 100 
  8. 12/05/25 18:33:42 INFO mapred.MapTask: data buffer = 79691776/99614720 
  9. 12/05/25 18:33:42 INFO mapred.MapTask: record buffer = 262144/327680 
  10. 12/05/25 18:33:42 INFO mapred.MapTask: Starting flush of map output 
  11. 12/05/25 18:33:43 INFO mapred.MapTask: Finished spill 0 
  12. 12/05/25 18:33:43 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting 
  13. 12/05/25 18:33:43 INFO mapred.LocalJobRunner:  
  14. 12/05/25 18:33:43 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done. 
  15. 12/05/25 18:33:43 INFO mapred.LocalJobRunner:  
  16. 12/05/25 18:33:43 INFO mapred.Merger: Merging 1 sorted segments 
  17. 12/05/25 18:33:43 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 72206 bytes 
  18. 12/05/25 18:33:43 INFO mapred.LocalJobRunner:  
  19. 12/05/25 18:33:43 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting 
  20. 12/05/25 18:33:43 INFO mapred.LocalJobRunner:  
  21. 12/05/25 18:33:43 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 is allowed to commit now 
  22. 12/05/25 18:33:43 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://192.168.129.35:9000/user/hadoop-user/output 
  23. 12/05/25 18:33:43 INFO mapred.LocalJobRunner: reduce > reduce 
  24. 12/05/25 18:33:43 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done. 
  25. 12/05/25 18:33:43 INFO mapred.JobClient:  map 100% reduce 100% 
  26. 12/05/25 18:33:43 INFO mapred.JobClient: Job complete: job_local_0001 
  27. 12/05/25 18:33:43 INFO mapred.JobClient: Counters: 14 
  28. 12/05/25 18:33:43 INFO mapred.JobClient:   FileSystemCounters 
  29. 12/05/25 18:33:43 INFO mapred.JobClient:     FILE_BYTES_READ=105868 
  30. 12/05/25 18:33:43 INFO mapred.JobClient:     HDFS_BYTES_READ=1776380 
  31. 12/05/25 18:33:43 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=212428 
  32. 12/05/25 18:33:43 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=9 
  33. 12/05/25 18:33:43 INFO mapred.JobClient:   Map-Reduce Framework 
  34. 12/05/25 18:33:43 INFO mapred.JobClient:     Reduce input groups=1 
  35. 12/05/25 18:33:43 INFO mapred.JobClient:     Combine output records=0 
  36. 12/05/25 18:33:43 INFO mapred.JobClient:     Map input records=6565 
  37. 12/05/25 18:33:43 INFO mapred.JobClient:     Reduce shuffle bytes=0 
  38. 12/05/25 18:33:43 INFO mapred.JobClient:     Reduce output records=1 
  39. 12/05/25 18:33:43 INFO mapred.JobClient:     Spilled Records=13128 
  40. 12/05/25 18:33:43 INFO mapred.JobClient:     Map output bytes=59076 
  41. 12/05/25 18:33:43 INFO mapred.JobClient:     Combine input records=0 
  42. 12/05/25 18:33:43 INFO mapred.JobClient:     Map output records=6564 
  43. 12/05/25 18:33:43 INFO mapred.JobClient:     Reduce input records=6564 

 从控制台,我们可以看到如下的事实:

第2行:使用GenericOptionsParser可以来解析我们传入的参数(输入文件,输出目录),所以分析结果是只有一个输入文件。

第5行:为我们的作业(也就是这个main应用)分配了一个作业id叫job_local_0001

第7到11行:是MapTask的任务,它对Map进行了设置。

第7行:io.sort.mb表明map输出结果在内存中占用的buffer的大小,这里设为100MB,因为map的输出不直接写硬盘,而是写入缓存,直到缓存到达一定数量,则后台线程会去写硬盘。

第11行:每次内存向硬盘flush数据会产生一个spill文件,所以这一行就是这个 spill文件。

第12-14行:map任务完成,这个map任务的id为attempt_local_0001_m_000000_0

第16-17行:进行合并(Merge)Map 过程的结果。

第18-19行:reduce任务完成,这个reduce任务的id为attempt_local_0001_r_000000_0

第20-24行:reduce任务用于提交结果到HDFS文件系统,结果文件存放在命令行参数指定的目录中。

第25-43行:是map-reduce过程的一个总结性报告。

 

我们校验文件系统,也发现了最终结果是我们所希望的(1901年最高气温为37度):

 

我们还不满足,我们要继续看namenode,datanode,secondarynode做的具体事情。

namenode不做具体计算,而是吧整个文件分块然后分配给datanode:

  
  
  
  
  1. 2012-05-25 18:31:42,170 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=open    src=/user/hadoop-user/input/1901.txt    dst=null    perm=null 
  2. 2012-05-25 18:31:42,284 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=open    src=/user/hadoop-user/input/1901.txt    dst=null    perm=null 
  3. 2012-05-25 18:31:42,287 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Number of transactions: 21 Total time for transactions(ms): 0Number of transactions batched in Syncs: 1 Number of syncs: 14 SyncTimes(ms): 8  
  4. 2012-05-25 18:31:42,288 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=mkdirs  src=/user/hadoop-user/output/_temporary dst=null    perm=hadoop-user:supergroup:rwxr-xr-x 
  5. 2012-05-25 18:31:42,398 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=open    src=/user/hadoop-user/input/1901.txt    dst=null    perm=null 
  6. 2012-05-25 18:31:43,033 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=create  src=/user/hadoop-user/output/_temporary/_attempt_local_0001_r_000000_0/part-r-00000 dst=null    perm=hadoop-user:supergroup:rw-r--r-- 
  7. 2012-05-25 18:31:43,054 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.allocateBlock: /user/hadoop-user/output/_temporary/_attempt_local_0001_r_000000_0/part-r-00000. blk_624828232551808657_1006 
  8. 2012-05-25 18:31:43,068 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.addStoredBlock: blockMap updated: 192.168.129.35:50010 is added to blk_624828232551808657_1006 size 9 
  9. 2012-05-25 18:31:43,074 INFO org.apache.hadoop.hdfs.StateChange: DIR* NameSystem.completeFile: file /user/hadoop-user/output/_temporary/_attempt_local_0001_r_000000_0/part-r-00000 is closed by DFSClient_281756056 
  10. 2012-05-25 18:31:43,079 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=listStatus  src=/user/hadoop-user/output/_temporary/_attempt_local_0001_r_000000_0  dst=null    perm=null 
  11. 2012-05-25 18:31:43,081 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=mkdirs  src=/user/hadoop-user/output    dst=null    perm=hadoop-user:supergroup:rwxr-xr-x 
  12. 2012-05-25 18:31:43,084 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=rename  src=/user/hadoop-user/output/_temporary/_attempt_local_0001_r_000000_0/part-r-00000 dst=/user/hadoop-user/output/part-r-00000   perm=hadoop-user:supergroup:rw-r--r-- 
  13. 2012-05-25 18:31:43,086 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=delete  src=/user/hadoop-user/output/_temporary/_attempt_local_0001_r_000000_0  dst=null    perm=null 
  14. 2012-05-25 18:31:43,090 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hadoop-user,hadoop-user ip=/192.168.40.16   cmd=delete  src=/user/hadoop-user/output/_temporary dst=null    perm=null 
  15. 2012-05-25 18:32:09,469 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=root,Domain,Users,Remote,Desktop,Users,Users    ip=/192.168.40.16   cmd=listStatus  src=/   dst=null    perm=null 

 

datanode是做具体的计算任务:

  
  
  
  
  1. 2012-05-25 17:41:20,336 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src=\'#\'" /192.168.129.35:43564, dest: /192.168.129.35:50010, bytes: 888190, op: HDFS_WRITE, cliID: DFSClient_150980970, srvID: DS-1002949858-192.168.129.35-50010-1337839176422, blockid: blk_-3989731445395160971_1003 
  2. 2012-05-25 17:41:20,336 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: PacketResponder 0 for block blk_-3989731445395160971_1003 terminating 
  3. 2012-05-25 17:49:18,074 INFO org.apache.hadoop.hdfs.server.datanode.DataBlockScanner: Verification succeeded for blk_-3989731445395160971_1003 
  4. 2012-05-25 17:50:46,190 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: BlockReport of 2 blocks got processed in 1 msecs 
  5. 2012-05-25 17:50:57,918 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src=\'#\'" /192.168.129.35:50010, dest: /192.168.40.16:3288, bytes: 895130, op: HDFS_READ, cliID: DFSClient_-1875022449, srvID: DS-1002949858-192.168.129.35-50010-1337839176422, blockid: blk_-3989731445395160971_1003 
  6. 2012-05-25 18:02:43,887 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Receiving block blk_-3335953923528359002_1004 src=\'#\'" /192.168.129.35:43677 dest: /192.168.129.35:50010 
  7. 2012-05-25 18:02:43,906 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src=\'#\'" /192.168.129.35:43677, dest: /192.168.129.35:50010, bytes: 8117, op: HDFS_WRITE, cliID: DFSClient_-1876464305, srvID: DS-1002949858-192.168.129.35-50010-1337839176422, blockid: blk_-3335953923528359002_1004 
  8. 2012-05-25 18:02:43,918 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: PacketResponder 0 for block blk_-3335953923528359002_1004 terminating 
  9. 2012-05-25 18:10:20,759 INFO org.apache.hadoop.hdfs.server.datanode.DataBlockScanner: Verification succeeded for blk_-3335953923528359002_1004 
  10. 2012-05-25 18:14:38,593 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src=\'#\'" /192.168.129.35:50010, dest: /192.168.40.16:3417, bytes: 8181, op: HDFS_READ, cliID: DFSClient_-677944339, srvID: DS-1002949858-192.168.129.35-50010-1337839176422, blockid: blk_-3335953923528359002_1004 
  11. 2012-05-25 18:14:38,985 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Receiving block blk_1243738109451377502_1005 src=\'#\'" /192.168.40.16:3418 dest: /192.168.129.35:50010 
  12. 2012-05-25 18:14:38,997 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src=\'#\'" /192.168.40.16:3418, dest: /192.168.129.35:50010, bytes: 8, op: HDFS_WRITE, cliID: DFSClient_-677944339, srvID: DS-1002949858-192.168.129.35-50010-1337839176422, blockid: blk_1243738109451377502_1005 
  13. 2012-05-25 18:14:38,997 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: PacketResponder 0 for block blk_1243738109451377502_1005 terminating 
  14. 2012-05-25 18:14:59,063 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src=\'#\'" /192.168.129.35:50010, dest: /192.168.40.16:3419, bytes: 12, op: HDFS_READ, cliID: DFSClient_-1875022449, srvID: DS-1002949858-192.168.129.35-50010-1337839176422, blockid: blk_1243738109451377502_1005 

 

secondarynode是和namenode进行通信,从而设置检查点以便namenode出故障后的恢复:

  
  
  
  
  1. 2012-05-25 18:05:04,619 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Number of transactions: 0 Total time for transactions(ms): 0Number of transactions batched in Syncs: 0 Number of syncs: 0 SyncTimes(ms): 0  
  2. 2012-05-25 18:05:04,626 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Downloaded file fsimage size 789 bytes. 
  3. 2012-05-25 18:05:04,626 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Downloaded file edits size 1261 bytes. 
  4. 2012-05-25 18:05:04,628 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: fsOwner=hadoop-user,hadoop-user 
  5. 2012-05-25 18:05:04,628 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: supergroup=supergroup 
  6. 2012-05-25 18:05:04,628 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: isPermissionEnabled=true 
  7. 2012-05-25 18:05:04,629 INFO org.apache.hadoop.hdfs.server.common.Storage: Number of files = 8 
  8. 2012-05-25 18:05:04,630 INFO org.apache.hadoop.hdfs.server.common.Storage: Number of files under construction = 0 
  9. 2012-05-25 18:05:04,633 INFO org.apache.hadoop.hdfs.server.common.Storage: Edits file /tmp/hadoop-hadoop-user/dfs/namesecondary/current/edits of size 1261 edits # 16 loaded in 0 seconds. 
  10. 2012-05-25 18:05:04,638 INFO org.apache.hadoop.hdfs.server.common.Storage: Image file of size 1208 saved in 0 seconds. 
  11. 2012-05-25 18:05:04,640 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Number of transactions: 0 Total time for transactions(ms): 0Number of transactions batched in Syncs: 0 Number of syncs: 0 SyncTimes(ms): 0  
  12. 2012-05-25 18:05:04,642 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Posted URL 0.0.0.0:50070putimage=1&port=50090&machine=192.168.129.35&token=-18:1535880146:0:1337940304000:1337936704022 
  13. 2012-05-25 18:05:04,660 WARN org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Checkpoint done. New Image Size: 1208 

 

你可能感兴趣的:(hadoop,运行过程分析)