流行的开源软件和技术

前言javascript

笔者也是在互联网软件行业里面摸爬滚打十年多了,回头想一想青葱岁月,不少时间都花在各类技术热潮的追逐上,有些是有价值的,也有些由于没人指导走过弯路,下面我就把我本身接触到这么多优秀的开源软件给你们作个梳理。也许比较枯燥无聊,供你们之后查阅。 php


LAMP

属于创业公司的最经典组合。前端

 

Linux不用说,大多数公司都用这个,随着虚拟机愈来愈成熟,你们喜欢建立虚拟的Image,来提供某个Linux版本,我接触过一些经常使用的,Ubuntu,Redhat,Debian, Gentoo, CentOS, Federo,OpenSuse。java

 

Apache最著名的web server,Apache也是开源最活跃的社区,很是成熟的web服务器,有段时间被性能卓越的Nginx赶超,但目前稳定性和模块成熟度仍是最高,广受好评。有人比较这二者的差别:Nginx vs Apache。python

 

PHP当时不少网站用Java写的,php提出就是为了简化网站开发,为web而写。Facebook早年也是PHP写的,是很灵活的脚本语言,Coursera以前也是用Php搭建的,但倒是很难维护,主要问题是每一个人均可以写一个小框架,编程风格随便,难统一。除了Facebook他们花了大量人力去完善,基本上重写了Php,底层加速成C++,也发明了新语言Hack。程序员

 

MySQL经典开源数据库,被Oracle收购,Facebook, Baidu, Taobao都是大量基于MySQL作出很是稳定靠谱的系统。我记得Pinterest也总结过他们为何用MySQL提升他们的规模。web

 

编程语言:

有个笑话,让程序员打架的一个最有效的方式是去讨论区问你们那种编程语言最好,这就会没完没了的讨论。大体分红C++派,Java派,Python等脚本派。面试

 

C/C++可能不少人入门都是啃着谭浩强的C程序设计,这种语言很强大,既高性能,又灵活(指针,地址,二维指针,指针数组),名词特别多(多态,重载,重用,范型,模板类,元编程),坑也特别多,容易形成内存泄露,野指针,在大学里面吃了很多苦头,疯狂看各类C++经典,秘籍,后来去了创业公司和百度都是大量使用,里面也不少人玩的如火纯青,面试时候常常出个写个线程安全的C++单例模式,析构可否多态或者什么写个调用顺序,让面试者骚手挠腮,欲罢不能,想一想本身也折磨过这些面试者,真是罪过啊。算法

 

这几年视野广了,不接触C++了,回过头来看仍是以为当年有些走火入魔,不必本身折磨本身。sql

 

Java:估计是目前用的最广的项目语言,容易上手,概念简单,无数的库,大量的代码。我就很少介绍了,我本身也是大半的项目用Java写的。缺点时配置比较烦,不少什么XML,Config,适合写服务端。

 

LUA:大量应用在大型游戏的脚本语言,主要是高性能,语言规范精简、运行时库小,与C/C++交互方便,我在百度作云计算平台时候也是用它做为嵌入式脚本。

 

Python:跟Perl, PHP,合成3P语言,都是脚本:) 很是方便实用,初学编程就能够拿它练习,有不少方便的库,好比urlib, beautifulsoap。有句话说:人生苦短 我用Python。作数据分析的有个超好的工具叫iPython,它是结合在线notebook,能够交互式编程,很是爽。听说Python的创始人在Dropbox,当年他简历就一句话,说I wrote Python. 在面试Google时候还被一些人误会,想会python算个啥,但人家是做者。有一本书《集体智慧编程》用Python做为实践作机器学习,推荐给你们。

 

GO:Google开源的语言,比C++容易上手,却有类似的性能,不少从Google出来的人喜欢,听说Square, Pinterest就在用。Go语言有哪些好处,谁用谁知道,为何要使用 Go 语言,Go 语言的优点在哪里?

 

