2011-12-26

cdc 全表比较 hadoop


Google 云计算平台的关键技术分别是GFSMapReduce BigT albe, Hadoop 是与Google 云平台关键技术的开源实现其中, Hadoop MapReduce 也是一种典型的并行开源云计算模型.此章节讲述利用MapReduceBigTable原理实现半结构化数据的完全差异比较。
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBaseGoogle Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。
关键伪代码如下:
public class CompletelyCompare {
     int version=0//存储数据的版本号
 int keyspositon[]=getPosition();
 private final static IntWritable insert = new IntWritable(1);
 private final static IntWritable update= new IntWritable(2);
         public static class Map extends Mapper {
         private final static IntWritable one = new IntWritable(1);
         private Text word = new Text();
         public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
           String line[] = value.toString().split('\n');// 将文本分解为若干行
           if(version==0){
   for(int i=0;i
   String[] data=line.split();//将此行的数据由字符串转化为数组
   String[] keys=getkeys(data,keyspositon);//获得行的关键字
   saveLine(domd5(value),domd5(keys),data);// 存储的HBASE,Md5值作为关键字
   context.write(new Text(value), insert);// 输出到reduce工作流
       
   }
   }
   else{
   for(int i=0;i
   String[] data=line.split();//将此行的数据由字符串转化为数组
   String[] keys=getkeys(data,keyspositon);//获得行的关键字
   String totalMd5=domd5(date);
   String keyMd5=domd5(keys);
   if(!checkExist(totalMd5)){//如果全局md5值不存在,则进一步检验主键的md5
      if(checkExist(keyMd5)){
    updateLine(totalMd5,line)//如果主键md5的值存在,在为更新操作
context.write(new Text(value), update)
  }
  else{//否则为插入操作
  saveline(totalMd5,keyMd5,line)
  context.write(new Text(value), insert)}
   }
}
 }
 } 
           
    public static class Reduce extends Reducer {
   
       public void reduce(Text key, Iterable values, Context context) 
         throws IOException, InterruptedException {
           StringBuffer result=new StringBuffer();
   
     for (IntWritable val : values) {//根据key值遍历所有由map工作发布过来的数据
               result.append(val.get());}
           context.write(key, new Text(result));//输出数据,由ETL系统调用
       }
    }
    }