月度归档: 2014 年 12 月

  • 从Hadoop MapReduce到Spark

    Spark是一款通用集群计算框架,和Hadoop的MapReduce类似。由于其提供的抽象更简单,性能和功能上比Hadoop强不少。
    它已经越来越流行了。

    如果是新的项目,或者是为了学习,那么选择Spark完全没问题。

    不过对于一些使用了MapReduce的项目来说,迁移就稍微复杂一些了。

    Hadoop自身

    Hadoop的使用在不断扩大,但同时越来越多的实践证实了MapReduce并不是通用计算范例。

    Hadoop的架构本身为其他可能的替代方案提供了场所,比如Impala项目等等。

    而对于Hadoop来说,有一部分Hadoop的实现本身和MapReduce本身的抽象并不一致。

    • Mapper和Reducer总是使用键值对作为输入输出
    • Reducer处理的级别是键
    • Mapper和Reducer的对象的生命周期跨越了多个map()和reduce(),同时还支持了setup()和cleanup()

    Spark

    Spark也是众多替代方案中的一种。

    但是对于已经部署在生产环境的项目而言,一句替代方案是不够的,对于一些实时计算的系统更是这样。

    好在利用Spark实现类似MapReduce的模型是完全可行的。同时实现本身还可以更简单,并在大部分情况下更快。

    对于MapReduce模型本身,使用Spark来实现反而显得更亲近,毕竟Scala的编码风格和API对于本身源于LISP的MapReduce抽象更接近。

    键值对和元组

    从最基础的例子来看,如果需要计算一个大型文本文件每一行的长度,对于Hadoop MapReduce来说由于输出是键值对,那么就会使用长度作为键,以1为值。

    publicclass LineLengthMapper extends Mapper<LongWritable,Text,IntWritable,IntWritable> {
    protectedvoidmap(LongWritable lineNumber, Text line, Context context)
    throws IOException, InterruptedException {
    context.write(new IntWritable(line.getLength()),new IntWritable(1));
    }
    }

    LineLengthMapper…

  • 新的一个cn域名备案中

    昨天万网搞活动,送了一张20元代金券,算下来com和cn域名首年购买都是29元。

    之前有个网站做的很简陋,但是流量出奇的不错。

    最近也在用Grails做东西,正好整理一下,做个新网站出来。

    选来选去还是买了cn域名,cn域名需要上传身份证做实名认证,昨天上传,今天就审核完成了。

    备案自然是在阿里云上,流程走过了一次自然觉得简单了不少,不过没想到的是cn备案需要邮寄资料…

    所以域名的选择还是com为好呀。…

  • Grails生成war包过大的问题

    最近在用Grails,确实体验了一把快速开发的乐趣。

    Grails从名字上看就有点Rails的感觉,使用的很多细节也是。

    快速创建项目,完整的测试框架,完善的插件体系,大部分东西都能够快速实现。

    完成开发以后生成war包,部署到容器上就行了。

    因为要把项目放到生产环境了,看了一下war包的大小,居然有40M+。

    为什么包这么大

    一个war包如此之大,确实惊悚了。因为项目本身并没有太多东西,实在不应该这么大。

    直接拆开war包,主要的集中在assets目录和WEB-INF目录。

    前者是资源目录,包括css,js和png等等。后者主要包含了lib。

    前者的问题好解决,因为用了bower,所以下载的目录中有很多不是必须的东西。

    而后者问题就比较麻烦了。Grails很方便了,集成了很多东西,比如GORM作为数据持久层上依赖了Hibernate,光lib的大小就是5M。

    而且还有一些包明显不应该打在包里面,比如tomcat-embed.jar。

    加快发布

    自己机器上开发当然没有问题,大就大呗,但是这么大一个war包放在服务器上就有点吓人了。

    首先是发布上的问题,这么大的一个包,远程部署过去实在耽误时间。

    对于第一个asserts目录,直接在打包时exclude不需要的东西就是了,也节约不了多少东西。

    对于第二个WEB-INF目录,可以操作的地方就多了。首先移除不需要的东西,可以节约10M左右。这样打包下来还是有30M左右。

    首先在Config.groovy中配置

    defdeps = [
    "hibernate3.jar",
    "groovy-all-*.jar",
    "standard-${servletVersion}.jar",
    "jstl-${servletVersion}.jar",
    "oscache-*.jar",
    "commons-logging-*.jar",
    "sitemesh-*.jar",
    "spring-*.jar",
    "log4j-*.jar",
    "ognl-*.jar",
    "commons-*.jar",
    "xstream-1.2.1.jar",
    "xpp3_min-1.1.3.4.O.jar" ]
    grails.war.dependencies = {
    
    …
  • 备案完成

    备案完成

    今天上午十点的时候收到的管所的短信通知,提示备案通过。

    大约一个小时以后博客就可以正常访问了。

    备案从8号开始,一直到今天24号,总共耗时16天。

    这其中不得不赞一下阿里云的服务,备案的审核只要在阿里云那边的都是一天过。

    其中照相的时候还邮寄了幕布,中午发出,第二天就到了,照了相,当天下午就提交管所了。

    备案时间

    这十几天的闭站的损失没有想象中那么大。主要是DNS那边支持针对搜索引擎做专门的处理,所以对于蜘蛛来说网站还是原来的地址,原来的内容。

    只是正常的用户访问受到了影响。

    当然,现在的速度那是极快的,360监控给出的数据如下:

    网站响应速度

    而之前的速度一直是2000毫秒以上。…

  • 准备开始备案

    前思后想,还是决定给博客备个案,重新移动到国内服务器上。

    选用的阿里云,售前客服也很靠谱的感觉,唯一不爽的就是首次备案需要闭站。

    我觉得今天晚些时候就会暂时关闭博客,希望备案不会花太久时间。…

  • 简洁的Formula

    之前为Homebrew添加了一个Moco的Formula,提交PR以后一直没有回应,还以为项目组不接受这个提交呢。

    今天收到提示已经merge了,代码也作为一些修改,感觉代码好了不少。

    其实这个Formula是我第一个写ruby,基本是边看边学,感觉需要了解的还很多。

    require

    Ruby中的require和java的import很像,可以加在标准类库里面的文件,当然也可以是已安装的gems文件。

    因为测试中使用了ruby的http库,所以我把require写在文件开头

    require"formula"
    require'net/http'

    而McQuaid修改后将http的引用移动到测试中

    testdo
    require"net/http"

    字符串

    因为moco的启动会有一个端口,我用一个变量表示,然后直接拼接

    actualResponse=Net::HTTP.get(URI('http://localhost:'+port.to_s))

    修改以后直接用占位符表示

    response =Net::HTTP.getURI"http://localhost:#{port}"

    断言

    因为返回的结果需要判断,我使用的是if判断,不相符直接报错

    if(actualResponse!='Hello, Moco')
    onoe"Error! The response is not right."
    end

    可以直接用一句话操作

    assert_equal"Hello, Moco", response

    参考

    修改前
    修改后…