关于现有分布式计算框架的一种补充

背景:

         前些天笔者面临这样一个问题,在hdfs上有一个目录存放着一些文件,定期要通过mr的api将这些文件转换为HBase的HFile。但是文件中可能会存在一些可以检测出来的脏数据,现在希望能够在生成HFile的同时,统计每次任务脏数据的比例,超过一定阈值的时候就发告警。


现有框架的处理方法与问题:

MR:

         将生成HFile与统计脏数据视为两个MR任务,分别计算,两次提交。


Spark:

         按照如下RDD血缘图,cache RDD1,并进行两次计算分别得到RDD2与RDD3,然后在将两个衍生出来的子RDD持久化到HDFS之类的存储系统上。


使用Spark计算


通过MR处理,HDFS上的文件将被读取两次,虽然在Spark的计算模型中,可以通过cache方法,将数据尽可能的放在内存中,但是在转化为RDD2与RDD3的过程中仍然会有两次内存IO(当然很有可能因为内存存不下,成为了磁盘IO)。哪种IO相对于CPU而言都慢了不止一个级别,因此能不能有一种方法像下面的图这样,将两种运算在上游放在一起(在一个map中同时统计脏数据与生成HBase的Cell),将不同的结果发送给不同的下游呢?


将Cell与rowcounter发给不同的reducer

这样一来,两次不同的下游计算(往往是Reduce或者子RDD),可以绑定同一个上游计算(往往是Map或者父RDD),而上游计算又只会有一次IO。但是现有的计算框架,好像都不支持一个上游运算与多个下游运算绑定。

 

自己想到的解决办法:

下面以MR运算框架为例,谈谈自己的解决办法。现在的MR框架中,input dir、output dir与shuffle context是与一个job绑定的;我们可以将input dir与map绑定,output dir 和shuffle context与reduce绑定.

         将现有map端的api修改为如下形式:

修改前(对应现在的Mapper类):

void map(KEYIN key, VALUEIN value, Context context);

void run(Context context);

void cleanup(Context context);

void setup(Context context)


修改后(不妨叫这个类为NewMapper):

void map(KEYIN key, VALUEIN value, List reduceContexts);

void run(Context context);

void cleanup(Context context);

void setup(Context context)


像笔者提到的问题可以用如下伪代码解决

public class CombinedMapper extendsNewMapper {

         privateint dirtyrows = 0;

         privateint totalrows = 0;

         privateList reduceContexts = null;


         void map(KEYIN key, VALUEIN value, List reduceContexts ) {

                   totalrows++;

                   if(dirtyrow(key)) {

                            dirtyrows++;

                            //脏数据就直接过滤了

                            return;

                    }

                   contextForHFile.write(*******);

        }


         void setup(Context context) {

                   reduceContexts= context.getReduceContexts();

                   contextForHFile  = reduceContexts.getContextForHFile();

                   contextForCounter= reduceContexts.getContextForCounter();

         }


         void run(Context context) {

             setup(context);

             while (context.nextKeyValue()) {

                   map(context.getCurrentKey(),context.getCurrentValue(), reduceContexts);

             }

             contextForCounter.write(****);

             cleanup(context);

       }


}


Reducer端的代码无需任何改动,只是在初始化job的时候可能需要按照如下方法初始化job

job.addReducer(ReducerClass1.class).addReducer(ReducerClass2.class);

OutputFormat.setOutputdir(Reducer1.class,outputdir1);

OutputFormat.setOutputdir(Reducer2.class,outputdir2);

表示上游计算绑定多个下游计算。这样一来,可以在一次IO中完成两种不同的运算。


缺点:

         笔者设计的对现有计算框架的补充,虽然可以减少IO,比如现在的场景是要对一个很大的数据集用两种完全不同的方法做分析,肯定是大有裨益的。但是缺点也是很明显的,那就是耦合度变大,上游的一个子模块失败可能影响整体计算,比如上面生成HFile的任务如果导致Map程序不能跑通就会导致统计脏数据的任务也失败。

可是耦合这种东西可能真的是“过犹不及”吧,一个零耦合的东西既没有存在的必要也没有存在的可能。而且笔者的意思并不是修改现有的计算框架api,而是增加一种api来支持想减少IO的场景,以前的代码是完全不用修改的。


后续:

         从MR的观点来看,笔者做的补充可以说是让一个任务支持多种Reduce,但是其实MR计算框架对多种Map的支持也不是很好,比如我现在想同时处理TXT文件与parquet文件再生成HFile。但是spark可以通过像下图的做法,对不同的RDD做不同的transformation然后再将新的RDD做union来支持“一个任务,多种Map”。也许将来也可以通过类似的办法让一个MR任务支持多个Map输入吧。


一个任务,多种Map
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容