Scala:各类集大成,面向对象,函数式编程,面向过程。我目前也在学习,东西实在太多,Coursera上面有Scala做者的一门课(https://www.coursera.org/course/progfun)公司技术部也主推这种语言,这也是为啥咱们墙上员工证书中最多就是Scala这门课的。另外著名的Spark,Kafka也是Scala写的,确实在高性能,高并发上面表现不错,又保持了优雅精炼的写法。值得玩味。

 

Javascript:原本这是个前端客户端的动态语言,作一些页面特效,主要特色是自然支持异步,又跨平台,弱类型,比较安全 (有sandbox),有人把它拓展到后台,随着V8,Node.js, Angular出现也显得愈来愈厉害了。


还有一些语言,Ruby,R,Object-C, Swift,Matlab, Perl, SQL, D, Lisp就是偶尔用了,有个TIOBE编程语言排名。

 

J2EE 三剑客:

Java出来以后,为了提升大规模网站的开发效率,提出了不少框架,最经典就是分层J2EE, 在企业级,如银行系统大量使用,什么servlet,java bean,EJB,RMI,JMS, JSP,JNDI,JDBC,容器,管道,数据库链接池,当时最火的就是什么Java架构师,年薪百万啊有木有。那固然通常人玩不会了,后来出现了轻量级的MVC解耦合分层结构,在本科时候常常作管理系统,就使用这种轻量级J2EE框架,搭系统。里面重要3个组件:

 

  • Hibernate:数据持久框架,ORM,对数据库的CRUD操做进行对象化映射。

  •  Spring MVC:中的控制层,但容易形成Config的泛滥,后来Linkedin中起了个项目就叫Kill Spring,改为下面提到的Rest.Li。

  •  Struts:View层,有不少tag库能够选择,有个JSTL 标签能够搭配选择。

 

Web 服务器

 Lighttpd:当时在百度我就是把它做为云平台(Baidu App Engine)的服务器。为了完全搞懂它,我真的看了它全部的源代码,代码很精炼,大概5w行,又研读了全部它的maillist,jira上面的进度,还给开源社区打了补丁。感受就像武林高手修炼同样。

 

Nginx:高性能web服务器,异步,C10K (意思是单机同时维持一万的链接)杰出表明。俄国人写的,代码可读性不如上面的,但确实功能更强大些。

 

Tomcat/Jetty:Java J2EE容器,常常用的,我记得当时最喜欢看到配置成功后,页面显示的小猫图案。在Linkedin,这两个都用。一个用来作前端服务器,一个用来作后端。 


框架

Rest.li:RESTful是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。使用HTTP协议中的请求方法来对应后端操做数据时候的增删添改(CRUD)。LinkedIn提出Rest.Li编程框架,是一款REST+JSON框架,使用动态发现和简单的异步API便可构建健壮可伸缩的服务架构体系。

 

Thrift:Apache Thrift 是Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。

 

ProtoBuf:Google提出的跟上面很像,用来序列化结构化数据的技术,支持多种语言持久化数据或者序列化成网络传输。

 

CloudStack:cloud computing框架。

 

Helix:通用的集群管理框架,Linkedin出品。 


前端技术

其实前端我接触的并很少,但如今不是提倡Full Stack全栈工程师嘛。若是你掌握下面的会让你如鱼得水,不须要被UI,UE人员优先级而影响。

 

Ruby on Rails:在web2.0时代,RoR一会儿得到不少创业公司的青睐,开发者将Rails做为一个框架来建立数据库支持的Web应用,它自己是一个完整的解决方案,经过默认的标准实践(convention)能够很大的加快开发效率,无缝的整合全部子组件以提供给开发者一个统一的接口。当时Twitter早期也是用这个框架写的,但这个也是双刃剑,在性能和内部机制上很难调节。

 

Django:Python的前端管理框架,直接生成管理页面。有人常常那上面的做为PK,相比于 Django、Pylon 等 Python 框架,Ruby on Rails 是否有很大的技术优点?

 

Smarty:PHP的一种模板语言,很容易上手。

 

BootstrapTwitter提出的HTML,CSS和JS框架,让你的web app容易适配到各类平台,好比手机上。

 

JQueryJavascript的最流行的库,能够作一些Ajax调用。

 

HTML5就是下一代的HTML标准,增长了一些兼容的便签,使得在手机和浏览器中阅读效果一致。对应的是Native APP,就是原生的从底层开始写的APP。当年Facebook是走HTML5的路,发现不对劲,性能不好,体验糟糕。赶忙转变成Native APP才让它从新赢得市场。

 

Node.jsjs写的后端服务器,处理高并发场景性能佳,使用 Node.js 的优点和劣势都有哪些? 特别适合移动的服务器端。 Socket.IO是其中一个组件,为了在浏览器和移动设备上建立实时应用而产生的,它能够模糊不一样传输机制之间的差别。

 

D3各类可视化的效果,确实很是酷。


Impress.js基于CSS3转换和过渡、工做于现代浏览器、并受prezi.com的理念启发的演示工具。

 

Backbone.js前端的MVC,为复杂Javascript应用程序提供模型(models)、集合(collections)、视图(views)的结构。 


搜索

Nutch是一个开源Java 实现的搜索引擎,当时Hadoop的前身就是为了作这个项目。


Lucene基于Java的全文检索引擎,颇有名也很是强大,elasticsearch就是基于这个开源基础二次开发。


Solr基于Lucene的XML接口的独立运行的搜索服务器。经过HTTP协议以XML格式将文档放入搜索服务器(索引),GET来查询搜索服务器获得结果。

 

SphinxSphinx是一个基于SQL的全文检索引擎,能够结合MySQL,PostgreSQL作全文搜索,它能够提供比数据库自己更专业的搜索功能。反正比MySQL内置的全文检索要快不少。 


Hadoop生态系统

这一块关注过好久了,目前不少很成熟的组件。这是一张生态图,我大多数都在本文中介绍过了,主要的组件都是为了方便你们从底层的MapReduce模型中脱离出来,用高层语言来作分布式计算。

 

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化数据集群。像Facebook,都拿它作大型实时应用。(可参考文章Facebook's New Realtime Analytics System: HBase to Process 20 Billion Events Per Day)

 

PigYahoo开发的,并行地执行数据流处理的引擎,它包含了一种脚本语言,称为Pig Latin,用来描述这些数据流。Pig Latin自己提供了许多传统的数据操做,同时容许用户本身开发一些自定义函数用来读取、处理和写数据。在LinkedIn也是大量使用。

 

HiveFacebook领导的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,能够将sql语句转换为MapReduce任务进行运行。其优势是学习成本低,能够经过类SQL语句快速实现简单的MapReduce统计。像一些data scientist 就能够直接查询,不须要学习其余编程接口。

 

Cascading/ScaldingCascading是Twitter收购的一个公司技术,主要是提供数据管道的一些抽象接口,而后又推出了基于Cascading的Scala版本就叫Scalding。Coursera是用Scalding做为MapReduce的编程接口放在Amazon的EMR运行。

 

Zookeeper一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。

 

Oozie一个基于工做流引擎的开源框架。由Cloudera公司贡献给Apache的,它可以提供对Hadoop MapReduce和Pig Jobs的任务调度与协调。

 

Azkaban跟上面很像,Linkedin开源的面向Hadoop的开源工做流系统,提供了相似于cron 的管理任务。

 

TezHortonworks主推的优化MapReduce执行引擎,与MapReduce相比较,Tez在性能方面更加出色。

数据存储(NoSQL)

当时为了解决Scale的问题,伴随分布式系统发展,造成各个NoSQL软件,百花齐放。下面介绍常见的一些:


Memcached是高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它经过在内存中缓存数据和对象来减小读取数据库的次数,从而提升动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。性能瓶颈第一个就要想到用这个。有点万金油的感受。

 

Redis一个key-value存储系统。和Memcached相似,它支持存储的value类型相对更多。

 

Cassandra名称来源于希腊神话,是特洛伊的一位悲剧性的女先知的名字。最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的彻底分布式架构于一身,可扩展型和性能都不错,Coursera也是大量使用做为数据对象存储。

 

Berkeley DB文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库相似,它提供的是一系列直接访问数据库的函数。以后被Oracle收购了。

 

CouchBase文档型数据库,由CouchOne与Membase合并,以后的公司叫作Couchbase,功能仍是挺强大的,自动备份,自动分片,在Linkedin广告组和运维部门都大力推荐。

 

RocksDB比LevelDB更彪悍的引擎,代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。

 

LevelDBGoogle开发的,一个速度很是块的KV存储库(storage library),它支持字符串的key与value,而且这种映射关系按key排序(ordered mapping)

 

MongoDB一个基于分布式文件存储的数据库。为WEB应用提供可扩展的高性能数据存储解决方案。 介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构很是松散,是相似json的bson格式,所以能够存储比较复杂的数据类型。

 

有一些基于各类NoSQL 特性和性能的比较,可参考文章:

Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Couchbase vs Hypertable vs ElasticSearch vs Accumulo vs VoltDB vs Scalaris comparison;

Benchmarking LevelDB vs. RocksDB vs. HyperLevelDB vs. LMDB Performance for InfluxDB。

 

下面几个都是Linkedin开源的数据技术 Projects | LinkedIn Data Team

 

VoldemortNoSQL 键/值存储引擎,彻底是分布式且去中心化的,支持分区与容错。

 

Espresso文档型NoSQL数据存储系统,MySQL做为底层数据存储,具备高性能、高扩展性、支持事务、容错能力等重要特征。

 

Databus实时低延迟数据抓取系统

 

AMP Lab三剑客

AMP Lab 是Berkeley的一个王牌实验室,聚集系统,数据库,机器学习,各个领域的教授和丰富工业经验的学生,它们作出了不少有意思获得工业界承认的技术。


Mesos一个分布式环境的资源管理平台,它使得Hadoop、MPI、Spark做业在统一资源管理环境下执行。它对Hadoop2.0支持很好。Twitter,Coursera都在使用。


Spark已经成为Apache的顶级项目了,2014年的当红炸子鸡,我在这个帖子里面也介绍的比较全面了。Spark,它们也成立公司Databricks对cloud管理进行产品化。


Tachyon是一个高容错的分布式文件系统,容许文件之内存的速度在集群框架中进行可靠的共享,就像Spark和MapReduce那样。有幸跟项目发起人李浩源聊过几回,这个项目目前发展很是快,甚至比Spark当时还要惊人。目前到0.6版本,参与开源的规模和版本迭代速度都很快。

 

先进大数据技术:流式,实时

因为Hadoop的火红,整个业界都在喋喋不休地谈论大数据。Hadoop的高吞吐,海量数据处理的能力使得人们能够方便地处理海量数据。可是,Hadoop的缺点也和它的优势一样鲜明——延迟大,响应缓慢,运维复杂。

 

Storm所谓流处理框架,就是一种分布式、高容错的实时计算系统。Storm令持续不断的流计算变得容易。常常用于在实时分析、在线机器学习、持续计算、分布式远程调用和ETL等领域。Twitter是他们的主推。

 

Kafka是Linkedin开源的一种分布式发布-订阅消息系统,它主要用于处理活跃的流式数据。我面试过不少硅谷创业公司都在使用,好比最重要的用户Tracking数据。LinkedIn的开发者也出来成立公司Confluent,最新发布platform

 

Samza一个分布式流处理框架,专用于实时数据的处理,很是像Twitter的流处理系统Storm,LinkedIn开源了这项技术。跟上面的几个技术就能够比较一下了,streaming big data storm, spark and samza

 

SummingBird将批处理和流处理无缝链接,经过整合批处理与流处理来减小它们之间的转换开销。把上面的Storm跟Scalding结合起来,所谓Lambda Architecture。跟这个相关组件是Algebird: 利用一些几率算法HyperLogLog来提升计算速度。

 

Drill先说Dremel,是Google 的“交互式”数据分析系统。能够组建成规模上千的集群,处理PB级别的数据。MapReduce处理一个数据,须要分钟级的时间。Dremel将处理时间缩短到秒级。Apache推出Dremel的开源实现Drill。

 

Druid在大数据集之上作实时统计分析而设计的开源数据存储。这个系统集合了一个面向列存储的层,一个分布式、shared-nothing的架构,和一个高级的索引结构,来达成在秒级之内对十亿行级别的表进行任意的探索分析。

 

ImpalaCloudera公司主导开发的新型查询系统,它提供SQL语义,可以查询存储在Hadoop的HDFS和HBase中的PB级大数据,号称比Hive快5-10倍,但最近被Spark的风头给罩住了,你们仍是更倾向于后者。

 

Spark Streaming创建在Spark上的应用框架,利用Spark的底层框架做为其执行基础,并在其上构建了DStream的行为抽象。利用DStream所提供的api,用户能够在数据流上实时进行count,join,aggregate等操做。

 

Spark SQL以前Spark相似Hive的工具称为Shark,如今新替代就是Spark SQL, Big Data Benchmark里面也跟Impala性能比较。 


工具类:

Make不少同窗在学校时候,认为编程就是在编辑器里面运行,当离开了IDE,他们就不知道该怎么办。C语言的打包工具,好比解析依赖,生成二进制和可执行程序。

 

AntJava的传统打包工具,须要写个build.xml

 

Gradle新一代的编译构建工具,结合ivy自动匹配和下载官方稳定版本。

 

Maven同上,有个比较Java构建工具:Ant vs Maven vs Gradle

 

Homebrew最近几年都用Mac平台,那么包的管理能够用这个。

 

Eclipse使用最普遍的IDE,著名的日蚀标识。它的出现就是吃掉SUN(Java诞生地),我大多时间用这个,后来也用过Intellij 不过是商业版本的。跟Eclipse相比,管理大型代码库时候速度快。

 

Docker做为一种新兴的虚拟化方式,Docker容器的启动能够在秒级实现,这相比传统的虚拟机方式要快得多,运行时所需的资源比虚拟机少,而效率又比虚拟机高提供隔离的执行环境。算是2014年上升最快的一个工具了。

 

JUnitjava的单元测试,属于测试驱动的利器。

 

Git强大的分布式代码版本管理,Linux那么多分支都没乱正是它的功劳。但仍是挺复杂,一大堆命令比SVN要多多了。目前GitHub 就是最大的源码管理平台,咱们公司也用它的企业版。有个结合Git和代码审查的工具由Facebook开发,Phabricator


SVN简化的代码管理,还有perforce Amazon和Google也用。最老的是CVS估计如今没人用了呃。 


浏览器:

Firefox开源浏览器,当时靠丰富插件很强大,就靠Google的默认搜索来维持,但Google也开发了Chrome,给Firefox市场份额极大打击。所谓成也Google,败也Google。这个组织是Mozilla,就跟Coursera是邻居。我当时用过不少插件,好比proxy,去除广告,Firebug来调试,还有什么换皮肤,监控网络流量等。

 

Webkit自从苹果开源了这么好的内核引擎,Google就就直接用它开发了Chrome。当时作信息抽取,有一种办法是基于视觉的信息提取,VIPS算法,若是经过webkit,就能够拿到正文的一些具体坐标和字体颜色大小,而后再分块肯定重点内容作提取。

 

Spidermonkey就是Mozilla旗下的一个JS解析引擎,我用这个是由于当时为了抓取网页,一些很变态的网站好比水木社区:( 把内容写在javascript里面,都是用字符串拼接起来,我为了获取完整的源码就要涉及到JS的解析。

 

V8Google 的一个开源项目,是一个高效的JavaScript 引擎,像Node.js基于Google V8提供了基于事件的I/O处理。

 

参考资料:

这7个开源技术支撑起整个互联网时代

The Architecture of Open Source Applications

The Top 11 Hottest GitHub Projects Right Now

做者介绍  董飞

  • 【DBA+社群】原创专家

  • 现任职Linkedin资深工程师,前后就任于创业公司酷迅、百度基础架构组、Amazon云计算部门

  • 在大数据领域深刻研究多年,涉及Hadoop调优、分布式框架、Data Pipeline、实时系统等

相关文章
相关标签/搜索