淘宝Fourinone介绍及与Hadoop的性能PK

Posted by & filed under Study & Reading.

FourInOne(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架之前,我对分布式计算进行了长时间的思考,也看了老外写的其他开源框架,当我们把复杂的hadoop当作一门学科学习时,似乎忘记了我们想解决问题的初衷:我们仅仅是想写个程序把几台甚至更多的机器一起用起来计算,把更多的cpu和内存利用上,来解决我们数量大和计算复杂的问题,当然这个过程中要考虑到分布式的协同和故障处理。如果仅仅是为了实现这个简单的初衷,为什么一切会那么复杂,我觉的自己可以写一个更简单的东西,它不需要过度设计,只需要看上去更酷一点,更小巧一点,功能更强一点。于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。 fourinone-1.11.09 hadoop-0.21.0 体积 82K 71M 依赖关系 就一个jar,没有依赖 约12项jar包依赖 配置 就一个配置文件 较多配置文件和复杂属性 集群搭建 简单,每台机器放一个jar和配置文件 复杂,需要linux操作基础和ssh等复杂配置,还需要较多配置文件配置 计算模式 提供两种计算模式:包工头和工人直接交互方式,包工头和工人通过消息中枢方式交互,后者不需要工人节点可直接访问 计算更多倾向于文件数据的并行读取,而非计算过程的设计。JobTracke 跟TaskTracker直接交互, 查询NameNode后,TaskTracker直接从Datanode获取数据。 并行模式 N*N,支持单机并行,也支持多机并行,多机多实例并行 1*N,不支持单机并行,只支持多机单实例并行 内存方式 支持内存方式设计和开发应用,并内置完整的分布式缓存功能 以hdfs文件方式进行数据处理,内存方式计算支持很弱 文件方式 自带文件适配器处理io Hdfs处理文件io 计算数据要求 任意数据格式和任意数据来源,包括来自数据库,分布式文件,分布式缓存等 Hdfs内的文件数据,多倾向于带换行符的数据 调度角色 包工头,可以有多个,支持链式处理,也支持大包工头对小包工头的调度 JobTracke,通常与NameNode一起 任务执行角色 农民工,框架支持设计多种类型的工人用于拆分或者合并任务 TaskTracker,通常与Datanode一起 中间结果数据保存 手工仓库,或者其他任意数据库存储设备 Hdfs中间结果文件 拆分策略 自由设计,框架提供链式处理对于大的业务场景进行环节拆分数据的存储和计算拆分根据业务场景自定义 以64m为拆分进行存储,以行为拆分进行计算 实现map接口,按行处理数据进行计算 合并策略 自由设计,框架提供农民工节点之间的合并接口,可以互相交互设计合并策略,也可以通过包工头进行合并 TaskTracker不透明,较少提供程序控制,合并策略设计复杂 实现reduce接口进行中间数据合并逻辑实现 内存耗用 无需要制定JVM内存,按默认即可,根据计算要求考虑是否增加JVM内存 需要制定JVM内存,每个进程默认1G,常常namenode,jobtracker等启动3个进程,耗用3G内存 监控 框架提供多环节链式处理设计支持监控过程,通过可编程的监控方式,给于业务开发方最大灵活的监控需求实现,为追求高性能不输出大量系统监控log 输出较多的系统监控log,如map和reduce百分比等,但是会牺牲性能,业务监控需要自己实现 打包部署 脚本工具… Read more »

TF-IDF及文本相似性度量

Posted by & filed under Excellence Article.

TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,互联网上的搜寻引擎还会使用基 于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。 在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被正规化,以防止它偏向长的文件。(同一个词语在长文件里可能会 比短文件有更高的词频,而不管该词语重要与否。)对于在某一特定文件里的词语 ti 来说,它的重要性可表示为: 以上式子中 ni,j 是该词在文件dj中的出现次数,而分 母则是在文件dj中所有字词的出现次数 之和。 逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到: 其中 |D|:语料库中的文件总数 : 包含词语ti的文件数目(即的 文件数目) 然后 某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词 语,保留重要的词语。 =================文本相似性度量======================= 方法一:向量空间模型 在向量空间模型中,文本泛指各种机器可读的记录。用D(Document)表示,特征项(Term,用t表示)是指出现在文档D中且能够代表该文档内容的 基本语言单位,主要是由词或者短语构成,文本可以用特征项集表示为D(T1,T2,…,Tn),其中Tk是特征项,1<=k<=N。例如一篇 文档中有a、b、c、d四个特征项,那么这篇文档就可以表示为D(a,b,c,d)。对含有n个特征项的文本而言,通常会给每个特征项赋予一定的权重表示 其重要程度。即D=D(T1,W1;T2,W2;…,Tn,Wn),简记为D=D(W1,W2,…,Wn),我们把它叫做文本D的向量表示。其中Wk是 Tk的权重,1<=k<=N。在上面那个例子中,假设a、b、c、d的权重分别为30,20,20,10,那么该文本的向量表示为 D(30,20,20,10)。在向量空间模型中,两个文本D1和D2之间的内容相关度Sim(D1,D2)常用向量之间夹角的余弦值表示,公式为: 其 中,W1k、W2k分别表示文本D1和D2第K个特征项的权值,1<=k<=N。 在自动归类中,我们可以利用类似的方法来计算待归类 文档和某类目的相关度。例如文本D1的特征项为a,b,c,d,权值分别为30,20,20,10,类目C1的特征项为a,c,d,e,权值分别为 40,30,20,10,则D1的向量表示为D1(30,20,20,10,0),C1的向量表示为C1(40,0,30,20,10),则根据上式计算 出来的文本D1与类目C1相关度是0.86 方法二:字符串相似度 对于象字符串计算相似度的算法有很多,常用的有最大公共字串,编辑距离等。 编辑距离就是用来计算从原串(s)转换到目标串(t)所需要的最少的插入,删除和替换的数目,在NLP中应用比较广泛,如一些评测方法中就用到了 (wer,mWer等),同时也常用来计算你对原文本所作的改动数。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫 Levenshtein Distance。

2011年总结

Posted by & filed under Life Diary.

忙了一年,终于可以休息下了,2011年对工作上的总结就是“忙”,上半年还好,下半年忙得吐血,每次报销打车票的时候,才看到原来自己两个月里有80%以上的时间都是晚上10店以后回家的,甚至有几次凌晨回家,9点又到公司的记录,真的在玩命。回头看看2011年初的对2010年的总结,发现自己已经职业了很多。 2011年其实没啥总结的,团队的业务还行,年中的时候试图换个岗位尝试一下没玩过的东西,结果没去成,感觉还挺有意思的。 2011年初的几个愿望基本上都没有实现,时间倒是确实不多,但是总体来说,如果够刻苦总是能找些时间的,2011年读了很多书,数据库和搜索引擎的最多,甚至有考数据库认证的打算,书看完了,却没时间去考试。算了,不考也罢。 2011年整体来说,过得还算顺利,没胖也没瘦, 身体还好,没生什么大病,去了一两次医院。 2012看来没有世界末日的迹象,日子还是得过。2012事情很多,要静下心来做一件自己想做而没有做的事情,可能很难,希望能坚持。2012我希望能够将持续集成引入自己的项目中,让自动化代替部分人工,测试的同事太辛苦,也为了让自己睡个安稳觉。2012年依然有值得期待的书籍,读10本书是必须的。2012得换个手机,旧手机一直没坏,换掉觉得浪费。2012要多认识些朋友,都世界末日了,在黄泉路上大家有个伴。2012多活跃一些,多写点博客。2012希望下班后能早点回家。2012希望自己和亲人身体都好,这才是革命的本钱。

Python Web Server Gateway Interface v1.0.1 不完整翻译

Posted by & filed under Excellence Article.

Contents 简介 基本原理与目标 概述 应用接口 服务器接口 中间件 : 同时扮演两种角色的组件 详细说明 environ 变量 输入和错误流 start_response() 可调用者 Handling the Content-Length Header Buffering and Streaming Middleware Handling of Block Boundaries The write() Callable Unicode Issues Error Handling HTTP 1.1 Expect/Continue Other HTTP Features Thread Support Implementation/Application Notes Server Extension APIs Application Configuration URL Reconstruction Supporting Older (

Mysql中union和order by的问题及优先级

Posted by & filed under Database, Excellence Article.

在Mysql的参考手册中,并没有对union和order by的优先级进行说明 它建议的方法是,对SQL语句加上(),这样能使SQL的语义更清晰 例如,需要对union后的结果进行order by,则: (SELECT a FROM tbl_name WHERE a=10 AND B=1) UNION (SELECT a FROM tbl_name WHERE a=11 AND B=2) ORDER BY a LIMIT 10; 如果,需要对单个SQL语句进行order by,则应把order by子句放入圆括号中,如下: (SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a… Read more »

使用supervisor和nginx发布tornado程序

Posted by & filed under Excellence Article.

tornado先天对异步(no-bolocking)处理能力,非常适合作为Web服务。tornado在linux平台使用epoll来实现异步事件的处理,性能非常好。但是python做为一个脚步语言,单进程执行,无法利用多CPU,对当今的多核CPU是一个很大的浪费。为提高性能,提高CPU利用率,一般会将tornado程序允许cup*n个。 怎样才能放便启动多个tornado程序呢,我们可以用supervisor来管理多个tornado应用。supervisor安装非常方便,easy_install supervisord就可以。 以下是supervisor的配置,我在一台服务器上配置了四个tornado服务。 config ; supervisor. [group:gisapp] programs=gis-8001,gis-8002,gis-8003,gis-8004 [program:gis-8001] command=python /home/gis/gis/gisserver.py –port=8001 directory=/home/gis/gis/ autorestart=true redirect_stderr=true stdout_logfile=/home/gis/gis/logs/gis_server-8001.log stdout_logfile_maxbytes=500MB stdout_logfile_backups=50 stdout_capture_maxbytes=1MB stdout_events_enabled=false loglevel=warn [program:gis-8002] command=python /home/gis/gis/gisserver.py –port=8002 directory=/home/gis/gis/ autorestart=true redirect_stderr=true stdout_logfile=/home/gis/gis/gis_server-8002.log stdout_logfile_maxbytes=500MB stdout_logfile_backups=50 stdout_capture_maxbytes=1MB stdout_events_enabled=false loglevel=warn [program:gis-8003] command=python /home/gis/gis/gisserver.py –port=8003 directory=/home/gis/gis/ autorestart=true redirect_stderr=true stdout_logfile=/home/gis/gis/gis_server-8003.log stdout_logfile_maxbytes=500MB stdout_logfile_backups=50 stdout_capture_maxbytes=1MB stdout_events_enabled=false loglevel=warn [program:gis-8004] command=python /home/gis/gis/gisserver.py –port=8004 directory=/home/gis/gis/ autorestart=true redirect_stderr=true… Read more »

淘宝在数据处理领域的项目及开源产品介绍

Posted by & filed under Tools.

淘宝在数据存储和处理领域在国内互联网公司中一直保持比较靠前的位置,而且由于电子商务领域独特的应用场景,淘宝在数据实时性和大规模计算及挖掘方面一直在国内保持着领先,因此积累了很多的实践的经验和产品。   TimeTunnel  基于Hbase打造的消息中间件,具有高可靠、消息顺序、事务等传统特性,还能按时间维度反复订阅最近历史的任意数据 高性能的broker,单节点达2万TPS,实际支持上千长链接并发 承载海量的数据传输,日同步数据达10TB,并且包含淘宝主营收入等关键性数据 在各IDC内,部署了超过2000个客户端,覆盖全网日志传输 Scribe、flume、activemq、ZeroMQ?我们可以做得更强大 TBFS 基于Hdfs 0.20进行全面改造,设计目标:单个集群可达10000台服务器,支持10亿文件、100PB的数据的存储 领先于社区的全新设计,彻底解决namenode单点问题,并可实现集群在线升级 期待你来挑战:snapshot、异地数据复制、多级的cache、软硬链接支持 Hbase 基于Hbase0.90.3进行改造,目前有上百台的Hbase服务器,支淘宝7个online应用,online数据存储达100T 支持本地化数据计算、二级引索 期待你来挑战:无阻塞的compact、更多的事务支持、更短的请求响应时间、更强大的索引(Lucene for hbase) Mapreduce 基于Hadoop0.19改造,最大单个集群规模达2000台服务器,兼容hadoop0.20 绝大多数API 实际存储数据超过10PB,日运行mapreduce job达5万个 期待你来挑战:更高效任务调度、更优雅的计算资源管理、更灵活的分布计算模型 Hive 基于hive0.6改造,修改的patch达上百个,支持SQL中间结果复用等众多特性 支持淘宝几乎所有的商业数据分析任务,是各行业数据分析师和数据开发工程师必备的技能 期待你来挑战:Hive & Pig能混合编程?现在不能,你敢想就可以来做! Taobao-pamirs-schedule  taobao-pamirs- schedule是一个基于分布式环境的多线程任务处理框架。目的是让一种批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM,不同的线程组中并执行。所有的任务能够被不重复,不遗漏的快速处理。它将需要执行的任务抽象成一致的任务模型,进行统一的管理和监控。运用schedule,任务能够比较均匀的分发到多台机器上进行处理,并且可以动态的进行水平扩展。 QLExpress  一个轻量级的脚本引擎,作为一个嵌入式规则引擎在业务系统中使用。让业务规则定义简便而不失灵活。让业务人员就可以定义业务规则。 支持标准的JAVA语法,还可以支持自定义操作符号、操作符号重载、函数定义、宏定义、数据延迟加载等。 UIC Uic是个海量数据的高稳定高并发高响应高可靠高一致性的系统。海量数据:现在整个用户中心的注册用户数接近6亿,加上地址,支付宝绑定数据,接近20亿。现在通过分库分表存在了16个库1024张表里面。高稳定,高可靠:用户中心是淘宝最为核心的系统之一,一个完整的交易流程需要访问UIC高达几十次,所以UIC的稳定是整个淘宝的重中之重,我们为了UIC的稳定做了很多容灾的方案,包括多机房的备份,缓存的容灾,mysql的容灾,流量的控制等等,可以说UIC的核心就是各种容灾体系和在各种极端情况的下解决措施高并发,高响应:每天访问UIC的数据在200亿左右,我们使用了tair做为缓存,使用protobuf序列化, 尽可能的提高缓存的命中率,现在用户数据的命中率在99%。 Prom  海量数据实时计算框架。基于搜索技术对海量明细数据做实时计算。目前主要对交易数据做分析,应用于数据魔方中 特点: 多维索引组合查询 支持任意维度的计算 实时响应(秒级) 结果精确 Andes  Andes是基于HBase的任意数据长时间维度高性能数据查询集群系统。解放数据魔方在查询时间段上的限制。 采用key-list存储方式,对于任何时间长度的查询均仅需一次数据库访问即可完成,规避查询时间对于查询性能的影响。 KeyKeys  用户搜索query数据分析系统。应用于淘词中,提供实时匹配用户输入query做关键query、关键热词的查询计算。 Myfox/Nodefox  MyFOX是一个针对海量统计数据设计的高性能分布式MySQL集群中间层,承担着数据魔方90%以上的数据存储和查询需求。MyFOX能够提供: •… Read more »

MySQL写入优化

Posted by & filed under Excellence Article.

innodb_buffer_pool_size 如果用Innodb,那么这是一个重要变量。相对于MyISAM来说,Innodb对于buffer size更敏感。MySIAM可能对于大数据量使用默认的key_buffer_size也还好,但Innodb在大数据量时用默认值就感觉在爬了。 Innodb的缓冲池会缓存数据和索引,所以不需要给系统的缓存留空间,如果只用Innodb,可以把这个值设为内存的70%-80%。和 key_buffer相同,如果数据量比较小也不怎么增加,那么不要把这个值设太高也可以提高内存的使用率。 innodb_additional_pool_size 这个的效果不是很明显,至少是当操作系统能合理分配内存时。但你可能仍需要设成20M或更多一点以看Innodb会分配多少内存做其他用途。 innodb_log_file_size 对于写很多尤其是大数据量时非常重要。要注意,大的文件提供更高的性能,但数据库恢复时会用更多的时间。我一般用64M-512M,具体取决于服务器的空间。 innodb_log_buffer_size 默认值对于多数中等写操作和事务短的运用都是可以的。如果经常做更新或者使用了很多blob数据,应该增大这个值。但太大了也是浪费内存,因为1秒钟总会 flush(这个词的中文怎么说呢?)一次,所以不需要设到超过1秒的需求。8M-16M一般应该够了。小的运用可以设更小一点。 innodb_flush_log_at_trx_commit (这个很管用) 抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。 上面是网上看的,我发现慢查询日志内有很多update和insert的查询,就把innodb_flush_log_at_trx_commit改成了2,效果很明显,改成0会更明显,但安全性比较差。做下面的操作启动mysqld就生效: vim /etc/my.cnf innodb_flush_log_at_trx_commit=2 也可以在mysqld运行时执行: set GLOBAL innodb_flush_log_at_trx_commit = 2 下面是mysql手册上innodb_flush_log_at_trx_commit的解释: 如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行;但是,这种模式下,在事务提交的时候,不会有任何动作。如果 innodb_flush_log_at_trx_commit设置为1(默认值),log buffer每次事务提交都会写入log file,并且,flush刷到磁盘中去。如果innodb_flush_log_at_trx_commit设置为2,log buffer在每次事务提交的时候都会写入log file,但是,flush(刷到磁盘)操作并不会同时进行。这种模式下,MySQL会每秒一次地去做flush(刷到磁盘)操作。注意:由于进程调度策 略问题,这个“每秒一次的flush(刷到磁盘)操作”并不是保证100%的“每秒”。 默认值1是为了ACID (atomicity, consistency, isolation, durability)原子性,一致性,隔离性和持久化的考虑。如果你不把innodb_flush_log_at_trx_commit设置为1,你将获得更好的性能,但是,你在系统崩溃的情况,可能会丢失最多一秒钟的事务数据。当你把innodb_flush_log_at_trx_commit设置 为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。如果你把innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。InnoDB的crash recovery崩溃恢复机制并不受这个值的影响,不管这个值设置为多少,crash recovery崩溃恢复机制都会工作。 另外innodb_flush_method参数也值得关注,对写操作有影响: innodb_flush_method: 设置InnoDB同步IO的方式: 1)… Read more »

mysql分页limit 优化

Posted by & filed under Excellence Article.

mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数据 缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性 实验下 Sql代码  mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) mysql> select count(*) from Member; +———-+ | count(*) | +———-+ |   169566 | +———-+ 1 row in set (0.00 sec) mysql> pager grep !~- PAGER set to ’grep !~-’ mysql> select * from Member limit 10, 100; 100 rows in set (0.00 sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100; 100 rows in set (0.00 sec) mysql> select * from Member limit 1000, 100; 100 rows in set (0.01 sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100; 100 rows in set (0.00 sec) mysql> select * from Member limit 100000, 100; 100 rows in set (0.10 sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100; 100 rows in set (0.02 sec) mysql> nopager PAGER set to stdout mysql> show profiles\G *************************** 1. row *************************** Query_ID: 1 Duration: 0.00003300 Query: select count(*) from Member *************************** 2. row *************************** Query_ID: 2 Duration: 0.00167000 Query: select * from Member limit 10, 100 *************************** 3. row *************************** Query_ID: 3 Duration: 0.00112400 Query: select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100 *************************** 4. row *************************** Query_ID: 4 Duration: 0.00263200 Query: select * from Member limit 1000, 100 *************************** 5. row *************************** Query_ID: 5 Duration: 0.00134000 Query: select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100 *************************** 6. row *************************** Query_ID: 6… Read more »

因域名解析问题不能访问三天

Posted by & filed under Life Diary.

如果你能看到本文,证明域名新的解析成功了,天朝真的什么都很有意思。 本博客的域名fendou.org 之前在国内注册的,后来转移到godaddy去了,今年早些时候传言要白名单了,随后真的不能访问,于是乎又将DNS服务器换到国内的DNSPOD,还好DNSPOD解析不需要备案,但是懒得改IP,直接cname到一个还在godaddy上解析的域名,结果这个域名现在也被白名单了,这几天各种纠结的事情缠身,也没怎么看博客,结果就杯具了好几天,现在改成直接使用A记录指向国内的主机,先凑合着用,等周末的时候弄到GAE(Google App Engine)上去吧,由于众所周知的原因,GAE这么好的平台,居然和谐了,还得再弄个境外的服务器做反向代理。另外一个纠结的问题是,本博客主域直接使用的裸域,没有www,GAE不能绑定裸域又是杯具……搬到GAE上最多就是国内不能正常访问而已,好歹数据还在,只要Google 没倒闭,一切都是安全的,Google倒闭的那一天,或许和谐从此消失,换成了民主