在未来,Go语言能否撼动Java在Android、Hadoop大数据、云计算领域的地位?

Go语言已经在改变大数据计算技术了。在用C++编写的Mesos挑战Java编写的Hadoop之后,Google今年夏天开源了用Go写的Kubernetes。YARN、Mesos、Kubernetes的目标都是实现一个分布式操作系统,在此之上,大家可以相当容易地根据各自的问题,设计和开发独到的并行计算框架,而不是死板地将自己的问题套进MapReduce或者Spark来求解——MapReduce和Spark再好,也不能适合所有有价值的算法。Kubernetes是上述技术中最接近Google Borg的,也是唯一一个全面考虑了“大规模分布式系统执行前需要部署”、“执行后需要移除”、“执行过程中需要能有限制地访问本地资源”这三个核心问题的。


另一个例子是:对Zookeeper的不满导致了Go编写的etcd,而etcd早已是CoreOS的标配,在AWS和GCE上取代Zookeeper。之前在腾讯广告系统团队工作的时候,我们碰到的Zookeeper的问题是:如果读写操作频繁,则Zookeeper server很容易不堪重负。我们的workaround是:用C++写了一个proxy,定期load Zookeeper数据,代替Zookeeper处理读操作,把写操作proxy给后面的Zookeeper。几个月之前我来到湾区,看到很多美国公司也用了同样的办法。两周前见到Zookeeper目前的维护者,在Cloudera工作的Hongchao Deng同学,顺便问了这个问题。Hongchao解释这个问题是目前Zookeeper接到的反馈中最靠前的几个问题之一。但是修改起来不容易。


很多人聊到Java时讨论的是Java程序的执行效率很高。这个是真的。但是执行效率远不是分布式计算中最重要的指标。我在工作中体会到的重要指标有三:

网络通信效率。限制标准I/O库里逻辑层级数目,从而控制层级之间的buffering导致的传输效率底下问题,很重要。我猜测Java标准I/O库里逻辑层级多是Zookeeper效率问题的主要原因之一,具体情况有待验证。


内存效率。Garbage collection的效率永远是我们要努力追求的指标。


Dockerization的开销。大数据技术的部署不能通过桌面系统的package manager(比如apt-get),隔离也不能总是通过虚拟机(每个虚拟机要安装独立的操作系统,开销太大)。目前最高效的机群部署技术是Docker——Docker依赖的linux kernel中的cgroup系统调用,是Google工程师们于2002~2006年之间贡献的。如果我们的程序是Python或者Java写的,每个Docker container里要安装Python interpreter、JVM和标准库(哪怕我们的程序只用了标准库的一部分)。这样一个Docker container就要多消耗数百MB空间。一台物理机器如果执行一百个container,就要消耗几十GB空间。一个机群往往几十台到几千台机器,每个月底给Google和Amazon刷卡的时候,就知道心疼了。


以上三个问题里,我以为3.是最重要的。这也是为什么Go的设计者瞄准了“编译型语言,支持静态链接”这个目标。


著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:王益
链接:http://www.zhihu.com/question/26667707/answer/33972277
来源:知乎

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。