ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧洲精品一区二区三区,久久99久久99小草精品免视看,亚洲欧美综合精品久久成人http://www.aygfsteel.com/matuobasyouca/archive/2012/08/08/385087.html一酌散千忧一酌散千忧Wed, 08 Aug 2012 12:21:00 GMThttp://www.aygfsteel.com/matuobasyouca/archive/2012/08/08/385087.htmlhttp://www.aygfsteel.com/matuobasyouca/comments/385087.htmlhttp://www.aygfsteel.com/matuobasyouca/archive/2012/08/08/385087.html#Feedback0http://www.aygfsteel.com/matuobasyouca/comments/commentRss/385087.htmlhttp://www.aygfsteel.com/matuobasyouca/services/trackbacks/385087.html

Hadoop实施已经有快一个月了,对Hadoop的概å¿ëА†è§£ã€ä‹É用,Linux与shell脚本åQŒç”šè‡³mysql都有了更多的理解ã€?br />

™å¹ç›®èƒŒæ™¯åQšç”¨äºŽäº’联网信息攉™›†åŽçš„关键词匹配与内容提取ã€?/span>

主要¾pȝ»Ÿæž¶æž„åˆ†äØ“äº’è”¾|‘爬虫、分析、业务应用三块:

½Ž€å•架构描˜q?/span>

ç”׃ºŽæˆ‘在当中的角色主要负责分析架构的搭徏åQŒæ‰€ä»¥å…¶ä»–两块都ç”Õd¾—½Ž€å•,下面也不会过多的描述ã€?br />

Hadoop理解åQšæåˆ°Hadoop都想到的是云、分布式计算åQŒåœ¨ä¸€ŒD‰|—¶é—´çš„实施之后有了一些具体的理解ã€?/span>

Hadoop的优势:

针对性能指标åQŒå½“业务数据量总量或增速上升到一定çñ”别,依靠关系型数据库一定无法支持。对于非关系型数据库åQŒåŒ…括Nosqlå’ŒSolr一¾cÕd­˜å‚¨æ–¹å¼ï¼Œ½Eæ˜¾å¤æ‚åQŒå¯¹äºŽæœºå™¨é›†¾Ÿ¤æ€§èƒ½è¦æ±‚偏高åQˆç›¸å¯¹äºŽæ–‡äšg¾pȝ»ŸåQ‰ã€‚从数据使用模式上来è®ÔŒ¼Œç›®å‰‹¹·é‡æ•°æ®çš„常常是不包含复杂逻辑的简单统计整理(比如上述¾pȝ»Ÿä¸­çš„关键词匹配)。这时候文件系¾lŸçš„优势反而比较明显(¾l“æž„½Ž€å•,逻辑½Ž€å•)ã€?/span>

如上˜q°ç³»¾lŸçš„应用场景是怎么æ ïLš„呢,在一个强大的爬虫¾pȝ»Ÿä¹‹ä¸‹åQŒæ¯ä¸ªå°æ—¶çš„æ•°æ®å¢žé‡åœ¨Gåˆ?0Gçš„çñ”别,需要搜索所有的文äšgåQŒèŽ·å–å…³é”®å­—çš„åŒ¹é…ï¼Œòq¶ä¸”对匹配内容进行摘要。很¾cÖM¼¼æˆ‘们windows里面的搜索功能,需要解决的ž®±æ˜¯å¦‚何在这样增òq…的文äšg¾pȝ»Ÿä¹‹ä¸‹åQŒå¦‚何满­‘³ä¸šåŠ¡ç³»¾lŸçš„需求ã€?br />

å¯?/span>分析¾pȝ»Ÿæœ‰ä»€ä¹ˆè¦æ±?/span>呢?

能够建立集群åQŒåˆ†å¸ƒå¼çš„保存数据文件内容(¾lŸä¸€æŽ§åˆ¶åQŒå¯é…ç½®åQ‰ã€?/span>

有一定的保护机制åQŒä¿è¯æ•°æ®æˆ–节点丢失不会影响¾pȝ»Ÿä½¿ç”¨ã€?/span>

如果有一个ä“Q务脚本执行框架机制就好了åQˆç”¨äºŽåƈ行计½Ž—)ã€?/span>

能够˜q›è¡ŒèŠ‚ç‚¹é—´çš„æ•°æ®å‡è¡¡ã€?/span>

能够½Ž€å•的查看所有的状态与日志åQˆweb客户端)

可能主要是这些了。若自己实现åQŒç¡®å®žæ˜¯ä¸ªå¤æ‚而庞大的工程åQŒçŽ°åœ¨æˆ‘ä»¬æœ‰äº†Hadoopã€?br />

¾pȝ»Ÿç‰©ç†æž¶æž„åQ?/span>

我们使用了一台服务器åQŒåˆ©ç”¨è™šæ‹ŸåŒ–åQŒå®‰è£…了7å¥?4x位的CentOS。一个NamenodeåQ?个DatanodeåQŒå¤åˆ¶æ•°è®„¡½®ä¸?。每个系¾lŸåˆ†é…åˆ°ä¸€ä¸ªcpuåQ?G内存åQŒDatanode挂蝲äº?00G的存储空间ã€?/span>

理想的Hadoop的搭建环境,参照《Best Practices for Selecting Apache Hadoop Hardware》(http://hortonworks.com/blog/best-practices-for-selecting-apache-hadoop-hardware/åQ‰ä¸€æ–‡ï¼Œä»¥åŠä¸€äº›å…¶ä»–的文章ã€?/span>

CPUåQšæœ€å¥½æ˜¯åŒCPUåQ?核左叟뀂不用太高了ã€?/span>

内存åQšæŽ¨è?8GåQŒä½†æ˜?G应该ž®±å¯ä»¥è¿è¡ŒHadoop了ã€?/span>

¼‹¬ç›˜åQ?200转的SATA¼‹¬ç›˜å›_¯åQŒHadoop很占½Iºé—´åQŒæ‰€ä»¥å°½é‡åŠ ã€?/span>

¾|‘络åQšå†…部的数据交换要求非常高,内网最好是千兆¾|‘卡åQŒå¸¦å®½äØ“1GBã€?br />

理想与现实,有钱与没钱,呵呵�br />

¾pȝ»Ÿè½¯äšgæž¶æž„åQ?/span>

HadoopåQšç‰ˆæœ¬ä‹É用的æ˜?.0.3åQŒå†ä¸‹æ¥ž®±æ˜¯2了,ä¸ÞZº†ž®½é‡½Ž€åŒ–应用,所以不考虑2的新ç‰ÒŽ€§ã€‚对Hadoop没有做太多的讄¡½®åQŒåŸºæœ¬åŸºäºŽé»˜è®¤ã€?0为NamenodeåQ?1-76为Datanodeã€?/span>

JDKåQ?.6.0_33 åQ?4xåQ?br />

¾pȝ»Ÿå®žæ–½˜q‡ç¨‹åQ?/span>

HDFS部分åQ?/span>

爬虫抓取数据åQŒæ•´ç†åŽå­˜æ”¾åœ?0æ–‡äšg服务器,70以外部挂载的形式è¯Õd–。网™å‰|–‡ä»¶æ¯”较小åQŒå‡å¦‚直接写入Hadoop对Namenode负蝲˜q‡å¤§åQŒæ‰€ä»¥å…¥åº“å‰åˆåÆˆåQŒå°†æ¯å°æ—¶ç½‘™å‰|•´åˆæˆä¸ÞZ¸€ä¸ªæ–‡ä»¶å†™å…¥HDFSåQŒç”±äºŽåŒºåˆ†ç±»åˆ«ï¼Œæ‰€ä»¥æ¯ž®æ—¶åŸºæœ¬å†™å…¥10个文件左叻I¼Œæ€»é‡åœ?-8GåQŒè€—æ—¶åœ?0-50分钟。(˜q™ä¸ª˜q‡ç¨‹ä¸­ï¼Œç”׃ºŽçˆ¬è™«çš„IO˜q‡äºŽé¢‘繁åQŒå¯¼è‡´æ–‡ä»¶è¯»å–困难,所以做了定时ä“Q务,每小时启动一‹Æ¡ï¼Œž®†éœ€è¦å¤„理的文äšg先拷贝到临时区域åQŒåˆòq¶å…¥åº“之后再删除。此处应该是受到单核cpu的限åˆÓž¼Œæ‰€æœ‰æ“ä½œå‡æ˜¯ä¸²è¡Œï¼ŒåŒ…括拯‚´åQˆcpåQ‰å’Œåˆåƈ入库åQˆjavaåQ‰ï¼Œæ‰€ä»¥Namenodeä¸¥é‡å»ø™®®é…ç½®½Eé«˜ã€‚)

此处没有太多问题�/span>

MapReduce部分åQ?/span>

写入完成后,˜q›è¡Œåˆ†æžå·¥ä½œåQŒMapReduce。此处的工作˜q‡ç¨‹ä¸ºï¼šæ•°æ®åº“定时生成关键词列表文äšg。Job执行时会è¯Õd–列表文äšgåQŒåŒ¹é…æŒ‡å®šèŒƒå›´å†…çš„HDFSæ–‡äšgåQˆè¿‡åŽÖM¸€ž®æ—¶åQ‰ï¼ŒåŒšw…å‡ºå¯¹åº”的表达式与HTMLåQŒMap˜q‡ç¨‹¾l“束。在Reduce阶段åQŒä¼šž®†Map的所有数据入数据库(MysqlåQ‰ã€?/span>

此处出现˜q‡ä¸€äº›é—®é¢˜ï¼Œè®°å½•下来ã€?/span>

1. Reduce阶段需要加载Mysql的第三方驱动包。我在三个环境测试过åQˆå…¬å¸ã€å®¶é‡Œã€å‘布环境)åQŒä‹Éç”?nbsp;-libjars ä¸€å®šå¯ä»¥ï¼Œæœ‰çš„地方不需要也可以。不明确åQŒæ€€ç–‘与HADOOP_HOME环境变量有关ã€?/span>

2. MR˜q‡ç¨‹ä¸­ä‹É用log4j打印日志åQŒåœ¨Hadoop临时目录åQˆå¦‚果你没有配置dfs.name.diråQŒdfs.data.dir,mapred.local.dir.mapred.system.dir½{‰ç›®å½•,˜q™äº›éƒ½ä¼šåœ¨hadoop.tmp.dir当中åQŒæˆ‘ž®±å·æ‡’都没配¾|®ï¼‰mapredæ–‡äšg夹中查看一下ã€?/span>

整个˜q‡ç¨‹å®žé™…上还是比较简单的åQŒåŸºæœ¬ç¼–码量ž®±åœ¨Job的部分,但是一个Javaæ–‡äšgž®±å¤Ÿäº†ã€‚在目前初çñ”阶段应该˜q˜æ˜¯æ¯”较好用的。现在还没有‹¹‹è¯•Job的执行效率。完成后会ç‘ô¾l­è®°å½•下来。有什么问题可以提出。我惛_ˆ°ä»€ä¹ˆä¹Ÿä¼šåœ¨æœ¬æ–‡¾l§ç®‹æ›´æ–°ã€?/span>



一酌散千忧 2012-08-08 20:21 发表评论
]]>
Hadoop完整分布式配¾|®æ–¹å¼?Fully distributed mode)http://www.aygfsteel.com/matuobasyouca/archive/2012/07/04/382150.html一酌散千忧一酌散千忧Tue, 03 Jul 2012 23:38:00 GMThttp://www.aygfsteel.com/matuobasyouca/archive/2012/07/04/382150.htmlhttp://www.aygfsteel.com/matuobasyouca/comments/382150.htmlhttp://www.aygfsteel.com/matuobasyouca/archive/2012/07/04/382150.html#Feedback0http://www.aygfsteel.com/matuobasyouca/comments/commentRss/382150.htmlhttp://www.aygfsteel.com/matuobasyouca/services/trackbacks/382150.html

¼‹¬äšg资源åQ?/span>

三台CentOS5.6虚拟机(VmwareåQ?/span>

本机 windows7 64x

 

基本资源配置åQ?/span>

三台虚拟机均是克隆自同一个镜�/span>

已经安装äº?/span>Java环境åQ?/span>jdk1.6.0_25åQ?/span>

Hadoop路径�/span>/usr/hadoop/hadoop-0.20.205.0

 

操作步骤åQ?/span>

1、机器名¿U°è§„èŒ?/span>

ip分别ä¸?/span>128ã€?/span>129ã€?/span>130åQŒå°†128讄¡½®ä¸?/span>masteråQŒå…¶ä»–设¾|®äØ“slave

修改

/etc/sysconfig/network

/etc/hosts

两处配置åQŒå¿U°åˆ†åˆ«äØ“hadoop-master\hadoop-slave01\hadoop-slave02

注意åQšæ­¤å¤„å¿U°æœ€å¥½ä¸ç”¨ä‹É用下划线åQŒæœ‰å¯èƒ½å¼•发namenode的启动异常ã€?/span>

 

2、修æ”?/span>Hadoop配置 

åœ?/span>master节点çš?/span>conf中修æ”?/span>masterå’?/span>slaveæ–‡äšgåQŒåˆ†åˆ«äؓ机器çš?/span>ip地址

 

修改master节点�/span>conf中:

core-site.xml

<property>

<name>fs.default.name</name>

<value>hdfs://ip-master:9000</value>

</property>

 

mapred-site.xml

<property>

<name>mapred.job.tracker</name>                                   

<value>master:9001</value>                                

</property>

 

hdfs-site.xm

<property>

<name>dfs.replication</name>

<value>2</value>

</property>

æ³¨æ„æ­¤å¤„çš„ç«¯å£å·å‡äØ“é»˜è®¤ã€?/span>

 

 

3、徏ç«?/span>m-s之间çš?/span>ssh˜qžæŽ¥

首先masterä¸?/span>slave机器都需要进è¡?/span>sshä¿¡ä“Qæ–‡äšg生成åQŒæ‰§è¡Œå¦‚下命令:

$ ssh-keygen -t rsa

中间需要输入的地方直接回èžRåQŒæŽ¥å—缺省值即å?/span>

 

ç”׃ºŽä½¿ç”¨root用户ç™Õd½•åQŒæ‰€ä»¥å¯†é’¥æ–‡ä»¶ç”Ÿæˆåœ¨ /root/.ssh/æ–‡äšg夹下åQŒå­˜æœ‰ä¸€å¯¹å¯†é’?/span>id_dsaå’?/span>id_dsa.pubã€?/span>

此处id_dsaåQˆç§é’¥ï¼‰å¿…须为其他用户不可读åQŒæ‰€ä»¥æ–‡ä»¶å±žæ€§åº”当是600

 

åœ?/span>master机器执行åQ?/span>

ž®?/span>id_dsa.pubåQˆå…¬é’¥ï¼‰å¤åˆ¶ä¸?/span> authorized_keys

$ cp id_dsa.pub authorized_keys

如果是多台机器需è¦?/span>,无密码登é™?/span>,则各自机器äñ”生公钥追加到authorized_keys卛_¯.

 

使用scp协议覆盖slave端的密钥文äšg夹,使得slave机器信ä“Q来自master的连æŽ?/span>:

$ scp /root/.ssh/* ip-slave:/root/.ssh

 

 

4、启动服åŠ?/span> 

廸™®®ž®?/span>$HADOOP_HOME/bin下的所有文件给与执行权限:

$ chmod 777 bin

 

masterä½œäØ“namenod需要执行如下脚本:

$HADOOP_HOME/bin/hadoop namenode –format

 

完成后执�/span> $HADOOP_HOME/bin/start-all.sh

 

5、问题检�/span>

åœ?/span>Hadoop根目录下çš?/span>logsæ–‡äšg中,‹‚€æŸ¥å„个服务日志的启动情况

 

 

6、其他情况说明:

Q: $HADOOP_HOME is deprecated

A: 基本不会产生ä»ÖM½•影响。由于脚本启动时讄¡½®äº†è¯¥çŽ¯å¢ƒå˜é‡åQŒå°±ä¼šæ½Cºç”¨æˆ·åŽŸæœ‰çŽ¯å¢ƒå˜é‡å¤±æ•ˆã€‚å¯ä»¥å–æ¶ˆçŽ¯å¢ƒå˜é‡è®¾¾|®ï¼Œæˆ–者直接去bin/hadoop中找到这句话åQŒåŽ»æŽ‰å³å?/span>

 

Q: 无效的选项 -jvm / Unrecognized option: -jvm

A: 在ä‹Éç”?/span>root用户ç™Õd½•æ—?/span> bin/hadoop 脚本ž®×ƒ¼š˜q›è¡Œåˆ¤æ–­åQŒåŠ ä¸?/span>-jvm参数。此处是ä¸ÞZº†˜q›å…¥jsvcåQ?/span>http://commons.apache.org/daemon/jsvc.htmlåQ‰ï¼Œæ­¤å¤„òq¶ä¸¼‹®å®šæ˜¯å¦bugåQŒä¹Ÿä¸å†˜q›è¡Œè¯¦ç»†çš„追溯,解决æ–ÒŽ³•ž®±æ˜¯˜q›å…¥ bin/hadoop 脚本ä¸?/span> 扑ֈ° jvm 参数òq¶åŽ»æŽ‰ã€?/span>

 

 

 

 

 

 

 



一酌散千忧 2012-07-04 07:38 发表评论
]]>
我们的用户体验真的这么差åQ?/title><link>http://www.aygfsteel.com/matuobasyouca/archive/2012/05/22/378752.html</link><dc:creator>一酌散千忧</dc:creator><author>一酌散千忧</author><pubDate>Mon, 21 May 2012 21:02:00 GMT</pubDate><guid>http://www.aygfsteel.com/matuobasyouca/archive/2012/05/22/378752.html</guid><wfw:comment>http://www.aygfsteel.com/matuobasyouca/comments/378752.html</wfw:comment><comments>http://www.aygfsteel.com/matuobasyouca/archive/2012/05/22/378752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/matuobasyouca/comments/commentRss/378752.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/matuobasyouca/services/trackbacks/378752.html</trackback:ping><description><![CDATA[<p><span style="font-family:宋体;Times New Roman";Times New Roman"">公司里有同事时常抱怨,™å¹ç›®çš„用户体验太差,常常挨领导的骂。大安™ƒ½è®¤äؓ是在用户体验的设计方面,公司人员的能力和¾léªŒéƒ½ä¸­‘›_¼•èµïLš„。发牢骚的时候也会说åQŒå¦‚果公司能够请得è“v“淘宝”çš?/span>UI<span style="font-family:宋体;Times New Roman";Times New Roman"">设计师,å’׃»¬çš„ç³»¾lŸè‚¯å®šä¼šæ›´ä¸Šä¸€å±‚楼。我之前也一直认为如此,åÏxˆ‘们的设计是媄响项目体验的重要原因。最˜q‘被领导调动åŽÕdåŠ©ä¸€ä¸ªé¡¹ç›®ï¼Œäº§ç”Ÿäº†ä¸€äº›ä¸ä¸€æ ïLš„体会ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">™å¹ç›®èƒŒæ™¯åQŒä¸€ä¸ªæ–°çš„äñ”品,ž®åž‹™å¹ç›®åQŒçº¯å¼€å‘ähå‘?/span>3-4<span style="font-family:宋体;Times New Roman";Times New Roman"">人,</span>2<span style="font-family:宋体;Times New Roman";Times New Roman"">名熟¾lƒå¼€å‘äh员,</span>1<span style="font-family:宋体;Times New Roman";Times New Roman"">名新手,偶尔会有协助人员。没有技术经理,™å¹ç›®¾lç†íw«è´Ÿå¤šä¸ª™å¹ç›®åQŒå¯¹™å¹ç›®˜q›åº¦å…›_¿ƒä¸èƒöåQŒéƒ¨é—¨ç»ç†ä¼šååŠ©˜q›è¡Œå·¥ä½œå’Œè¿›åº¦ç®¡ç†ã€‚å¯ä»¥çœ‹åˆ°ç®¡ç†è¿˜æ˜¯æ¯”è¾ƒæØœä¹±ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">ç”׃ºŽ™å¹ç›®˜q›åº¦å¤ªæ…¢åQŒé¢†å¯ÆD¦æ±‚从我这边调一个熟¾lƒäh员协助开发。我也基本了解他们的™å¹ç›®çж况åQŒäؓ了不让我的äh˜q›åŽ»æŠ“çžŽåQŒæˆ‘ž®±å’Œä»–一起去了解™å¹ç›®æƒ…况ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">™å¹ç›®çŠ¶å†µæ¯”è¾ƒ¾pŸç³•åQŒä»‹å…¥é¡¹ç›®æ—¶å·²ç»å¼€å‘了一ŒD‰|—¶é—ß_¼Œä¿ç•™çš„æ–‡æ¡£åªæœ‰ä¸¤ä»½ï¼Œä¸€å‰¯æ•°æ®åº“说明åQŒä¸€ä»½éžå¸¸ç²—略的需求说明,而且˜q˜ä¸Žå¼€å‘进度不同步åQŒå°±æ˜¯æ²¡æœ‰ç»´æŠ¤ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">我了解了一下项目目前的隑ֺ¦åQŒå¼€å‘äh员和我反映一个是人员熟练½E‹åº¦çš„问题,二是需求变更的问题。我整体了解了一下项目目前的需求和设计åQŒä»¥åŠè¿›åº¦ã€‚就挑了一个模块询问他们的变更情况åQŒè¿™ä¸ªæ¨¡å—是一个关键词匚w…åŠŸèƒ½ã€‚ç»“æžœæ˜¯é¢†å¯¼çœ‹äº†ä»–ä»¬çš„é¡µé¢ä¹‹åŽï¼Œå«Œä¿¡æ¯é‡å¤ªå°‘åQŒå°±è¦æ±‚提供一些更¾l†åŒ–的数据展½Cºã€‚开发äh员问我有什么意见,我就½Ž€å•讲了一下页面大概怎么构徏。其中有一个点åQŒæ˜¯ç”¨äºŽå˜æ›´æ•°æ®èŒƒå›´åQŒå³æŸ¥è¯¢çš„表变更åQŒæˆ‘一开始觉得ä‹É用下拉框ž®±å¯ä»¥ï¼Œäº§ç”Ÿäº†ä¸€äº›æ„è§ã€‚有人徏议分ä¸ÞZ¸åŒå­æ¨¡å—åQŒæˆ–è€?/span>tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™åµï¼Œæˆ–è€…åˆ†ä¸ºå¤šå—åÆˆåˆ—å±•½Cºã€‚我想了惻I¼Œž®Þq»™ä»–们讲了我认为几¿Uæ–¹æ¡ˆçš„优点¾~ºç‚¹åŠé€‚用范围ã€?/span></p> <p> </p> <p style="margin-left:18.0pt;text-indent:-18.0pt;">1.<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">       </span><span style="font-family:宋体;Times New Roman";Times New Roman"">多块òq¶è¡Œå±•示åQ?/span></p> <p style="margin-left:21.0pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">多个不同范围的数据在同一™åµé¢ä¸­åˆ†ä¸ÞZ¸åŒåŒºåŸŸä»¥ç›¸åŒå½¢å¼å±•示。原因是ç”׃ºŽå¤šå—数据之间有一定的兌™”因果关系åQŒæˆ–值得å¯Òޝ”。适用范围åQšå¦‚购物¾|‘站中的多个物品比较ã€?/span></p> <p style="margin-left:18.0pt;text-indent:-18.0pt;">2.<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">       </span>Tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™åµï¼š</span></p> <p style="margin-left:21.0pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">同一个页面的多个</span>tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™åµï¼Œè¡¨ç¤ºå¤šä¸ª</span>tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™åµä¸­çš„æ•°æ®å¯èƒ½åœ¨ä¸€å®šçš„领域概念之下有一定的兌™”åQŒä½†å…Œ™”度不强。因ä¸?/span>tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™å‰|›´é‡è¦çš„æ˜¯å¼ø™°ƒä¸€ä¸ªåŒæ­¥å·¥ä½œçš„状态,å?/span>A tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™å‰|Ÿ¥çœ‹ä¸€å®šä¿¡æ¯ï¼Œä¼šæ‰“å¼€</span>B tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™å‰|Ÿ¥çœ‹å…¶ä»–信息,中途还会切å›?/span>A tab<span style="font-family:宋体;Times New Roman";Times New Roman"">™åüc€‚适用范围åQšå¦‚邮箱中,收äšg½Ž±å’Œè‰ç¨¿½Ž±ã€?/span></p> <p style="margin-left:18.0pt;text-indent:-18.0pt;">3.<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">       </span><span style="font-family:宋体;Times New Roman";Times New Roman"">下拉æ¡?/span></p> <p style="margin-left:21.0pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">下拉框作为查询条件的一部分åQŒå¸¸ç”¨äºŽæœ‰ç€å¸¸è§„或固定的可选择内容中(如性别åQŒæœˆä»½ï¼‰åQŒæ›´å¤šæ˜¯ä»¥è¿‡æ»¤çš„形态出玎ͼŒå³ä¸‹æ‹‰æ¡†æ›´é€‚合针对某表的某个字ŒDµè¿‡æ»¤ï¼Œå¦‚果针对的是数据范围或是对用户需要直观了解的重要业务条äšg则不太合适。适用范围åQšå¦‚在考试成ç‡W中ä‹É用下拉框˜q‡æ×o“男女”æˆ?#8220;及格不及æ ?#8221;ã€?/span></p> <p style="margin-left:18.0pt;text-indent:-18.0pt;">4.<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">       </span><span style="font-family:宋体;Times New Roman";Times New Roman"">单选框</span></p> <p style="margin-left:21.0pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">单选框与下拉框的作用范围相ä¼û|¼Œä½†æ˜¯ä¸åŒä¹‹å¤„在于ž®†è¢«é€‰é¡¹å…¨éƒ¨å±•示åQŒç›®çš„在于能够让用户清楚的了解当前数据显½Cºçš„实际范围或条ä»Óž¼Œä»¥åŠå¤‡é€‰çš„其他范围或条件。更适用于选项与实际业务及当前展示数据关系重要åQŒä¸åŒé€‰é¡¹å¯èƒ½ä¼šå¼•发用æˆïLš„ä¸åŒè¡ŒäØ“ã€‚é€‚ç”¨èŒƒå›´åQšå¦‚银行¾pȝ»Ÿæ˜„¡¤ºäº†å½“前用户下¾l‘定多个帐号æ—Óž¼Œä½¿ç”¨å•选框ã€?/span></p> <p style="margin-left:21.0pt"> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">¾lè¿‡ä¸Šè¿°è®¨è®ºåQŒæˆ‘们仔¾l†åˆ†æžäº†˜q™ä¸ªæ¨¡å—中用æˆïLš„实际需求,以及可能后箋操作åQŒæœ€¾lˆé€‰æ‹©çš„单选框的方案ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">目前˜q˜æ²¡æœ‰åŽ¾l­ï¼Œä½†æ˜¯æˆ‘想我们åŸÞZºŽç”¨æˆ·çœŸæ˜¯éœ€æ±‚的挖掘和后¾l­æ“ä½œçš„认真分析åQŒä¼šè®©æˆ‘ä»¬åœ¨ä¸Žé¢†å¯ÆD¿›è¡Œéœ€æ±‚讨论的时候有更加充分合理的依据ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">回来之后我又看了看淘宝的搜烦™åµé¢åQŒæ¯”如就搜烦“鞋子”来讲åQŒå°†å“ç‰Œ˜q™æ è®„¡½®ä¸ºå•选和下拉ž®†æ˜¯å®Œå…¨ä¸åŒçš„æ•ˆæžœï¼Œè€Œç¡®å®šæ–¹æ¡ˆçš„ç†ç”±åˆ™æ˜¯å¯¹äºŽç”¨æˆ·çš„éœ€æ±‚å’Œå®žé™…è¡ŒäØ“çš„æ·±å…¥ç ”½I¶ã€‚这个应该是需求分析和调研的结果。将搜烦条äšgä»?/span>tag<span style="font-family:宋体;Times New Roman";Times New Roman"">çš„åŞ式标注于™åµé¢ä¸Šï¼Œòq¶ä¸”可以直接点击</span>X<span style="font-family:宋体;Times New Roman";Times New Roman"">按钮˜q›è¡Œåˆ é™¤åQŒæˆ‘觉得更加可以們֐‘为用户体验。满­‘›_ƈ充分考虑了用户实际需求的是好的需求分析,能够½Ž€åŒ–åÆˆå¼•å¯¼ç”¨æˆ·è¡ŒäØ“çš„æ˜¯å¥½çš„ç”¨æˆ·ä½“éªŒã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">当我们面临的¾pȝ»Ÿæ„Ÿè§‰éžå¸¸éš„¡”¨çš„æ—¶å€™ï¼Œå¾€å¾€˜q™æ—¶å€™åƈ非是用户体验差,我们应该‹‚€è®¨çš„æ˜¯æˆ‘们对用户需求有没有好好挖掘åQŒåšå‡ºæ¥çš„æ˜¯ä¸æ˜¯ç”¨æˆ·æƒŒ™¦ã€ç”¨æˆ¯‚ƒ½ç”¨çš„¾pȝ»Ÿã€?/span></p><img src ="http://www.aygfsteel.com/matuobasyouca/aggbug/378752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/matuobasyouca/" target="_blank">一酌散千忧</a> 2012-05-22 05:02 <a href="http://www.aygfsteel.com/matuobasyouca/archive/2012/05/22/378752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zookeeper的学习æ€È»“http://www.aygfsteel.com/matuobasyouca/archive/2012/05/15/378164.html一酌散千忧一酌散千忧Tue, 15 May 2012 03:02:00 GMThttp://www.aygfsteel.com/matuobasyouca/archive/2012/05/15/378164.htmlhttp://www.aygfsteel.com/matuobasyouca/comments/378164.htmlhttp://www.aygfsteel.com/matuobasyouca/archive/2012/05/15/378164.html#Feedback0http://www.aygfsteel.com/matuobasyouca/comments/commentRss/378164.htmlhttp://www.aygfsteel.com/matuobasyouca/services/trackbacks/378164.html

Zookeeper的核心概念:

ZNode

Znodež®±æ˜¯æ ¸å¿ƒ¾l“æž„åQŒZookeeper服务中是由大量的Znode构成。Znode一般是由客æˆïL«¯å»ºç«‹å’Œä¿®æ”¹ï¼Œä½œäؓ信息或标志的载体åQŒç”šè‡Ïxœ¬íw«å°±æ˜¯æ ‡å¿—ã€?/span>

Znode可以讄¡½®ä¸ºæŒä¹…(PERSISTENTåQ‰æˆ–临时åQˆEPHEMERALåQ‰ï¼ŒåŒºåˆ«åœ¨äºŽä¸´æ—¶çš„节点若断开˜qžæŽ¥åŽå°±è‡ªåŠ¨åˆ é™¤ã€‚å¾ç«‹èŠ‚ç‚ÒŽ—¶å¯é€‰æ‹©æ˜¯å¦ä½¿ç”¨åºåˆ—号命名(SEQUENTIALåQ‰ï¼Œè‹¥å¯ç”¨åˆ™ä¼šè‡ªåŠ¨åœ¨èŠ‚ç‚¹ååŽåŠ å…¥å”¯ä¸€åºåˆ—¾~–号ã€?/span>

Session

ä½œäØ“å®¢æˆ·ç«¯å’ŒZookeeper服务之间交互的凭证ã€?/span>

Watch

当客æˆïL«¯å¯¹èŠ‚ç‚¹ä¿¡æ¯è¿›è¡ŒæŸ¥è¯¢æ“ä½œä¹‹åŽï¼Œå¯ä»¥é€‰æ‹©æ˜¯å¦è®„¡½®ä¸€ä¸ªWatch。其作用ž®±æ˜¯å½“本‹Æ¡æŸ¥è¯¢çš„æ•°æ®åœ¨æœåŠ¡å™¨ç«¯å‘ç”Ÿå˜åŒ–ä¹‹åŽï¼Œä¼šå¯¹è®„¡½®Watch的客æˆïL«¯å‘送通知。一‹Æ¡å‘送之后,ž®±å°†åˆ é™¤è¯¥WatchåQŒä»¥åŽçš„变更或不再设¾|®Watch则不会通知ã€?/span>

ACLs

节点的权限限制ä‹É用ACLåQŒå¦‚增删æ”ÒŽŸ¥æ“ä½œã€?/span>

Zookeeper的服务器安装åQ?/span>

1ã€?/span>下蝲对应版本åïLš„tar.gzæ–‡äšg

2ã€?/span>使用 tar xzvf zookeeper-3.4.2.tar.gz -C ./ è§£åŽ‹

3ã€?/span>讄¡½®åQŒå°†conf/zoo.example.cfg复制到conf/zoo.cfg或者手动徏立一个新的ã€?/span>

4ã€?/span>启动Zookeeper服务åQšbin/zkServer.sh start

5ã€?/span>启动客户端连接:bin/zkCli.sh -server 127.0.0.1:2181åQˆæ­¤å¤„在本机åQŒä¸”使用了默认端口,且在Java环境中)

6ã€?/span>使用命ä×oåQšls、get、set½{‰ã€?/span>

7ã€?/span>关闭Zookeeper服务åQšbin/zkServer.sh stop

Zookeeper代码¾~–写åQ?/span>

代码¾~–写部分比较½Ž€å•ï¼Œå› äØ“æš´éœ²çš„æŽ¥å£å¾ˆž®‘,主要复杂在于™å¹ç›®å¦‚何使用节点以及节点信息ã€?/span>

启动Zookeeper服务之后åQŒå®¢æˆïL«¯ä»£ç ˜q›è¡ŒèŠ‚ç‚¹çš„å¢žåˆ ï¼ŒWatch的设¾|®ï¼Œå†…容的改查等ã€?/span>

æ­¤å¤„å»ø™®®æŸ¥çœ‹å®˜æ–¹çš„《Programming with ZooKeeper - A basic tutorial》部分,当中举了两个例子来模拟分布式¾pȝ»Ÿçš„应用ã€?/span>

代码基本没有问题åQŒå”¯ä¸€éœ€è¦æ³¨æ„çš„ž®±æ˜¯åQšè‹¥ä¹‹é—´æŒ‰ç…§åŽŸç‰ˆ˜q›è¡Œè°ƒè¯•æ—Óž¼Œæœ‰å¯èƒ½åœ¨è°ƒç”¨

 Stat s = zk.exists(root, false);

˜q™å¥ä»£ç æ—¶ä¼šå‡ºçŽ°ä¸€ä¸ªå¼‚å¸¸ï¼Œå½“ä¸­åŒ…æ‹¬“KeeperErrorCode = ConnectionLoss for”ã€?/span>

˜q™ä¸ªé—®é¢˜å¼•è“v的原因可以看一下代ç ?/span>

                System.out.println("Starting ZK:");
                zk 
= new ZooKeeper(address, 3000this);
                mutex 
= new Integer(-1);
                System.out.println(
"Finished starting ZK: " + zk);

最后一行有打印出Zookeeper目前的信息,若未修改的原代码åQŒæ­¤å¤„çš„State应当是CONECTING。连接中的时候去验证是否存在节点会报错。解决的æ–ÒŽ³•也很½Ž€å•,ž®±æ˜¯½{‰åˆ°Zookeeper客户端以及完全连接上服务器,State为CONECTED之后再进行其他操作。给å‡ÞZ»£ç ç¤ºä¾‹ï¼š

// ä½¿ç”¨äº†å€’数计数åQŒåªéœ€è¦è®¡æ•îC¸€‹Æ?/span>
private CountDownLatch connectedSignal = new CountDownLatch(1); 
SyncPrimitive(String address) {
    
if(zk == null){
        
try {
            System.out.println(
"Starting ZK:");
            zk 
= new ZooKeeper(address, 3000this);
            mutex 
= new Integer(-1);
            connectedSignal.await(); 
// ½{‰å¾…˜qžæŽ¥å®Œæˆ
            System.out.println("Finished starting ZK: " + zk);
        } 
catch (IOException e) {
            System.out.println(e.toString());
            zk 
= null;
        } 
catch (InterruptedException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
//else mutex = new Integer(-1);
}
synchronized public void process(WatchedEvent event) {
    
// æ­¤å¤„讄¡«‹åœ¨Watch中会在状态变化后触发事äšg
    if (event.getState() == KeeperState.SyncConnected) {
        connectedSignal.countDown();
// å€’æ•°-1
    }
    
        
synchronized (mutex) {
            
//System.out.println("Process: " + event.getType());
            mutex.notify();
        }
}

˜q™æ ·ž®±å¯ä»¥æ­£¼‹®è¿è¡Œä»£ç äº†ã€?/span>

Zookeeper的应用场景及方式åQ?/span>

æ­¤å¤„æ˜¯äØ“å¼•ç”¨åQŒåŽŸåœ°å€ä¸ºï¼ˆhttp://rdc.taobao.com/team/jm/archives/1232 åQ?/span>

ZooKeeper是一个高可用的分布式数据½Ž¡ç†ä¸Žç³»¾lŸåè°ƒæ¡†æž¶ã€‚基于对Paxos½Ž—法的实玎ͼŒä½¿è¯¥æ¡†æž¶ä¿è¯äº†åˆ†å¸ƒå¼çŽ¯å¢ƒä¸­æ•°æ®çš„å¼ÞZ¸€è‡´æ€§ï¼Œä¹Ÿæ­£æ˜¯åŸºäºŽè¿™æ ïLš„ç‰ÒŽ€§ï¼Œä½¿å¾—zookeeper能够应用于很多场景。网上对zkçš„ä‹É用场景也有不ž®‘介¾lï¼Œæœ¬æ–‡ž®†ç»“合作者èín边的™å¹ç›®ä¾‹å­åQŒç³»¾lŸçš„对zkçš„ä‹É用场景进行归¾cÖM»‹¾lã€?nbsp;值得注意的是åQŒzkòq¶ä¸æ˜¯ç”Ÿæ¥å°±ä¸ø™¿™äº›åœºæ™¯è®¾è®¡ï¼Œéƒ½æ˜¯åŽæ¥ä¼—多开发者根据框架的ç‰ÒŽ€§ï¼Œæ‘¸çƒ¦å‡ºæ¥çš„典型ä‹É用方法。因此,也非常欢˜qŽä½ åˆ†äín你在ZK使用上的奇技淫åéyã€?/span>

场景¾cÕdˆ«

典型场景描述åQˆZKç‰ÒŽ€§ï¼Œä½¿ç”¨æ–ÒŽ³•åQ?/span>

应用中的具体使用

数据发布与订�/span>

发布与订阅即所谓的配置½Ž¡ç†åQŒé¡¾åæ€ä¹‰ž®±æ˜¯ž®†æ•°æ®å‘布到zk节点上,供订阅者动态获取数据,实现配置信息的集中式½Ž¡ç†å’ŒåŠ¨æ€æ›´æ–°ã€‚ä¾‹å¦‚å…¨å±€çš„é…¾|®ä¿¡æ¯ï¼Œåœ°å€åˆ—表½{‰å°±éžå¸¸é€‚合使用ã€?/span>

1. ç´¢å¼•信息和集¾Ÿ¤ä¸­æœºå™¨èŠ‚ç‚¹çŠ¶æ€å­˜æ”‘Öœ¨zk的一些指定节点,供各个客æˆïL«¯è®¢é˜…使用ã€?. ¾pȝ»Ÿæ—¥å¿—åQˆç»˜q‡å¤„理后的)存储åQŒè¿™äº›æ—¥å¿—通常2-3天后被清除ã€?nbsp;

3. åº”用中用到的一些配¾|®ä¿¡æ¯é›†ä¸­ç®¡ç†ï¼Œåœ¨åº”用启动的时候主动来获取一‹Æ¡ï¼Œòq¶ä¸”在节点上注册一个WatcheråQŒä»¥åŽæ¯‹Æ¡é…¾|®æœ‰æ›´æ–°åQŒå®žæ—‰™€šçŸ¥åˆ°åº”用,获取最新配¾|®ä¿¡æ¯ã€?/span>

4. ä¸šåŠ¡é€»è¾‘ä¸­éœ€è¦ç”¨åˆ°çš„ä¸€äº›å…¨å±€å˜é‡åQŒæ¯”如一些消息中间äšg的消息队列通常有个offsetåQŒè¿™ä¸ªoffset存放在zk上,˜q™æ ·é›†ç¾¤ä¸­æ¯ä¸ªå‘送者都能知道当前的发送进度ã€?/span>

5. ¾pȝ»Ÿä¸­æœ‰äº›ä¿¡æ¯éœ€è¦åŠ¨æ€èŽ·å–ï¼Œòq¶ä¸”˜q˜ä¼šå­˜åœ¨äººå·¥æ‰‹åЍåŽÖM¿®æ”¹è¿™ä¸ªä¿¡æ¯ã€‚以前通常是暴露出接口åQŒä¾‹å¦‚JMX接口åQŒæœ‰äº†zk后,只要ž®†è¿™äº›ä¿¡æ¯å­˜æ”‘Öˆ°zk节点上即可ã€?/span>

Name Service

˜q™ä¸ªä¸»è¦æ˜¯ä½œä¸ºåˆ†å¸ƒå¼å‘½åæœåŠ¡åQŒé€šè¿‡è°ƒç”¨zkçš„create node apiåQŒèƒ½å¤Ÿå¾ˆå®ÒŽ˜“创徏一个全局唯一的pathåQŒè¿™ä¸ªpathž®±å¯ä»¥ä½œä¸ÞZ¸€ä¸ªå¿U°ã€?/span>

 

分布通知/协调

ZooKeeper中特有watcher注册与异步通知机制åQŒèƒ½å¤Ÿå¾ˆå¥½çš„实现分布式环境下不同¾pȝ»Ÿä¹‹é—´çš„通知与协调,实现å¯ÒŽ•°æ®å˜æ›´çš„实时处理。ä‹É用方法通常是不同系¾lŸéƒ½å¯¹ZK上同一个znode˜q›è¡Œæ³¨å†ŒåQŒç›‘听znode的变化(包括znode本èín内容及子节点的)åQŒå…¶ä¸­ä¸€ä¸ªç³»¾lŸupdate了znodeåQŒé‚£ä¹ˆå¦ä¸€ä¸ªç³»¾lŸèƒ½å¤Ÿæ”¶åˆ°é€šçŸ¥åQŒåƈ作出相应处理ã€?/span>

1. å¦ä¸€¿Uå¿ƒè·Ïx£€‹¹‹æœºåˆÓž¼š‹‚€‹¹‹ç³»¾lŸå’Œè¢«æ£€‹¹‹ç³»¾lŸä¹‹é—´åƈ不直接关联è“v来,而是通过zk上某个节点关联,大大减少¾pȝ»Ÿè€¦åˆã€?. å¦ä¸€¿Uç³»¾lŸè°ƒåº¦æ¨¡å¼ï¼šæŸç³»¾lŸæœ‰æŽ§åˆ¶å°å’ŒæŽ¨é€ç³»¾lŸä¸¤éƒ¨åˆ†¾l„成åQŒæŽ§åˆ¶å°çš„职责是控制推送系¾lŸè¿›è¡Œç›¸åº”的推送工作。管理äh员在控制åîC½œçš„一些操作,实际上是修改了ZK上某些节点的状态,而zkž®±æŠŠ˜q™äº›å˜åŒ–通知¾l™ä»–们注册Watcher的客æˆïL«¯åQŒå³æŽ¨é€ç³»¾lŸï¼ŒäºŽæ˜¯åQŒä½œå‡ºç›¸åº”的推送ä“Q务ã€?nbsp;

3. å¦ä¸€¿Uå·¥ä½œæ±‡æŠ¥æ¨¡å¼ï¼šä¸€äº›ç±»ä¼égºŽä»ÕdŠ¡åˆ†å‘¾pȝ»ŸåQŒå­ä»ÕdŠ¡å¯åŠ¨åŽï¼Œåˆ°zk来注册一个äÍ时节点,òq¶ä¸”定时ž®†è‡ªå·Þqš„˜q›åº¦˜q›è¡Œæ±‡æŠ¥åQˆå°†˜q›åº¦å†™å›ž˜q™ä¸ªä¸´æ—¶èŠ‚ç‚¹åQ‰ï¼Œ˜q™æ ·ä»ÕdŠ¡½Ž¡ç†è€…就能够实时知道ä»ÕdŠ¡˜q›åº¦ã€?/span>

æ€ÖM¹‹åQŒä‹É用zookeeper来进行分布式通知和协调能够大大降低系¾lŸä¹‹é—´çš„耦合ã€?/span>

分布式锁

分布式锁åQŒè¿™ä¸ªä¸»è¦å¾—益于ZooKeeper为我们保证了数据的强一致性,即用户只要完全相信每时每刻,zk集群中ä“Q意节点(一个zk serveråQ‰ä¸Šçš„相同znodeçš„æ•°æ®æ˜¯ä¸€å®šæ˜¯ç›¸åŒçš„ã€‚é”æœåŠ¡å¯ä»¥åˆ†äØ“ä¸¤ç±»åQ?/span>一个是保持独占åQŒå¦ä¸€ä¸ªæ˜¯æŽ§åˆ¶æ—¶åºã€?/span> 

所谓保持独占,ž®±æ˜¯æ‰€æœ‰è¯•图来获取˜q™ä¸ªé”çš„客户端,最¾lˆåªæœ‰ä¸€ä¸ªå¯ä»¥æˆåŠŸèŽ·å¾—è¿™æŠŠé”ã€‚é€šå¸¸çš„åšæ³•æ˜¯æŠŠzk上的一个znode看作是一把锁åQŒé€šè¿‡create znode的方式来实现。所有客æˆïL«¯éƒ½åŽ»åˆ›å¾ /distribute_lock èŠ‚ç‚¹åQŒæœ€¾lˆæˆåŠŸåˆ›å»ºçš„é‚£ä¸ªå®¢æˆ·ç«¯ä¹ŸåÏx‹¥æœ‰äº†˜q™æŠŠé”ã€?/span>

控制时序åQŒå°±æ˜¯æ‰€æœ‰è§†å›¾æ¥èŽ·å–˜q™ä¸ªé”çš„客户端,最¾lˆéƒ½æ˜¯ä¼šè¢«å®‰æŽ’执行,只是有个全局时序了。做法和上面基本¾cÖM¼¼åQŒåªæ˜¯è¿™é‡?nbsp;/distribute_lock å·²ç»é¢„先存在åQŒå®¢æˆïL«¯åœ¨å®ƒä¸‹é¢åˆ›å¾ä¸´æ—¶æœ‰åºèŠ‚ç‚¹åQˆè¿™ä¸ªå¯ä»¥é€šè¿‡èŠ‚ç‚¹çš„å±žæ€§æŽ§åˆÓž¼šCreateMode.EPHEMERAL_SEQUENTIAL来指定)。Zk的父节点åQ?distribute_lockåQ‰ç»´æŒä¸€ä»½sequence,保证子节点创建的时序性,从而也形成了每个客æˆïL«¯çš„全局时序ã€?/span>

 

集群½Ž¡ç†

1. é›†ç¾¤æœºå™¨ç›‘控åQšè¿™é€šå¸¸ç”¨äºŽé‚£ç§å¯šw›†¾Ÿ¤ä¸­æœºå™¨çŠ¶æ€ï¼Œæœºå™¨åœ¨çº¿çŽ‡æœ‰è¾ƒé«˜è¦æ±‚çš„åœºæ™¯ï¼Œèƒ½å¤Ÿå¿«é€Ÿå¯¹é›†ç¾¤ä¸­æœºå™¨å˜åŒ–ä½œå‡ºå“åº”ã€‚è¿™æ ïLš„场景中,往往有一个监控系¾lŸï¼Œå®žæ—¶‹‚€‹¹‹é›†¾Ÿ¤æœºå™¨æ˜¯å¦å­˜‹z…R€‚过åŽÈš„做法通常是:监控¾pȝ»Ÿé€šè¿‡æŸç§æ‰‹æ®µåQˆæ¯”如pingåQ‰å®šæ—¶æ£€‹¹‹æ¯ä¸ªæœºå™¨ï¼Œæˆ–者每个机器自己定时向监控¾pȝ»Ÿæ±‡æŠ¥“我还‹zȝ€”ã€?nbsp;˜q™ç§åšæ³•可行åQŒä½†æ˜¯å­˜åœ¨ä¸¤ä¸ªæ¯”较明昄¡š„问题åQ?. é›†ç¾¤ä¸­æœºå™¨æœ‰å˜åŠ¨çš„æ—¶å€™ï¼Œç‰µè¿žä¿®æ”¹çš„ä¸œè¥¿æ¯”è¾ƒå¤šã€?. æœ‰ä¸€å®šçš„å»¶æ—¶ã€?nbsp;

利用ZooKeeper有两个特性,ž®±å¯ä»¥å®žæ—¶å¦ä¸€¿Ué›†¾Ÿ¤æœºå™¨å­˜‹zÀL€§ç›‘控系¾lŸï¼ša. å®¢æˆ·ç«¯åœ¨èŠ‚ç‚¹ x ä¸Šæ³¨å†Œä¸€ä¸ªWatcheråQŒé‚£ä¹ˆå¦‚æž?nbsp;x çš„子节点变化了,会通知该客æˆïL«¯ã€‚b. åˆ›å¾EPHEMERAL¾cÕdž‹çš„节点,一旦客æˆïL«¯å’ŒæœåŠ¡å™¨çš„ä¼šè¯ç»“æŸæˆ–˜q‡æœŸåQŒé‚£ä¹ˆè¯¥èŠ‚ç‚¹ž®×ƒ¼šæ¶ˆå¤±ã€?/span>

例如åQŒç›‘控系¾lŸåœ¨ /clusterServers èŠ‚ç‚¹ä¸Šæ³¨å†Œä¸€ä¸ªWatcheråQŒä»¥åŽæ¯åŠ¨æ€åŠ æœºå™¨åQŒé‚£ä¹ˆå°±å¾€ /clusterServers ä¸‹åˆ›å»ÞZ¸€ä¸?nbsp;EPHEMERAL¾cÕdž‹çš„节点:/clusterServers/{hostname}. ˜q™æ ·åQŒç›‘控系¾lŸå°±èƒ½å¤Ÿå®žæ—¶çŸ¥é“机器的增减情况,至于后箋处理ž®±æ˜¯ç›‘控¾pȝ»Ÿçš„业务了ã€?/span>
2. Master选ä‹D则是zookeeper中最为经典的使用场景了ã€?/span>

在分布式环境中,相同的业务应用分布在不同的机器上åQŒæœ‰äº›ä¸šåŠ¡é€»è¾‘åQˆä¾‹å¦‚一些耗时的计½Ž—,¾|‘络I/O处理åQ‰ï¼Œå¾€å¾€åªéœ€è¦è®©æ•´ä¸ªé›†ç¾¤ä¸­çš„æŸä¸€å°æœºå™¨è¿›è¡Œæ‰§è¡Œï¼Œå…¶ä½™æœºå™¨å¯ä»¥å…׃ín˜q™ä¸ª¾l“æžœåQŒè¿™æ ·å¯ä»¥å¤§å¤§å‡ž®‘重复劳动,提高性能åQŒäºŽæ˜¯è¿™ä¸ªmaster选ä‹D便是˜q™ç§åœºæ™¯ä¸‹çš„¼„°åˆ°çš„主要问题ã€?/span>

利用ZooKeeperçš„å¼ºä¸€è‡´æ€§ï¼Œèƒ½å¤Ÿä¿è¯åœ¨åˆ†å¸ƒå¼é«˜åÆˆå‘æƒ…å†µä¸‹èŠ‚ç‚¹åˆ›å¾çš„å…¨å±€å”¯ä¸€æ€§ï¼Œå»I¼šåŒæ—¶æœ‰å¤šä¸ªå®¢æˆïL«¯è¯äh±‚创徏 /currentMaster èŠ‚ç‚¹åQŒæœ€¾lˆä¸€å®šåªæœ‰ä¸€ä¸ªå®¢æˆïL«¯è¯äh±‚能够创徏成功ã€?/span>

利用˜q™ä¸ªç‰ÒŽ€§ï¼Œž®Þpƒ½å¾ˆè½»æ˜“的在分布式环境中进行集¾Ÿ¤é€‰å–了ã€?/span>

另外åQŒè¿™¿Uåœºæ™¯æ¼”化一下,ž®±æ˜¯åŠ¨æ€Master选ä‹D。这ž®Þp¦ç”¨åˆ° EPHEMERAL_SEQUENTIAL¾cÕdž‹èŠ‚ç‚¹çš„ç‰¹æ€§äº†ã€?/span>

上文中提刎ͼŒæ‰€æœ‰å®¢æˆïL«¯åˆ›å¾è¯äh±‚åQŒæœ€¾lˆåªæœ‰ä¸€ä¸ªèƒ½å¤Ÿåˆ›å»ºæˆåŠŸã€‚åœ¨˜q™é‡Œ½Eå¾®å˜åŒ–下,ž®±æ˜¯å…è®¸æ‰€æœ‰è¯·æ±‚都能够创徏成功åQŒä½†æ˜¯å¾—有个创徏™åºåºåQŒäºŽæ˜¯æ‰€æœ‰çš„è¯äh±‚最¾lˆåœ¨ZK上创建结果的一¿Uå¯èƒ½æƒ…冉|˜¯˜q™æ ·åQ?nbsp;/currentMaster/{sessionId}-1 , /currentMaster/{sessionId}-2 , /currentMaster/{sessionId}-3 ….. æ¯æ¬¡é€‰å–序列åähœ€ž®çš„é‚£ä¸ªæœºå™¨ä½œäØ“MasteråQŒå¦‚果这个机器挂了,ç”׃ºŽä»–创建的节点会马上小æ—Óž¼Œé‚£ä¹ˆä¹‹åŽæœ€ž®çš„那个机器ž®±æ˜¯Master了ã€?/span>

1. åœ¨æœç´¢ç³»¾lŸä¸­åQŒå¦‚果集¾Ÿ¤ä¸­æ¯ä¸ªæœºå™¨éƒ½ç”Ÿæˆä¸€ä»½å…¨é‡çƒ¦å¼•,不仅耗时åQŒè€Œä¸”不能保证彼此之间索引数据一致。因此让集群中的Master来进行全量烦引的生成åQŒç„¶åŽåŒæ­¥åˆ°é›†ç¾¤ä¸­å…¶å®ƒæœºå™¨ã€?. å¦å¤–åQŒMaster选ä‹D的容灾措施是åQŒå¯ä»¥éšæ—¶è¿›è¡Œæ‰‹åŠ¨æŒ‡å®šmasteråQŒå°±æ˜¯è¯´åº”用在zk在无法获取master信息æ—Óž¼Œå¯ä»¥é€šè¿‡æ¯”如http方式åQŒå‘一个地方获取masterã€?/span>

分布式队�/span>

队列斚w¢åQŒæˆ‘目前感觉有两¿Uï¼Œä¸€¿Uæ˜¯å¸¸è§„的先˜q›å…ˆå‡ºé˜Ÿåˆ—,另一¿Uæ˜¯è¦ç­‰åˆ°é˜Ÿåˆ—成员聚齐之后的才统一按序执行。对于第二种先进先出队列åQŒå’Œåˆ†å¸ƒå¼é”æœåŠ¡ä¸­çš„æŽ§åˆ¶æ—¶åºåœºæ™¯åŸºæœ¬åŽŸç†ä¸€è‡ß_¼Œ˜q™é‡Œä¸å†èµ˜è¿°ã€?nbsp;

½W¬äºŒ¿Ué˜Ÿåˆ—其实是在FIFO队列的基¼‹€ä¸Šä½œäº†ä¸€ä¸ªå¢žå¼ºã€‚通常可以åœ?nbsp;/queue ˜q™ä¸ªznode下预先徏立一ä¸?queue/num èŠ‚ç‚¹åQŒåƈ且赋å€égØ“nåQˆæˆ–者直接给/queue赋值nåQ‰ï¼Œè¡¨ç¤ºé˜Ÿåˆ—大小åQŒä¹‹åŽæ¯‹Æ¡æœ‰é˜Ÿåˆ—成员加入后,ž®±åˆ¤æ–­ä¸‹æ˜¯å¦å·²ç»åˆ°è¾¾é˜Ÿåˆ—大小åQŒå†³å®šæ˜¯å¦å¯ä»¥å¼€å§‹æ‰§è¡Œäº†ã€‚è¿™¿Uç”¨æ³•的典型场景是,分布式环境中åQŒä¸€ä¸ªå¤§ä»ÕdŠ¡Task AåQŒéœ€è¦åœ¨å¾ˆå¤šå­ä“Q务完成(或条件就¾lªï¼‰æƒ…况下才能进行。这个时候,凡是其中一个子ä»ÕdŠ¡å®ŒæˆåQˆå°±¾lªï¼‰åQŒé‚£ä¹ˆå°±åŽ?nbsp;/taskList ä¸‹å¾ç«‹è‡ªå·Þqš„临时时序节点åQˆCreateMode.EPHEMERAL_SEQUENTIALåQ‰ï¼Œå½?nbsp;/taskList å‘现自己下面的子节点满èƒö指定个数åQŒå°±å¯ä»¥˜q›è¡Œä¸‹ä¸€æ­¥æŒ‰åºè¿›è¡Œå¤„理了ã€?/span>

 



一酌散千忧 2012-05-15 11:02 发表评论
]]>
MongoDB, Java 与对象关¾pÀL˜ ž®?/title><link>http://www.aygfsteel.com/matuobasyouca/archive/2012/05/09/377698.html</link><dc:creator>一酌散千忧</dc:creator><author>一酌散千忧</author><pubDate>Wed, 09 May 2012 05:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/matuobasyouca/archive/2012/05/09/377698.html</guid><wfw:comment>http://www.aygfsteel.com/matuobasyouca/comments/377698.html</wfw:comment><comments>http://www.aygfsteel.com/matuobasyouca/archive/2012/05/09/377698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/matuobasyouca/comments/commentRss/377698.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/matuobasyouca/services/trackbacks/377698.html</trackback:ping><description><![CDATA[<div> <h2><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing:-.75pt">MongoDB</span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">介绍</span></span><span></span></h2> <p><span>当今<span>NoSQL领域中有很多有力的竞争者通过多种方式来处理æ“v量数据问题。其中重要的解决æ–ÒŽ¡ˆä¹‹ä¸€ž®±æ˜¯MongoDB。MongoDB是面向文档的å¼Þq»“构化存储æ–ÒŽ¡ˆåQŒä‹É用JSON格式来展现、查询和修改数据ã€?/span></span></p> <p><span><span>MongoDB文档相当完备åQŒæ‰©å±•规模与安装一æ ïL®€å•。它提供冗余、切片、烦引以及map/reduce½{‰æ¦‚忉|”¯æŒã€‚MongoDB的开源社区非常大且非常活跃。MongoDB在很多大型äñ”品中被实际运用,如:Disney, Craigslist, Foursquare, Github å’ŒSourceForge。MongoDB是一个开源项目,ç”?/span></span><a ><span><span style="color:#0B59B2">10gen.com</span></span></a><span>建立òq¶ç»´æŠ¤ï¼Œè¯¥å…¬å¸ç”±<span>DoubleClick的前ä»ÀL‰§è¡Œäh员创立。同æ—Óž¼Œ10genä¹Ÿæä¾›äº†æžå¥½çš„å•†ä¸šæ”¯æŒä¸Žå‚ä¸Žå»ø™®¾ã€?/span></span></p> <h2><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt">MongoDB </span></span></span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">ä¸?/span></span><span><span><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing: -.75pt"> NoSQL: </span></span></span><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">¾~ºé™·ä¸Žä¼˜åŠ?/span></span></span><span></span></h2> <p><span><span>MongoDBä½œäØ“ä¸€ä¸ªå¯ç”¨NoSQLæ–ÒŽ¡ˆå…ähœ‰å¾ˆå¤šä¼˜åŠ¿ã€‚æˆ‘åˆšå¼€å§‹æŽ¥è§¦NoSQL数据库了解了一¾pÕdˆ—åŸÞZºŽJava的方案,òq¶ä¸”èŠ×ƒº†å¤§é‡çš„æ—¶é—´æ¥å¼„懂什么是列家族,Hadoop与HBase的关¾p»ï¼ŒZooKeeper到底是什么。当我终于全部清楚之后,发现Cassandra与HBase¼‹®å®žæ˜¯å¯¹äºŽNoSQL领域非常可靠、可信赖的解å†Ïx–¹æ¡ˆã€‚但与其他的解决æ–ÒŽ¡ˆç›¸æ¯”åQŒMongoDB让我在能够开始写代码之前åQŒä¸ç”¨ç†è§£é‚£ä¹ˆå¤šçš„æ¦‚å¿üc€?/span></span></p> <p><span>与其他èÊY件相ä¼û|¼Œ<span>MongoDB也存在缺陗÷€‚经˜q‡ä¸€ŒD‰|—¶é—´ä‹É用MongoDBåQŒæˆ‘列ä‹D¾låކ˜q‡åƈ需要注意的一些事情,我成ä¸?#8220;Gotchas”åQ?/span></span></p> <ul type="disc"><li style=" text-align:left;"><span><span style="font-family:宋体;">不要按照关系型数据库来思考。这很明显,MongoDB</span></span><span><span style="font-family:宋体;">使得构徏和执行复杂查询变得非常容易。当实际使用的时候,你会主要å…Ïx³¨äºŽæ•ˆçŽ‡é—®é¢˜ï¼ˆåƒæˆ‘ä¸€æ øP¼‰ã€?/span></span></li><li style=" text-align:left;"><span><span>MongoDB</span></span><span><span style="font-family:宋体;">的烦引是二进制的树。如果你不是很熟悉B-tree</span></span><span><span style="font-family:宋体;">åQŒå¯èƒ½éœ€è¦äº†è§£ä¸€ä¸‹ã€‚这些都涉及到构建符合提供查询条仉™œ€æ±‚的建立索引的方式ã€?/span></span></li><li style=" text-align:left;"><span><span style="font-family:宋体;">ž®å¿ƒçš„设计烦引结构。这涉及åˆîC¸Šé¢æåˆ°çš„B-tree</span></span><span><span style="font-family:宋体;">。刚开始我的烦引包含文档中的很多字ŒDµï¼Œä»¥é˜²æˆ‘会使用åˆîC»–们。不要犯同样的错误。我有一个很ž®é›†åˆçš„索引åQˆå¤§¾U?</span></span><span><span style="font-family:宋体;">千万记录åQ‰å¢žé•¿åˆ°­‘…过17GB</span></span><span><span style="font-family:宋体;">的空é—ß_¼Œæ¯”集合本íw«è¿˜å¤§ã€‚你应该不会惌™¦ç´¢å¼•一个包含成百上千个实体的列表字ŒDüc€?/span></span></li><li style=" text-align:left;"><span><span>MongoDB</span></span><span><span style="font-family:宋体;">采用了非常有意思的方式来实现NoSQL</span></span><span><span style="font-family:宋体;">åQšé‡‡ç”¨BSON</span></span><span><span style="font-family:宋体;">ä½œäØ“å­˜å‚¨åQŒJSON</span></span><span><span style="font-family:宋体;">ä½œäØ“å±•ç¤ºåQŒJavaScript</span></span><span><span style="font-family:宋体;">用于½Ž¡ç†å’ŒMap/Reduce</span></span><span><span style="font-family:宋体;">。因此也引è“v了一些小问题比如</span></span><a ><span><span><span style="font-family: 宋体;color:#0B59B2">˜q™ä¸ª</span></span></span></a><span> </span><span><span style="font-family:宋体;">åQˆç ´åäº†Number</span></span><span><span style="font-family:宋体;">å’ŒLong</span></span><span><span style="font-family:宋体;">的相½{‰æ“ä½œï¼‰åQŒåœ¨MongoDB</span></span><span><span style="font-family:宋体;">逐渐‹¹è¡Œä¹‹åŽåQŒå¯èƒ½ä¼šä¸æ–­çš„展½Cºå‡ºæ¥ã€?/span></span></li></ul> <p><span> </span></p> <h2><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt">MongoDB, </span></span></span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">命ä×o行与驱动</span></span><span></span></h2> <p><span><span>MongoDB基本是ä‹É用JavaScript客户端命令行½E‹åºæ¥è¿›è¡Œå¤æ‚ä“Q务管理的åQŒå¦‚数据整合和简单信息处理,¾~–程都是完全使用JavaScript语言来的。本文中åQŒæˆ‘们会展示命ä×o行的使用½CÞZ¾‹ã€‚现在有大量的MongoDB客户端äñ”品提供,òq¶ä¸”ç”±MongoDB½C‘ÖŒºæ¥æ”¯æŒé©±åŠ¨ã€‚é€šå¸¸æ¯ç§¾~–程语言都有驱动åQŒåƈ且所有流行的语言都有包括åQŒä¸€äº›ä¸é‚£ä¹ˆ‹¹è¡Œçš„也包含在内。这½‹‡æ–‡ç« å±•½CÞZº†ä½¿ç”¨MongoDBçš„Java驱动åQŒåƈ使用一个ORM库(MJORMåQ‰ä¸Žä¹‹è¿›è¡Œæ¯”较ã€?/span></span></p> <h2><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">介绍</span></span></span><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt"> MJORM: MongoDB</span></span></span><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">çš?/span></span><span><span><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing: -.75pt">ORM</span></span></span><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">æ–ÒŽ¡ˆ</span></span></span><span></span></h2> <p><span>在解决的众多有意思的问题中,最˜q?span>NoSQL数据存储在开发者中主要的问题趋势就是对象关¾pÀL˜ ž®„。对象关¾pÀL˜ ž®„就是将传统中保存在关系型数据库中的持久化数据映ž®„äØ“åœ¨åº”ç”¨ç¨‹åºä¸­ä½¿ç”¨çš„å¯¹è±¡ã€‚è¿™ä½¿å¾—¾~–程语言使用èµäh¥æ›´åŠ ‹¹ç•…和自然ã€?/span></span></p> <p><span><span>MongoDB面向文档的架构ä‹É得它非常适合对象关系映射åQŒå› ä¸ºæ–‡æ¡£æœ¬íw«å°±æ˜¯ä»¥å¯¹è±¡å½¢å¼å­˜å‚¨çš„。可惜没有太多的MongoDBçš„Java对象关系映射库,但是˜q˜æ˜¯æœ‰ä¸€äº›ï¼Œå¦?/span></span><a ><span><span><span style="color:#0B59B2">morphia-(A type-safe Java library for MongoDB)</span></span></span></a><span>åQ?span> </span></span><a ><span><span style="color:#0B59B2">spring-data</span></span></a><span><span>(SpringData™å¹ç›®çš„MongoDB实现)</span></span><span></span></p> <p><span>˜q™äº›<span>ORM库大量ä‹É用了注解åQŒå› ä¸ÞZ¸€äº›åŽŸå› å¯¹æˆ‘ä¸é€‚åˆåQŒå…¶ä¸­æœ€é‡è¦çš„就是这些被注解的对象在多个™å¹ç›®ä¸­çš„兼容性问题。这让我开始了mongo-Java-orm 或è€?"MJORM" (发音 me-yorm)™å¹ç›®åQŒä¸€ä¸ªMongoDBçš„Java对象关系映射™å¹ç›®ã€‚MJORM是在MIT许可之下åQŒåƈ且在发布在了</span></span><a ><span><span><span style="color:#0B59B2">google code project</span></span></span></a><span>。项目采ç”?span>maven构徏åQŒåƈ且mavenæž„äšg仓库托管于google code版本控制服务器。MJORMçš„æœ€æ–°å¯ç”¨å‘å¸ƒç‰ˆæœ¬äØ“0.15åQŒå·²¾lç”±ä¸€äº›é¡¹ç›®ä‹É用与生äñ”环境中ã€?/span></span></p> <h2><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">开始ä‹Éç”?/span></span></span><span><span><span style="font-size:14.5pt; font-family:Arial;color:black;letter-spacing:-.75pt">ORM</span></span></span></h2> <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">加入</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">MJORM </span></span></span><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">åº?/span></span></span><span></span></h3> <p><span><span>Mavençš„ä‹É用者首先应当在pom.xml中加入MJORMçš„maven仓库åQŒä‹Éå¾—MJORMæž„äšg可用ã€?/span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"><repository></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <id>mjorm-webdav-maven-repo</id></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <name>mjorm maven repository</name></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <url>http://mongo-Java-orm.googlecode.com/svn/maven/repo/</url></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <layout>default</layout></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"></repository></span></span></span></pre></div> <p><span>然后加入依赖<span>:</span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"><dependency></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <groupId>com.googlecode</groupId></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <artifactId>mongo-Java-orm</artifactId></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <version>0.15</version></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"></dependency></span></span></span></pre></div> <p><span>˜q™æ ·ž®±å¯ä»¥åœ¨åº”用中引å…?span>MJORM代码。假如没有ä‹É用mavenåQŒåˆ™ä½ éœ€è¦æ‰‹åŠ¨ä¸‹è½½MJORMçš„pom.xml中列丄¡š„所有依赖ã€?/span></span></p> <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">建立</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt"> POJOs</span></span></span></h3> <p><span>依赖已经导入åQŒå¯ä»¥å¼€å§‹ç¼–码了。我们从<span>POJOå¼€å§?</span></span><span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">class Author {</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         private String firstName;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         private String lastName;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         // ... setters and getters ...</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">}</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">class Book {</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         private String id;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         private String isbn;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         private String title;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         private String description;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         private Author author;</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         // ... setters and getters ...</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">}</span></span></span></pre></div> <p><span>我们在这个对象模型中的描˜q°æ˜¯åQŒä½œè€…有<span>ID、姓和名åQŒä¹¦æœ‰ID、ISNB、标题、描˜q°å’Œä½œè€…ã€?/span></span></p> <p><span>你可能注意到书的<span>id属性是一个字½W¦ä¸²åQŒè¿™æ˜¯äؓ了适应MongoDB的对象ID¾cÕdž‹ã€‚MongoDBçš„ID是一ä¸?2字节的二˜q›åˆ¶å€¼æ˜¾½CÞZؓ一个十六进制的字符丌Ӏ‚MongoDB要求集合中的每个文档都必™åÀLœ‰ä¸€ä¸ªå”¯ä¸€idåQŒä½†ä¸è¦æ±‚一定要是ObjectId。目前MJORM只支持ObjectIdåQŒåƈ且显½CÞZؓ字符丌Ӏ?/span></span></p> <p><span>你也可能注意åˆîCº†<span>Author没有id字段。这是因为Book是它的父文档åQŒå› æ­¤ä¸éœ€è¦æœ‰id。记住,MongoDB只要求集合中的文档在根çñ”别的idã€?/span></span></p> <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">创徏</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">XML</span></span></span><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">映射文äšg</span></span></span><span></span></h3> <p><span>下一个步骤就是徏ç«?span>XML映射文äšgåQŒMJORM能够ž®†MongoDBæ–‡æ¡£è½¬æ¢ä¸ºå¯¹è±¡ã€‚æˆ‘ä»¬äØ“æ¯ä¸ªæ–‡æ¡£åˆ›å¾ä¸€ä¸ªå¯¹è±¡ä½œä¸ºç¤ºèŒƒï¼Œæ— è®ºž®†æ‰€æœ‰çš„æ˜ å°„攑֜¨ä¸€ä¸ªXMLæ–‡äšg中还是分开都是可以的ã€?/span></span></p> <p><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Author.mjorm.xml</span></code>:</span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"><?xml version="1.0"?></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"><descriptors></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <object class="Author"></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 <property name="firstName" /></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 <property name="lastName" /></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         </object></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"></descriptors></span></span></span></pre></div> <p><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Book.mjorm.xml</span></code>:</span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"><?xml version="1.0"?></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"><descriptors></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         <object class="Book"></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 <property name="id" id="true" auto="true" /></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 <property name="isbn" /></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 <property name="title" /></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 <property name="description" /></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 <property name="author" /></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         </object></span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222"></descriptors></span></span></span></pre></div> <p><span> </span></p> <p><span>˜q™äº›æ˜ å°„æ–‡äšg能够很好的自解释ã€?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">descriptors</span></code> å…ƒç´ æ˜¯æ ¹å…ƒç´ åQŒå¿…™åÕdŒ…含在每个映射文äšg中。在它下面是</span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">object</span></code>元素定义了文档与之对应的¾c…R€?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Object</span></code></span><span><code><span style="font-size:9.0pt;Courier New";Courier New";Courier New"">包含çš?/span></code></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">property</span></code> å…ƒç´ ä¸»è¦ç”¨äºŽæè¿°<span>POJO中的属性以及这些属性如何与MongoDB中的文档惛_¯¹åº”ã€?/span></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">property</span></code> å…ƒç´ è‡›_°‘必须包含一ä¸?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">name</span></code> å±žæ€§ï¼Œ˜q™ä¸ªå…ƒç´ ž®±æ˜¯POJOå’ŒMongoDB的文档中的属性名¿U°ã€?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">column</span></code> å±žæ€§åˆ™æ˜¯å¯é€‰çš„åQŒç”¨äºŽç‰¹å®šä¸€ä¸ªåœ¨MongoDB文档中的可选属性名¿U°ã€?/span></p> <p><span><code><span style="font-size:9.0pt;font-family:"Courier New"">property</span></code> å…ƒç´ å½“中çš?span>id属性应该是对象的唯一识别。一个对象只能有一ä¸?/span></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">property</span></code> å…ƒç´ åŒ…含<span>id属性ã€?/span></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">auto</span></code> çš„设¾|®ä¼šä½¿å¾—MJORMåœ¨æŒä¹…åŒ–æ—¶äØ“è¯¥å±žæ€§è‡ªåŠ¨ç”Ÿæˆä¸€ä¸ªå€¹{€?/span></p> <p><span>可以åœ?span>google codeçš„MJORM™å¹ç›®ä¸»é¡µä¸­æŸ¥çœ‹XML映射文äšg的更多细节描˜q°ã€?/span></span></p> <h3><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">整合</span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">POJO</span></span></span><span><span><span style="font-size:11.5pt;line-height:173%;font-family:宋体;letter-spacing: -.75pt">ä¸?/span></span></span><span><span><span style="font-size:11.5pt; line-height:173%;font-family:Arial;letter-spacing:-.75pt">XML</span></span></span></h3> <p><span>我们创徏了数据模型以及映ž®„æ–‡ä»Óž¼Œä½¿å¾—<span>MJORM可以从MongoDB序列号以及反序列号POJO。我们可以进行一些有意思的事情了,首先打开MongoDB的链接:</span></span><span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">Mongo mongo = new Mongo(</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         new MongoURI("mongodb://localhost/mjormIsFun")); // 10gen driver</span></span></span></pre></div> <p><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Mongo</span></code> å¯¹è±¡æ˜¯ç”±10gen¾~–写的Java驱动提供的。示例中˜qžæŽ¥äº†ä¸€ä¸ªæœ¬åœ°çš„MongoDB实例中的mjormIsFun数据库。接下来我们创徏MJORM </span><span><span><code><span style="font-size:9.0pt; font-family:"Courier New"">ObjectMapper </span></code>。目å‰?/span></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">ObjectMapper </span></code>在MJORM中的唯一实现ž®±æ˜¯</span><span><span><code><span style="font-size:9.0pt; font-family:"Courier New"">XmlDescriptorObjectMapper</span></code>åQŒä‹É用XML¾l“构描述信息。可能之后会增加å¯Ò޳¨è§£æˆ–å…¶ä»–¾l“构定义的支持ã€?/span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">XmlDescriptorObjectMapper objectMapper = new XmlDescriptorObjectMapper();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">mapper.addXmlObjectDescriptor(new File("Book.mjorm.xml"));</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">mapper.addXmlObjectDescriptor(new File("Author.mjorm.xml"));</span></span></span></pre></div> <p><span>建立好了</span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">XmlDescriptorObjectMapper</span></code> òq¶ä¸”加入了映ž®„文件。接下来建立由MJORM提供çš?/span><span><span><code><span style="font-size:9.0pt; font-family:"Courier New"">MongoDao</span></code> å¯¹è±¡çš„实例ã€?/span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">DB db = mongo.getDB("mjormIsFun"); // 10gen driver</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">MongoDao dao = new MongoDaoImpl(db, objectMapper);</span></span></span></pre></div> <p><span>首先我们要获å¾?span>10gen驱动提供的DB对象实例。然后ä‹É用DBå’?/span></span><span><span><code><span style="font-size:9.0pt; font-family:"Courier New"">ObjectMapper</span></code> å»ºç«‹</span></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">MongoDao</span></code> ã€‚我们准备开始持久化数据åQŒå¾ç«‹ä¸€ä¸?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Book</span></code> ç„¶åŽä¿å­˜åˆ°MongoDB中ã€?/span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">Book book = new Book();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setIsbn("1594743061");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setTitle("MongoDB is fun");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setDescription("...");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book = dao.createObject("books", book);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">System.out.println(book.getId()); // 4f96309f762dd76ece5a9595</span></span></span></pre></div> <p><span>首先建立</span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Book</span></code> å¯¹è±¡òq¶ä¸”å¡«å€û|¼Œç„¶åŽè°ƒç”¨</span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">MongoDao</span></code> çš?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New""> createObject</span></code> æ–ÒŽ³•åQŒå°†</span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Book</span></code> å¯¹è±¡ä¼ å…¥"</span><span><span><code><span style="font-size:9.0pt; font-family:"Courier New"">books</span></code>" 的集合中。MJORM会按照之前的xml映射文äšgž®?/span></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">Book</span></code> è½¬æ¢ä¸?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">DBObject</span></code> (˜q™æ˜¯10gençš„Java驱动使用的基本类åž?åQŒåƈ保存一个新的文档进"</span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">books</span></code>" 集合。MJORM˜q”回Book对象æ—Óž¼Œid属性会被填充。请注意åQŒMongoDB默认是不需要在使用前徏立数据库或集合的åQŒç³»¾lŸä¼šåœ¨éœ€è¦æ—¶è‡ªåŠ¨åˆ›å¾åQŒè¿™å¯èƒ½ä¼šé€ æˆæŸäº›å›°æ‰°ã€‚在MongoDB的命令行中查看Book对象大概如下åQ?/span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">> db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">{</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "_id":          ObjectId("4f96309f762dd76ece5a9595"),</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "isbn":         "1594743061",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "title":        "MongoDB is fun",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "description": "..."</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">}</span></span></span></pre></div> <p><span> </span></p> <p><span>我们来看看假如不ç”?span>MJORM而直接ä‹Éç”?0gençš„Java驱动åQŒå¦‚何ä‹Éç”?/span></span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">createObject</span></code> æ–ÒŽ³•åQ?/span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">Book book = new Book();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setIsbn("1594743061");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setTitle("MongoDB is fun");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setDescription("...");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">DBObject bookObj = BasicDBObjectBuilder.start()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .add("isbn",              book.getIsbn())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .add("title",             book.getTitle())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .add("description",       book.getDescription())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .get();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">// 'db' is our DB object from earlier</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">DBCollection col = db.getCollection("books");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">col.insert(bookObj);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">ObjectId id = ObjectId.class.cast(bookObj.get("_id"));</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">System.out.println(id.toStringMongod()); // 4f96309f762dd76ece5a9595</span></span></span></pre></div> <p><span> </span></p> <p><span>下面˜q›è¡Œå¯¹è±¡çš„æŸ¥è¯?span>:</span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">Book book = dao.readObject("books", "4f96309f762dd76ece5a9595", Book.class);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">System.out.println(book.getTitle()); // "MongoDB is fun"</span></span></span></pre></div> <p><span><code><span style="font-size:9.0pt;font-family:"Courier New"">readObject</span></code> æ–ÒŽ³•æ ÒŽ®¾l™å®šæ–‡æ¡£çš„id从指定的集合中读取文档,转换为对象(再次使用映射文äšgåQ‰åƈ˜q”回ã€?/span></p> <p><span>敏锐的读者会注意åˆ?span>Book˜q˜æ²¡æœ‰æŒ‡å®šAuthoråQŒä»ç„¶ä¿å­˜äº†ã€‚这归咎于MongoDB的结构不敏感的特性。我们不能要求集合中的文档包含所有属性(id属性是必须的)åQŒæ‰€æœ‰åœ¨MongoDB中没有Authorçš„Bookæ˜¯å¯ä»¥çš„ã€‚æˆ‘ä»¬çŽ°åœ¨äØ“Bookæ·ÕdŠ ä¸€ä¸ªAuthoròq¶ä¸”更新一下:</span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">Author author = new Author();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">author.setFirstName("Brian");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">author.setLastName("Dilley");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setAuthor(author);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">dao.updateObject("books", "4f96309f762dd76ece5a9595", book);</span></span></span></pre></div> <p><span>现在<span>Bookž®±åŒ…含了AuthoråQŒåƈ且在MongoDB中持久化了。现在在命ä×o行查看了BookåQ?/span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">> db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">{</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "_id":          ObjectId("4f96309f762dd76ece5a9595"),</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "isbn":         "1594743061",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "title":        "MongoDB is fun",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "description": "..."</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         "author": {</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">             "firstName": "Brian",</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">             "lastName": "Dilley"</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         }</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">}</span></span></span></pre></div> <p><span>可以看到持久化的<span>Book中已¾låŒ…含了author。不使用MJORM来操作一遍:</span></span></p> <div style="border:solid #EFEFEF 1.5pt;padding: 0cm 0cm 4.0pt 0cm;background:#FAFAFA"><pre style="line-height:11.25pt; background:#FAFAFA;border:none;padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">Author author = new Author();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">author.setFirstName("Brian");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">author.setLastName("Dilley");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">book.setAuthor(author);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">DBObject bookObj = BasicDBObjectBuilder.start()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .add("isbn",              book.getIsbn())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .add("title",             book.getTitle())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .add("description",       book.getDescription())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .push("author")</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 .add("firstName",         author.getFirstName())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 .add("lastName", author.getLastName())</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">                 .pop()</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">         .get();</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">DBCollection col = db.getCollection("books");</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span><span><span style="font-size:9.0pt; font-family:"Courier New";color:#222222">col.update(new BasicDBObject("_id", bookObj.get("_id")), bookObj);</span></span></span></pre><pre style="line-height:11.25pt;background:#FAFAFA;border:none; padding:0cm;"><span> </span></pre></div> <p><span> </span></p> <p><span>对于</span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">MongoDao</span></code> æ–ÒŽ³•的深入讨论已¾lè¶…å‡ÞZº†æœ¬æ–‡çš„范围。对于将MJORM有兴­‘£ç”¨äºŽå®žé™…项目中的用户强烈徏议了解一下MJORM™å¹ç›®æä¾›çš„相å…Ïx–‡æ¡£ï¼Œæˆ–è€?/span><span><code><span style="font-size:9.0pt;font-family:"Courier New"">MongoDao</span></code> æŽ¥å£æä¾›çš„相关用法ã€?/span></p> <h2><span><span><span style="font-size:14.5pt;color:black; letter-spacing:-.75pt">æ€È»“</span></span></span><span></span></h2> <p><span>希望˜q™ç¯‡æ–‡ç« å¯?span>MongoDBå’ŒMJORM的亮ç‚ÒŽœ‰æ‰€å±•示。MongDB是一个优¿U€çš„呃NoSQL数据存储åQŒæœ‰ç€å¤§é‡ä¼˜ç§€çš„特性,会是NoSQL市场中长期竞争者。若你会在一个Java™å¹ç›®ä¸­ä‹É用MongoDBåQŒå¸Œæœ›ä½ ä¹Ÿèƒ½å¤Ÿè€ƒè™‘使用MJORMä½œäØ“ä½ çš„ORM框架。十分欢˜qŽå¤§å®¶æäº¤ç‰¹æ€§éœ€æ±‚、错误异常报告、文档和源码修正ã€?/span></span></p> <p style="line-height:12.0pt;background:white"><span> </span></p> <h2><span><span style="font-size:14.5pt;color:black;letter-spacing:-.75pt">作è€?/span></span><span><span><span style="font-size:14.5pt;font-family:Arial;color:black;letter-spacing: -.75pt"> Bio</span></span></span></h2> <p style="line-height:12.0pt;background:white"><span><span><strong><span style="font-size:10.0pt; font-family:Tahoma;color:black">Brian Dilley</span></strong></span></span><span><span> </span></span><span><span><span style="font-size:10.0pt;color:black">是一个经验丰富的高çñ”工程师以及项目领å¯û|¼Œåœ?/span></span></span><span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Java/Java EE /Spring Framework/Linux</span></span></span><span><span style="font-size:10.0pt;color:black">内部¾l“构理解和管理有着­‘…过</span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">13</span></span><span><span style="font-size:10.0pt;color:black">òq´çš„¾léªŒã€?/span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Brian</span></span><span><span style="font-size:10.0pt;color:black">对于创业公司有很多经验,推向市场åQŒæž„å»?/span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">/</span></span><span><span style="font-size:10.0pt;color:black">¾l´æŠ¤äº§å“½{‰ã€‚ä»–æ˜?/span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Iaas</span></span><span><span style="font-size:10.0pt;color:black">ã€?/span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">cloud</span></span><span><span style="font-size:10.0pt;color:black">ã€?/span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">PHP</span></span><span><span style="font-size:10.0pt;color:black">å’?/span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">Linux</span></span><span><span style="font-size:10.0pt;color:black">的专å®Óž¼Œç†Ÿæ‚‰äº§å“çš„采购、安装及配置定义åQŒä»¥åŠå…¬å¸çš„软硬件架构包括负载均衡、数据库、微博等。可ä»?/span></span><span><span style="font-size:10.0pt;font-family:Tahoma;color:black">follow Brian</span></span><span><span style="font-size:10.0pt;color:black">çš?/span></span><span><span> </span></span><a ><span><span><span style="font-size:10.0pt; font-family:Tahoma;color:#0B59B2">Twitter</span></span></span></a><span> </span><span><span style="font-size:10.0pt;color:black">ã€?/span></span><span></span></p> </div><img src ="http://www.aygfsteel.com/matuobasyouca/aggbug/377698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/matuobasyouca/" target="_blank">一酌散千忧</a> 2012-05-09 13:46 <a href="http://www.aygfsteel.com/matuobasyouca/archive/2012/05/09/377698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据集成的演化:从EII到Big Datahttp://www.aygfsteel.com/matuobasyouca/archive/2012/04/19/375213.html一酌散千忧一酌散千忧Wed, 18 Apr 2012 23:15:00 GMThttp://www.aygfsteel.com/matuobasyouca/archive/2012/04/19/375213.htmlhttp://www.aygfsteel.com/matuobasyouca/comments/375213.htmlhttp://www.aygfsteel.com/matuobasyouca/archive/2012/04/19/375213.html#Feedback0http://www.aygfsteel.com/matuobasyouca/comments/commentRss/375213.htmlhttp://www.aygfsteel.com/matuobasyouca/services/trackbacks/375213.html“企业信息集成åQ?/span>EIIåQ‰ï¼šå®žç”¨æ–¹å¼”äº?/span>2005òq´å‘布,描述了一套集成不同数据源的方法论åQŒåˆ©ç”¨äº†å½“时的先˜q›æŠ€æœ¯ï¼Œå¦‚面向服务架构(SOAåQ‰ã€?/span>Web Servicesã€?/span>XML、资源描˜q°æž¶æž„(RDFåQ‰ã€åŸºäº?/span>XML的元数据格式以及数据提取、è{换和加蝲åQ?/span>ETLåQ‰ã€?/span>EII能够基本为关¾pÕdž‹æ•°æ®å…ƒç´ æä¾›¾lŸä¸€è§†è§’åQŒä½†åœ¨æ€§èƒ½æ•ˆçŽ‡ä¸Šç¼ºä¹èƒ½å¤Ÿæ›¿ä»£æ•°æ®ä»“åº“å’Œå¤šç»´æ•°æ®åº“çš„èƒ½åŠ›ã€‚äº”òq´ä¹‹åŽæŠ€æœ¯å·²¾lå¾—åˆîCº†æ˜¾è‘—提升åQŒä¸ä»…在于对于分散数据的操作åQŒè¿˜æœ‰ç®€åŒ–了单一容器下不同数据的整合åQŒä»¥åŠå¯¹æ•°æ®æ·±å…¥æŒ–掘的能力ã€?/span>

转变了数据管理方式的技术正是虚拟化。低成本存储、云计算ã€?/span>NoSQL数据库以å?/span>Hadoop。当我们提è“v虚拟化时åQŒå·²¾lè¿œ˜qœè¶…å‡ÞZؓ一台物理机器提供一套èÊY件实例这一概念。时至今日,我们可以虚拟化服务器、存储以及网¾lœã€‚所有这些虚拟化意味着我们不再被这些物理条件所限制åQŒèƒ½å¤Ÿè¿…速构建物理环境以支持我们特定时刻的特定需求。当面对Gbã€?/span>Tbã€?/span>Pb½{‰çñ”数据量的处理需求时åQŒæˆ‘们基本能摆脱¾l“æž„åŒ–çš„æ•°æ®ä»“åº“ã€‚æˆ‘ä»¬ä¸åœ¨éœ€è¦ä»…ä»…äØ“äº†å‘æŽ˜ä¸šåŠ¡çš„æŸä¸€æ–šw¢è€Œå¾ç«‹ä¸€ä¸ªç‰¹ŒDŠçš„环境了ã€?/span>

低成本存储在业务的数据存储方面节省了开支。高昂的存储成本会ä‹É得企业寻扑֜¨é™å®šè§„模的数据之上进行关键业务分析的æ–ÒŽ¡ˆåQŒè¿™æ ·ä‹É得如何选择最重要的数据变得十分关键,而且˜q˜é™åˆ¶äº†¾pȝ»Ÿèƒ½å¤Ÿå¤„理的数据的质量ã€?/span>

负面影响便是业务最¾lˆå¯èƒ½é¢ä¸´å¾ˆž®‘的选择åQŒå› ä¸ºæ²¡æœ‰èƒö够的历史数据提供从而识别一个有效关键模式。或者因为高昂的投入使得业务被停止,而ä‹É用常规惯例来识别模式ã€?/span>

云计½Ž—äØ“é‚£äº›éœ€è¦é€šè¿‡‹¹·é‡æ•°æ®æºåœ¨åˆç†æ—‰™—´èŒƒå›´å†…äñ”生结果的需求提供了一个可用的方式。æ“v量数据处理需要两点:å¼ÒŽ€§å­˜å‚¨ï¼ŒCPU。高速网¾lœå¾ˆæœ‰å¸®åŠ©ï¼Œä½†æ˜¯å¾…ä¼šæˆ‘ä»¬ä¼šçœ‹åˆ°åœ¨å‘æŽ˜è½¯äšg在处理æ“v量数据时åQŒå®ƒòq‰™žæ˜¯ç³»¾lŸçš„瓉™¢ˆã€‚弹性存储意味着企业不会在期望操作的数据规模或类型上受到限制åQŒé™ä½Žäº†ä½¿ç”¨æ•°æ®ä»“库无法获取最佳结果的风险。更多的CPU使得¾l“果能够在期望的旉™—´èŒƒå›´å†…更快的被交付ã€?/span>

NoSQL提供了æ“v量数据的支持åQŒä½†ä¸Žä¼ ¾lŸçš„关系型数据库没有兌™”。而且大部åˆ?/span>NoSQL数据库是开源的åQŒæ— ™åÀL”¯ä»˜è´­ä¹°è¯ä¹¦ç­‰è´¹ç”¨ã€?/span>NoSQL对于表结构有着惊äh的灵‹zÀL€§ï¼Œæ— é¡»éšç€¾pȝ»Ÿçš„æ”¹˜q›è€Œä¸æ–­ä¿®æ”¹å®Œå–„定义ã€?/span>NoSQLå¯ä»¥æ”¯æŒä¸åŒæ•°æ®æºçš„åˆåÆˆæŸ¥çœ‹åQŒä»Žè€Œæˆä¸?/span>EII之后另一个备选方案,˜q™æˆ–许是NoSQL最重要的方面了ã€?/span>

NoSQL内置了数据冗余与分布式数据存储机制。æ“v量数据的最大问题之一ž®±æ˜¯¼‚ç›˜è¯Õd†™åQ?/span>NoSQL通过ž®†æ•°æ®åˆ†å¸ƒè‡³ä¸€¾pÕdˆ—节点来缓解这个问题。当一个查询请求发出时åQŒè¿™äº›èŠ‚ç‚¹èƒ½å¤ŸåÆˆè¡ŒæŸ¥è¯¢è‡ªíw«èŠ‚ç‚¹ï¼Œè€Œä¸æ˜¯ä»…ä»…ä¾é ä¸€å—ç£ç›˜ï¼Œä¸€ä¸ªç£ç›˜é˜µåˆ—æˆ–ä¸€æ¡ç½‘¾lœè¿žæŽ¥ç­‰åQŒæ•°æ®æŸ¥è¯¢èƒ½å¤Ÿåœ¨èŠ‚çœäº†è¯»å†™å¼€æ”¯ä¹‹åŽå˜å¾—æ›´åŠ è¿…é€Ÿã€?/span>

最¾lˆï¼Œæˆ‘们来讨è®?/span>HadoopåQŒé›†åˆäº†ä¸Šè¿°æ‰€æœ‰æŠ€æœ¯åŠ›é‡ä¸Žä¸€íw«çš„用于‹‚€‹¹‹å’Œåˆ†æžæ•°æ®çš„æ¡†æž¶ã€‚有些ähå¯èƒ½è®¤äØ“Hadoop是一™å?/span>NoSQL技术,实际ä¸?/span>Hadoop是一个分布组件的java框架åQŒç”¨äºŽåˆ†è§?#8220;吃大è±?#8221;åQˆæ­¤å¤„也双关Hadoop是以创立者的儿子¾l™è‡ªå·Þqš„一个大象玩兯‚“v的名字)的工ä½?#8212;—每次一口ã€?/span>

Hadoop自èín实际上与待处理数据是各自独立的。它ž®†å¤§åž‹æŸ¥è¯¢ä“QåŠ¡åˆ†è§£äØ“ž®çš„òq¶è¡ŒæŸ¥è¯¢ä»ÕdŠ¡åQŒç„¶åŽæ”¶é›†ç»“果,òq¶æ•´åˆå‡º½{”案˜q”回¾l™ç”¨æˆ—÷€?/span>Hadoop相对äº?/span>NoSQLæ¥è¯´æ˜¯ä¸€ä¸ªåÆˆè¡ŒæŸ¥è¯¢æ¡†æžÓž¼Œé€šè¿‡äº‘计½Ž—驱动节点,˜qè¡Œåœ¨ä½Žæˆæœ¬å­˜å‚¨åŠè™šæ‹ŸåŒ–技术之上ã€?/span>

Kicking的知识回™å?/span>

å½?/span>EII½W¬ä¸€‹Æ¡ä½œä¸ºæœ€ä½›_®žè·µå‡ºçŽîCºŽ2003-2004òqß_¼Œå…³é”®è¦ç´ ž®±æ˜¯æ— éœ€å†ç§»åŠ¨æ•°æ®äº†ã€‚å½“æ—¶å¤§éƒ¨åˆ†çš„æ•°æ®ä¸­å¿ƒä»ç„¶è¿è¡ŒäºŽä½Žé€Ÿç½‘¾lœä¸­åQŒæœ‰é™çš„½Iºé—´ç”¨äºŽå¤åˆ¶æ•°æ®ã€‚之后,EIIæˆäØ“äº†å½“æ—¶å¯ç”¨æŠ€æœ¯å’Œé—®é¢˜åŸŸä¸­æœ€ä¼˜ç§€çš„è§£å†Ïx–¹æ¡ˆã€?/span>EII的某些方面的优秀即ä‹É在æ“v量数据中也是很显著的ã€?/span>

EII的优点之一ž®±æ˜¯ž®†å¤„理过½E‹è{¿UÕdˆ°æ•°æ®æ‰€åœ¨åœ°ã€‚æ“v量数据方案的关键架构要素之一ž®±æ˜¯ž®†å¤„理过½E‹è{¿UÕdˆ°æ•°æ®æ‰€åœ¨åœ°åQŒè€Œä¸æ˜¯è{¿UÀL•°æ®ã€?/span>EII中的一个重要原则就是ä‹É用数据归属地的查询功能。这™å¹å®žè·µå°±æ˜¯æž„建靠˜q‘数据源¾|‘络çš?/span>Web ServiceåQŒèƒ½å¤Ÿå¾ç«‹è“v通用查询接口åQŒä½†åªé’ˆå¯ÒŽœ¬åœ°æ•°æ®åº“˜q›è¡ŒæŸ¥è¯¢ã€‚我们通过开攄¡š„åŸÞZºŽWeb的接口解决了数据的专有格式的问题åQŒä»Žè€Œä‹É得多个数据子集能够迅速的整合òq¶ä»¥¾lŸä¸€æ¨¡å¼å±•示ã€?/span>

有了低成本存储和10G¾|‘络之后åQŒæˆ‘们就不必那么担心数据冗余与数据迁¿U»ï¼Œä½†è¿˜æ˜¯æœ‰å…¶ä»–问题存在的,数据仓库无法¼‹®ä¿æ•°æ®çš„原始性便是其中之一。在EII中,我们ž®†ä»ŽåŽŸå§‹æ•°æ®æºèŽ·å–æ•°æ®è§†ä¸?#8220;黄金准则”åQŒè¿™æ ·å°±èƒ½å¤Ÿä¿è¯ä¿¡æ¯æœªè¢«ä¿®æ”¹˜q‡ï¼Œä¸”是准确的ã€?/span>

Big Data要求数据必须转移到新的物理位¾|®ï¼Œ˜q™æ ·å¯ä¿¡ä»Õdº¦åˆæˆä¸ÞZº†é—®é¢˜ã€?/span>EII的那些获取基¾U¿æ•°æ®çš„æœ€ä½›_®žè·µä»ç„¶æ˜¯ç›¸å…³è€Œä¸”重要的。实际上åQŒé‚£äº›äØ“EII设计开发的Web Services接口最¾lˆåœ¨Big Data的启用中扮演主要角色ã€?/span>

当然åQŒè®¨è®ºæ•°æ®ç®¡ç†ä¸èƒ½ä¸æ¶‰åŠåˆ°å®‰å…¨é—®é¢˜ã€?/span>EII在安全领域中˜q˜æ˜¯­‘…过äº?/span>Big Data。技术上来说åQ?/span>Big Data在数据集成方面更加高效与敏捷åQŒä½†æ˜¯å¤§éƒ¨åˆ†¾~ºå°‘äº†å›ºæœ‰çš„å®‰å…¨æ€§ï¼Œå› äØ“åœ¨è®¾è®¡ä¸Šä¼šåŠ å¤§å¤„ç†çš„éš‘Öº¦ã€‚所以,可能要由源系¾lŸæ¥æ‹…ä“Qèµäh•°æ®è®¿é—®å®‰å…¨æ–¹é¢çš„è´£ä“Q。因ä¸?/span>EII直接在源¾pȝ»Ÿä¸­æŸ¥è¯¢æ•°æ®ï¼Œæ‰€ä»¥å¿…™å»è¦æ±‚有适当的授权,否则查询ž®±å°†å¤ÞpÓ|ã€?/span>

上述关于安全讨论描述的是内在的安全控制情å†üc€‚将讉K—®æƒé™æŽ§åˆ¶åˆ—表集成˜q›æ•°æ®åº“是非常合理的åQŒè¿™ž®†ç¡®ä¿å®‰å…¨èƒ½å¤Ÿä½œä¸ºæŸ¥è¯¢çš„一部分˜q›è¡Œ¾l´æŠ¤ã€‚然后,一旦能够直接查è¯?/span>NoSQL数据源,ž®±æ„å‘³ç€èƒ½å¤Ÿè‡ªç”±çš„访问你所有的数据ã€?/span>

æ€È»“

引用老的Virginia Slims的广告中的台词:“我们已经历很长的路途了åQŒå®è´å„¿åQ?#8221;文中讨论到的技术的发展已经å¯?/span>21世纪½W¬äºŒä¸?/span>10òq´ä¸­çš„的数据解决æ–ÒŽ¡ˆäº§ç”Ÿäº†å·¨å¤§çš„影响。商业化与小型化扫除了一些思想体系上的障碍åQŒä‹É得架构师能够专注于问题本íw«ï¼Œè€Œä¸æ˜¯å¯»æ‰¾ä¸€äº›å®žç”¨åŠå¯å®žçŽ°çš„é—®é¢˜è§£å†³æ–ÒŽ¡ˆã€‚æž„å»?/span>10000个节点的处理引擎åQŒèƒ½å¤Ÿåœ¨æ•°ç§’内处ç?/span>Pb¾U§åˆ«çš„æ•°æ®é‡åQŒå´åªæ¶ˆè€—每ž®æ—¶å‡ ä¾¿å£«ï¼Œ˜q™å°±æ˜¯æ•°æ®å¤„理的¾ŸŽå¥½å‰æ™¯ã€?/span>

有了˜q™äº›æ–°å·¥å…øP¼Œæˆ‘们ž®Þp¦é‡æ–°è€ƒè™‘如何推进数据½Ž¡ç†ã€‚äØ“ä½•æ•°æ®æ— æ³•è¢«å¾ˆå¥½åœ°è¢«¾l´æŠ¤æ•´åˆåQŒåƈ且需要花è´ÒŽ•°ä¸‡ç¾Žå…ƒã€‚数据管理几乎是每个大中型企业的心病。数据管理曾¾låœ¨å­˜å‚¨ã€ç®¡ç†ã€è®¿é—®ã€æ•´åˆä»¥åŠæŸ¥è¯¢ä¸ŠèŠÞp´¹å·¨å¤§åQŒä½†æ˜¯ä»ŠåŽä¸å†ä¼šæ˜¯è¿™æ ·äº†ã€?/span>

关于作�/span>

JP Morgenthal 是在IT½{–略与云计算斚w¢çš„世界çñ”专家之一。他在企业复杂问题域的解å†Ïx–¹æ¡ˆå®žæ–½ä¸Šæœ‰ç€25òq´çš„¾léªŒã€?/span>JP Morgenthal以其在技术方面的深度和广度,有利的支持他在企业问题域中的敏感度。他在集成、èÊY件开发和云计½Ž—是一位让人尊敬的作者,同时也是InfoQ在引领云计算斚w¢çš„编辑,òq¶ä¸”参与äº?#8220;云计½Ž—:评估风险”™å¹ç›®ã€?/span> 

 

原文�/span>接:http://www.infoq.com/articles/DataIntegrationFromEIItoBigData



]]>
Maven™å¹ç›®½Ž¡ç†ç†è§£ä¸Žä‹Éç”?/title><link>http://www.aygfsteel.com/matuobasyouca/archive/2012/04/06/373470.html</link><dc:creator>一酌散千忧</dc:creator><author>一酌散千忧</author><pubDate>Fri, 06 Apr 2012 06:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/matuobasyouca/archive/2012/04/06/373470.html</guid><wfw:comment>http://www.aygfsteel.com/matuobasyouca/comments/373470.html</wfw:comment><comments>http://www.aygfsteel.com/matuobasyouca/archive/2012/04/06/373470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/matuobasyouca/comments/commentRss/373470.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/matuobasyouca/services/trackbacks/373470.html</trackback:ping><description><![CDATA[<p><span style="font-family:宋体;Times New Roman";Times New Roman"">™å¹ç›®¾lç†åQ?/span>Project manager<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰æ˜¯™å¹ç›®çš„æ”¯æŸ×ƒ¸Žæ ¸å¿ƒåQŒç»´åŸºç™¾¿U‘的定义åQšé¡¹ç›®ç»ç†æ˜¯™å¹ç›®½Ž¡ç†æ–šw¢çš„专å®Óž¼Œè´Ÿè´£™å¹ç›®çš„策划、执行和¾l“束åQŒå³æ•´ä¸ªç”Ÿå‘½å‘¨æœŸ˜q‡ç¨‹ã€‚项目经理手中的“òq²å°†èŽ«é‚ª”便是软äšg开发过½E‹æ–¹æ³•(</span>software development process/software development life cycle (SDLC)<span style="font-family: 宋体;Times New Roman";Times New Roman"">åQ‰ï¼Œå¯èƒ½é‡‡å–的有</span>RUP<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span>Rational Unified Process<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ï¼Œæ•æ·½{‰ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">其实软äšg开发区分阶ŒDµå·²¾lå¹¿ä¸ºå¤§å®¶æŽ¥å—ï¼Œæ™®éçš„æ¦‚å¿µå³éœ€è¦åŒºåˆ†äØ“åˆ†æžã€è®¾è®¡ã€å®žæ–½ã€æµ‹è¯•ã€å‘å¸ƒï¼Œ˜q‡ç¨‹ä¸­ä¼šäº§ç”Ÿè‹¥å¹²äº§ç‰©åQŒå¦‚需求说明书、概要设计、详¾l†è®¾è®¡ç­‰ã€‚若提及˜q‡ç¨‹æ–ÒŽ³•åQŒå¦‚</span>RUP<span style="font-family:宋体;Times New Roman";Times New Roman"">的话åQŒä¸»è¦åˆ†ä¸ºå››å¤§é˜¶ŒDµï¼Œå…ˆå¯åQ?/span>Inception<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ã€ç²¾åŽï¼ˆ</span>Elaboration<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ã€æž„建(</span>Construction<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ã€äº¤ä»˜ï¼ˆ</span>Transition<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰è„P代的开发方式,è€?/span>Scrum<span style="font-family:宋体;Times New Roman";Times New Roman"">的核心概念则æ˜?/span>Sprint<span style="font-family:宋体;Times New Roman";Times New Roman"">ã€?/span></p> <p> </p> <p>Maven<span style="font-family:宋体;Times New Roman";Times New Roman"">在项目管理中有那些帮助呢åQ?/span>Maven<span style="font-family:宋体;Times New Roman";Times New Roman"">èƒ½å¤Ÿä»Žä¸€ä¸ªä¿¡æ¯ä¸­å¿ƒäØ“™å¹ç›®æä¾›æž„徏åQŒæŠ¥å‘Šï¼Œæ–‡æ¡£¾~–制½{‰å·¥ä½œã€‚在</span>Maven<span style="font-family:宋体;Times New Roman";Times New Roman"">官方介绍ã€?/span>What is maven<span style="font-family:宋体;Times New Roman";Times New Roman"">》中介绍äº?/span>maven<span style="font-family:宋体;Times New Roman";Times New Roman"">的项目目标(</span>Objectives<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ï¼ˆ</span><a >http://maven.apache.org/what-is-maven.html</a><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ï¼Œå¦‚下åQ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><span style="font-family:宋体;Times New Roman";Times New Roman"">½Ž€åŒ–æž„å»ø™¿‡½E?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><span style="font-family:宋体;Times New Roman";Times New Roman"">提供¾lŸä¸€çš„æž„建系¾l?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><span style="font-family:宋体;Times New Roman";Times New Roman"">提供™å¹ç›®è´¨é‡ä¿¡æ¯</span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><span style="font-family:宋体;Times New Roman";Times New Roman"">提供对于开发最佛_®žè·ëŠš„指导</span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><span style="font-family:宋体;Times New Roman";Times New Roman"">允许对于新特性的透明整合</span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">对于</span>Maven<span style="font-family:宋体;Times New Roman";Times New Roman"">影响最为深åˆÈš„ž®±æ˜¯å®ƒçš„æž„徏¾pȝ»ŸåQŒå‡ ä¹Žè¯½I¿äº†æ•´ä¸ªå®žæ–½é˜¶æ®µã€‚作为对比我们参考一ä¸?/span>RUP<span style="font-family:宋体;Times New Roman";Times New Roman"">çš?/span>Construction<span style="font-family:宋体;Times New Roman";Times New Roman"">阶段åQŒä»¥å?/span>Scrum<span style="font-family:宋体;Times New Roman";Times New Roman"">的单ä¸?/span>Sprint<span style="font-family:宋体;Times New Roman";Times New Roman"">˜q‡ç¨‹ã€?/span></p> <p> </p> <p>RUP<span style="font-family:宋体;Times New Roman";Times New Roman"">çš?/span>Construction<span style="font-family:宋体;Times New Roman";Times New Roman"">阶段的目标:</span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">˜q™ä¸ªé˜¶æ®µçš„ç›®æ ‡æ˜¯æ¾„æ¸…éœ€æ±‚åÆˆåŸÞZºŽæž¶æž„基线完成开发ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">通过优化资源来羃减开支,òq‰™¿å…æ— æ„ä¹‰çš„争执与˜q”å·¥ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"; color:red">实用性与质量兼具ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"; color:red">ž®½å¿«å‘布可用版本ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">完成å¯Òމ€æœ‰åŠŸèƒ½çš„åˆ†æžã€è®¾è®¡ã€å¼€å‘ã€æµ‹è¯•ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">采用增量˜q­ä»£çš„æ¨¡å¼å®Œæˆå¼€å‘åÆˆå‡†å¤‡äº¤ä»˜ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"; color:red">‹‚€æŸ¥é¡¹ç›®å‘布的所有资源是否已¾lå‡†å¤‡å®Œå…¨ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">形成™å¹ç›®¾l„之间的òq¶è¡Œå¼€å‘ã€?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">在《硝烟中çš?/span>Scrum<span style="font-family:宋体;Times New Roman";Times New Roman"">ä¸?/span>XP<span style="font-family: 宋体;Times New Roman";Times New Roman"">》一书中åQŒä»‹¾läº†ä½œè€…实æ–?/span>Scrum<span style="font-family:宋体;Times New Roman";Times New Roman"">的过½E‹ã€‚在一ä¸?/span>Sprint<span style="font-family:宋体;Times New Roman";Times New Roman"">中,不是只有</span>Sprint backlog<span style="font-family:宋体;Times New Roman";Times New Roman"">ã€?/span>burn down chat<span style="font-family:宋体;Times New Roman";Times New Roman"">½{‰ï¼Œå®žæ–½˜q‡ç¨‹ä¸­çš„æ•æ·æ€æƒ³ä¹Ÿæ˜¯å…¶ä¸­çš„æ ¸å¿ƒï¼Œæˆ‘们来看看敏捷信奉的一部分最佛_®žè·µï¼š</span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">½Ž€å•设计(</span><span style="font-size:9.0pt">Simple Design</span><span style="font-size: 9.0pt;font-family:宋体;Times New Roman";Times New Roman"">åQ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">¾l“对¾~–程åQ?/span><span style="font-size:9.0pt">Pair Programming</span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">åQ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"; color:red">‹¹‹è¯•驱动åQ?/span><span style="font-size:9.0pt;color:red">Test-Driven Development</span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman";color:red">åQ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"; color:red">ž®è§„模发布(</span><span style="font-size:9.0pt;color:red">Small Releases</span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman";color:red">åQ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"; color:red">持箋集成åQ?/span><span style="font-size:9.0pt;color:red">Continuous Integration</span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman";color:red">åQ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">集体拥有代码åQ?/span><span style="font-size:9.0pt">Collective Code Ownership</span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">åQ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size: 9.0pt;font-family:Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">          </span></span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">¾~–码标准åQ?/span><span style="font-size:9.0pt">Coding Standard</span><span style="font-size:9.0pt;font-family:宋体;Times New Roman";Times New Roman"">åQ?/span></p> <p> </p> <p>Maven<span style="font-family:宋体;Times New Roman";Times New Roman"">对于上述目标中的质量åQˆå®žç”¨æ€§ä¸Žè´¨é‡åQŒä»¥‹¹‹è¯•驱动åQ‰ã€å¯ç”¨ï¼ˆå¯ç”¨ç‰ˆæœ¬åQŒå°è§„模åQ‰ã€èµ„源管理等均能发挥较大的作用。主要是其定义了一套完整优¿U€çš„æž„建生命周期机åˆÓž¼Œå…¶åŸºæœ¬é˜¶ŒDµå¦‚下:</span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings; color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong><span style="color:red">validate</span></strong><span style="color:red"> – </span><span style="font-family:宋体;Times New Roman";Times New Roman";color:red">验证™å¹ç›®æ­£ç¡®æ€§åŠä¾èµ–有效æ€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong>compile</strong> – <span style="font-family: 宋体;Times New Roman";Times New Roman"">¾~–译™å¹ç›®æºç </span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings; color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong><span style="color:red">test</span></strong><span style="color:red"> – </span><span style="font-family:宋体;Times New Roman";Times New Roman";color:red">使用合适的单元‹¹‹è¯•框架对编译后的源码进行测试,‹¹‹è¯•代码不会被打包或发布</span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong>package</strong> –<span style="font-family: 宋体;Times New Roman";Times New Roman"">ž®†ç¼–译后的代码以规定格式打包åQŒå¦‚</span>Jar</p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings; color:red">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong><span style="color:red">integration-test</span></strong><span style="color:red"> – </span><span style="font-family:宋体;Times New Roman";Times New Roman";color:red">ž®†æ‰“包后的代码放¾|®äºŽçŽ¯å¢ƒä¸­è¿›è¡Œé›†æˆæµ‹è¯?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong>verify</strong> – <span style="font-family: 宋体;Times New Roman";Times New Roman"">‹‚€æŸ¥æ‰“åŒ…çš„æœ‰æ•ˆæ€§åÆˆéªŒè¯è´¨é‡æ ‡å‡†</span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong>install</strong> – <span style="font-family: 宋体;Times New Roman";Times New Roman"">ž®†åŒ…装蝲入本åœîC»“库,以提供与其他™å¹ç›®çš„依èµ?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-size: 7pt; line-height: normal; ">         </span></span><strong>deploy</strong> – <span style="font-family: 宋体;Times New Roman";Times New Roman"">ž®†åŒ…发布臌™¿œ½E‹ä»“库中</span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">其上每一个阶ŒDµå®žé™…éƒ½åˆ†äØ“å‰ä¸­åŽä¸‰ä¸ªé˜¶ŒDµï¼Œç”¨æˆ·å¯ä»¥å®šä¹‰åœ¨æ¯ä¸€ä¸ªé˜¶ŒDµå‰åŽè¿›è¡Œè‡ªå®šä¹‰çš„æ“ä½œï¼Œæ‰“造自å·Þqš„æž„徏‹¹ç¨‹åQˆå¦‚在某个阶ŒD‰|‰§è¡Œå‰åˆ¶å®šç‰ÒŽ®Šçš„配¾|®æ–‡ä»Óž¼Œå®ŒæˆåŽå†æ”¹å›žé»˜è®¤åQ‰ã€‚对于阶ŒD늚„实际使用方式åQŒå¦‚åQ?/span>validate<span style="font-family:宋体;Times New Roman";Times New Roman"">可以™å¹ç›®æ‰€æœ‰ä¾èµ–有效,</span>test<span style="font-family:宋体;Times New Roman";Times New Roman"">可以针对</span>dao<span style="font-family:宋体;Times New Roman";Times New Roman"">层进行单元测试,</span>intergration-test<span style="font-family:宋体;Times New Roman";Times New Roman"">可以对完整业务流½E‹æˆ–服务层等˜q›è¡Œé›†æˆ‹¹‹è¯•ã€?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">在项目中实际使用的经验,对于标签的ä‹É用心得:</span></p> <p>1.<dependency> - <span style="font-family:宋体;Times New Roman";Times New Roman"">依赖标签åQŒæœ€é‡è¦çš„æ ‡½{¾ï¼Œä¹Ÿæ˜¯</span>Maven<span style="font-family:宋体;Times New Roman";Times New Roman"">的基¼‹€åŠŸèƒ½ã€?/span></p> <p>              <dependency></p> <p>                     <groupId>junit</groupId></p> <p>                     <artifactId>junit</artifactId></p> <p>                     <version>4.8.1</version></p> <p>                     <scope>test</scope></p> <p>              </dependency></p> <p> </p> <p>2. <repository> - <span style="font-family:宋体;Times New Roman";Times New Roman"">资源仓库åQŒå¯ä»¥åŒ…含多个,常用的有</span>Maven<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span>Jboss<span style="font-family: 宋体;Times New Roman";Times New Roman"">½{‰ï¼Œå¦‚下是公司内建的</span>Nexus<span style="font-family:宋体;Times New Roman";Times New Roman"">资源库ã€?/span></p> <p style="margin-left:21.0pt;text-indent:21.0pt"><repository></p> <p>                     <id>Suntang's Maven Repository</id></p> <p>                     <name>Suntang Nexus Repository</name></p> <p>                     <url>http://10.10.10.33:8081/nexus/content/groups/public</url></p> <p>              </repository></p> <p>3. <profile> - <span style="font-family:宋体;Times New Roman";Times New Roman"">解释为情景模式可能较为合适。可以有多个åQŒåœ¨ä½•种场景下会使用哪些属性、插件等。如下例子便是当¾~ºå¤±æŸä¸ªæ–‡äšgæ—¶æ¿€‹z…R€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">åQˆæ„Ÿè§‰å†™çš„不错的一½‹‡ï¼Œ</span><a >http://blog.csdn.net/turkeyzhou/article/details/4894657</a><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span></p> <p style="margin-left:42.0pt;"><profile></p> <p style="margin-left:63.0pt;"> <activation></p> <p style="margin-left:84.0pt;"><file></p> <p style="margin-left:105.0pt;"><missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing></p> <p style="margin-left:84.0pt;"></file></p> <p style="margin-left:63.0pt;"></activation></p> <p style="margin-left:42.0pt;"> </profile></p> <p>4.<build> - <span style="font-family:宋体;Times New Roman";Times New Roman"">构徏˜q‡ç¨‹ã€‚是˜q›è¡Œæ•´ä¸ª™å¹ç›®½Ž¡ç†çš„æ ¸å¿ƒæ ‡½{¾ã€‚重炚wœ€è¦æŽŒæ¡çš„知识ž®±æ˜¯ç”Ÿå‘½å‘¨æœŸã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span><a >http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference</a><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">下面的例子就是制定了打包时的资源路径åQŒåƈ且定义了最¾lˆæ‰“包的名称ã€?/span></p> <p> </p> <p>       <build></p> <p>              <resources></p> <p>                     <resource></p> <p>                            <directory>src/main/resources</directory></p> <p>                            <includes></p> <p>                                   <include>**/*</include></p> <p>                            </includes></p> <p>                     </resource></p> <p>                     <resource></p> <p>                            <directory>src/main/assembly</directory></p> <p>                            <includes></p> <p>                                   <include>**/*</include></p> <p>                            </includes></p> <p>                     </resource></p> <p>              </resources></p> <p> </p> <p>              <finalName>po</finalName></p> <p>       </build></p> <p> </p> <p>4.< plugin > - <span style="font-family:宋体;Times New Roman";Times New Roman"">支持插äšg。如单元‹¹‹è¯•自动化,之前提到çš?/span>Ant<span style="font-family:宋体;Times New Roman";Times New Roman"">的插件等。若有某些功能觉得不™åºæ‰‹åQŒå¯ä»¥å°è¯•官¾|‘找一下有没有合适的插äšgåQ?/span><a >http://maven.apache.org/plugins/index.html</a><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">下面的例子就是在集成‹¹‹è¯•中,只运行后¾~€ä¸?/span>TestSuitex.java<span style="font-family:宋体;Times New Roman";Times New Roman"">的测试类</span></p> <p> </p> <p>                     <plugin></p> <p>                            <groupId>org.apache.maven.plugins</groupId></p> <p>                            <artifactId>maven-surefire-plugin</artifactId></p> <p>                            <version>2.4.3</version></p> <p>                            <configuration></p> <p>                                   <junitArtifactName>junit:junit</junitArtifactName></p> <p>                                   <forkMode>once</forkMode></p> <p>                            </configuration></p> <p>                            <executions></p> <p>                                   <execution></p> <p>                                          <id>default-test</id></p> <p>                                          <phase>integration-test</phase></p> <p>                                          <goals></p> <p>                                                 <goal>test</goal></p> <p>                                          </goals></p> <p>                                          <configuration></p> <p>                                                 <skip>false</skip></p> <p>                                                 <includes></p> <p>                                                        <include>**/*TestSuitex.java</include></p> <p>                                                 </includes></p> <p>                                          </configuration></p> <p>                                   </execution></p> <p>                            </executions></p> <p>                     </plugin></p> <p> </p><img src ="http://www.aygfsteel.com/matuobasyouca/aggbug/373470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/matuobasyouca/" target="_blank">一酌散千忧</a> 2012-04-06 14:48 <a href="http://www.aygfsteel.com/matuobasyouca/archive/2012/04/06/373470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven自动化测试环境搭å»?/title><link>http://www.aygfsteel.com/matuobasyouca/archive/2012/04/05/373359.html</link><dc:creator>一酌散千忧</dc:creator><author>一酌散千忧</author><pubDate>Thu, 05 Apr 2012 03:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/matuobasyouca/archive/2012/04/05/373359.html</guid><wfw:comment>http://www.aygfsteel.com/matuobasyouca/comments/373359.html</wfw:comment><comments>http://www.aygfsteel.com/matuobasyouca/archive/2012/04/05/373359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/matuobasyouca/comments/commentRss/373359.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/matuobasyouca/services/trackbacks/373359.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体; ">环境背景åQ?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">我作为项目经理和技术架构管理ähå‘˜è´Ÿè´£å…¬åæ€¸€æ¡ç”Ÿäº§çº¿ã€‚讨è®ÞZ¹‹åŽï¼Œé¦–席架构师希望我们能够实æ–?/span>TDD<span style="font-family:宋体;Times New Roman";Times New Roman"">。在实施</span>TDD<span style="font-family:宋体;Times New Roman";Times New Roman"">的过½E‹ä¸­åQŒè®¾è®¡å®žæ–½è¿‡½E‹çš„æ•´ä½“思èµ\ž®±æ˜¯åQšå•元测试用例文æ¡?/span> - <span style="font-family:宋体;Times New Roman";Times New Roman"">实施单元‹¹‹è¯•</span> - <span style="font-family:宋体;Times New Roman";Times New Roman"">实施业务代码</span> – <span style="font-family:宋体;Times New Roman";Times New Roman"">修改业务代码逻辑。实施äh员需要参与每个环节,按照规范¾~–写单元‹¹‹è¯•用例文档。单元测试我们按照模块(模块与äh员基本没有重合)划分包(</span>suite<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ï¼Œä¿è¯å®žæ–½èµäh¥ä¸ä¼šäº§ç”Ÿòq²æ‰°ã€‚。技术架构决定采用:</span>maven<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span>junit<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span>svn<span style="font-family: 宋体;Times New Roman";Times New Roman"">ã€?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">技术背景:</span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">技术架构设计上åQŒæˆ‘们封装了</span>dao<span style="font-family:宋体;Times New Roman";Times New Roman"">层的实现åQŒæ‰€ä»¥å®žæ–½äh员基本无需涉及</span>dao<span style="font-family:宋体;Times New Roman";Times New Roman"">层的开发。服务层我们采用äº?/span>JAX-RS<span style="font-family:宋体;Times New Roman";Times New Roman"">的服务规范,对外开发服务接口ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">在测试覆盖率斚w¢åQŒæˆ‘们基本不要求å¯?/span>dao<span style="font-family:宋体;Times New Roman";Times New Roman"">层的单元‹¹‹è¯•åQŒä½†è¦æ±‚在服务层的单元测试达åˆ?/span>100%<span style="font-family:宋体;Times New Roman";Times New Roman"">。由于服务层æ˜?/span>Restful WS<span style="font-family:宋体;Times New Roman";Times New Roman"">的模式,所以我们采用了模拟</span>HTTP<span style="font-family:宋体;Times New Roman";Times New Roman"">è¯äh±‚的方式在‹¹‹è¯•服务层ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">ç”׃ºŽéœ€è¦æ¨¡æ‹?/span>HTTP<span style="font-family:宋体;Times New Roman";Times New Roman"">的请求,所以我们在单元‹¹‹è¯•中采用了</span>jetty<span style="font-family:宋体;Times New Roman";Times New Roman"">ä½œäØ“å†…åµŒæœåŠ¡å™¨ï¼Œå•å…ƒ‹¹‹è¯•开始时同一启动åQŒå®ŒæˆåŽå…³é—­ã€?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">实施˜q‡ç¨‹åQ?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">开发过½E‹ä¸­åQŒå®žé™…实施的时候发çŽîC¸€ä¸ªé—®é¢˜ï¼Œå¯¹äºŽ‹¹‹è¯•数据的管理问题。即‹¹‹è¯•当中需要一定的数据环境来验证业务逻辑。这个数据环境如何徏立?</span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">æ–ÒŽ¡ˆä¸€åQŒä‹Éç”?/span>dbunit<span style="font-family:宋体;Times New Roman";Times New Roman"">å’?/span>hsqldb<span style="font-family:宋体;Times New Roman";Times New Roman"">。在‹¹‹è¯•启动旉™‡å»ºæ•°æ®çŽ¯å¢ƒã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">否决åQŒåŽŸå› ï¼š</span></p> <p>1.<span style="font-family:宋体;Times New Roman";Times New Roman"">与实际运行环境差异较大ã€?/span></p> <p>2.<span style="font-family:宋体;Times New Roman";Times New Roman"">反复重徏数据环境åQŒæ•ˆçŽ‡ä¸Šæœ‰ç¼ºå¤±ã€?/span></p> <p>3.<span style="font-family:宋体;Times New Roman";Times New Roman"">技术架构增加,学习和维护曲¾U¿è¾ƒå¤§ã€?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">讨论后决定ä‹Éç”?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">æ–ÒŽ¡ˆäºŒï¼Œç‹¬ç«‹å‡ÞZ¸€å¥—测试数据库åQŒå®Œæ•´æ•°æ®çŽ¯å¢ƒã€‚è€ƒè™‘åˆ°å¢žåˆ æ”¹ä¸ŽæŸ¥è¯¢çš„å†²çªåQŒåˆ¶å®šé»˜è®¤è§„则,å¦?/span>id<span style="font-family:宋体;Times New Roman";Times New Roman"">åœ?/span>20<span style="font-family:宋体;Times New Roman";Times New Roman"">之内的不允许˜q›è¡Œä»ÖM½•改动。以ž®½é‡éš”离增删改的影响ã€?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">针对æ–ÒŽ¡ˆäºŒï¼Œæœ‰ä¸€ä¸ªè¾ƒå¤§çš„问题åQŒå¦‚何在开发过½E‹ä¸­è‡ªç”±çš„切换数据库配置呢?ç”׃ºŽæˆ‘们˜q˜æ˜¯ç”¨äº†</span>Hudson<span style="font-family:宋体;Times New Roman";Times New Roman"">ä½œäØ“</span>CI<span style="font-family:宋体;Times New Roman";Times New Roman"">服务器,˜q˜è¦è€ƒè™‘到打包的˜q‡ç¨‹ã€‚整体考虑之后åQŒæœ‰ä¸¤ä¸ªæ­¥éª¤éœ€è¦æ³¨æ„ï¼š</span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;">一ã€?span style="font-family:宋体;Times New Roman";Times New Roman"">开发过½E‹ã€‚开发过½E‹ä¸­åQŒæˆ‘们将配置直接指向‹¹‹è¯•数据库ã€?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;">二ã€?span style="font-family:宋体;Times New Roman";Times New Roman"">打包˜q‡ç¨‹ã€‚ä‹É用了</span>maven<span style="font-family:宋体;Times New Roman";Times New Roman"">åQŒå­˜åœ¨å•元测试配¾|®ä¸Žæœ€¾lˆäñ”品配¾|®çš„冲突ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">所以最¾lˆé—®é¢˜çš„焦点集中在打包过½E‹çš„</span>maven<span style="font-family:宋体;Times New Roman";Times New Roman"">配置æ–ÒŽ¡ˆã€?/span></p> <p> </p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">搜烦之后比较好的资料æœ?/span></p> <p>MAVEN:<span style="font-family:宋体;Times New Roman";Times New Roman"">如何为开发和生äñ”环境建立不同的配¾|®æ–‡ä»?/span> --<span style="font-family:宋体;Times New Roman";Times New Roman"">我的½Ž€‹zæ–¹æ¡?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span><a href="http://www.aygfsteel.com/scud/archive/2010/10/27/336326.html">http://www.aygfsteel.com/scud/archive/2010/10/27/336326.html</a><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">˜q™ç¯‡åšå®¢æ˜¯ä»‹¾låœ¨</span>maven <span style="font-family:宋体;Times New Roman";Times New Roman"">中ä‹Éç”?/span>mvn package -P test <span style="font-family:宋体;Times New Roman";Times New Roman"">˜q™æ ·çš„自定义</span>profile<span style="font-family:宋体;Times New Roman";Times New Roman"">来实现的。这æ äh˜¯å¯è¡Œçš„,但是åœ?/span>Hudson<span style="font-family:宋体;Times New Roman";Times New Roman"">中无法实çŽîC¸€æ¡å‘½ä»¤åˆ‡æ¢ä¸¤å¥—配¾|®ã€?/span></p> <p><span style="font-family:宋体;Times New Roman";Times New Roman"">于是¾l§ç®‹å¯ÀL‰¾åQŒæœ€¾lˆåœ¨</span>maven<span style="font-family:宋体;Times New Roman";Times New Roman"">的官方网站找到ã€?/span>Building For Different Environments with Maven 2<span style="font-family:宋体;Times New Roman";Times New Roman"">》(</span><a >http://maven.apache.org/guides/mini/guide-building-for-different-environments.html</a><span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰çœ‹å®Œæ–‡ç« ä¹‹åŽå‘玎ͼŒå®žé™…</span>maven<span style="font-family:宋体;Times New Roman";Times New Roman"">提供了一个非常好的插ä»?/span>maven-antrun-plugin<span style="font-family:宋体;Times New Roman";Times New Roman"">åQŒä»¥å®žçŽ°æŸäº›</span>ant<span style="font-family:宋体;Times New Roman";Times New Roman"">的功能。此处还需要了解的知识ž®±æ˜¯</span>maven<span style="font-family:宋体;Times New Roman";Times New Roman"">的构建生命周期标准(</span>http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html<span style="font-family:宋体;Times New Roman";Times New Roman"">åQ‰ã€‚基于上˜qîC¸¤ä¸ªçŸ¥è¯†ç‚¹åQŒæˆ‘们制定出如下æ–ÒŽ¡ˆåQ?strong>在项目中建立‹¹‹è¯•配置目录及äñ”品配¾|®ç›®å½•,åœ?/strong></span><strong>maven</strong><strong><span style="font-family:宋体;Times New Roman";Times New Roman"">çš?/span>package</strong><strong><span style="font-family:宋体;Times New Roman";Times New Roman"">阶段开始前åQŒéƒ½ä½¿ç”¨‹¹‹è¯•配置åQŒè¿è¡Œé›†æˆæµ‹è¯•,完成åœ?/span>package</strong><strong><span style="font-family:宋体;Times New Roman";Times New Roman"">阶段前将产品配置覆盖è‡Ïx‰“包文件夹内,然后˜q›è¡Œæ‰“包</span></strong><span style="font-family:宋体;Times New Roman";Times New Roman"">。思èµ\ž®±æ˜¯˜q™æ ·åQŒä¸‹é¢è„“å‡?/span>pom<span style="font-family:宋体;Times New Roman";Times New Roman"">æ–‡äšg的关键部分ã€?/span></p> <p> </p> <p> </p> <p>POM.xml</p> <p><!—profile <span style="font-family:宋体;Times New Roman";Times New Roman"">节点定义覆盖文äšg的方式内å®?/span> --></p> <p>       <profiles></p> <p>              <profile></p> <p>                     <id>product</id></p> <p>                     <build></p> <p>                            <plugins></p> <p>                                   <plugin></p> <p>                                          <artifactId>maven-antrun-plugin</artifactId></p> <p>                                          <executions></p> <p>                                                 <execution></p> <p>                                                        <id>pre_product</id></p> <p>                                                        <phase>prepare-package</phase></p> <p>                                                        <goals></p> <p>                                                               <goal>run</goal></p> <p>                                                        </goals></p> <p>                                                        <configuration></p> <p><!—<span style="font-family:宋体;Times New Roman";Times New Roman"">此处ä¸?/span>ant<span style="font-family:宋体;Times New Roman";Times New Roman"">çš„ä“Q务相ä¼?/span> --></p> <p>                                                               <tasks></p> <p>                                                                      <delete file="${project.build.outputDirectory}/spring/dataSourceContext.xml" /></p> <p>                                                                      <delete file="${project.build.outputDirectory}/log4j.properties" /></p> <p>                                                                      <copy file="src/product/assembly/log4j.properties" tofile="${project.build.outputDirectory}/log4j.properties" /></p> <p>                                                                      <copy file="src/product/assembly/spring/dataSourceContext.xml" tofile="${project.build.outputDirectory}/spring/dataSourceContext.xml" /></p> <p>                                                               </tasks></p> <p>                                                        </configuration></p> <p>                                                 </execution></p> <p>                                          </executions></p> <p>                                   </plugin></p> <p>                            </plugins></p> <p>                     </build></p> <p>              </profile></p> <p>       </profiles></p> <p> </p> <p><!—<span style="font-family:宋体;Times New Roman";Times New Roman"">构徏˜q‡ç¨‹</span> --></p> <p>       <build></p> <p style="text-indent:21.0pt"><!—<span style="font-family:宋体;Times New Roman";Times New Roman"">指定资源目录</span> --></p> <p>              <resources></p> <p>                     <resource></p> <p>                            <directory>src/test/resources</directory></p> <p>                            <includes></p> <p>                                   <include>**/*</include></p> <p>                            </includes></p> <p>                     </resource></p> <p>                     <resource></p> <p>                            <directory>src/test/assembly</directory></p> <p>                            <includes></p> <p>                                   <include>**/*</include></p> <p>                            </includes></p> <p>                     </resource></p> <p>              </resources></p> <p> </p> <p>              <finalName>po</finalName></p> <p> </p> <p style="margin-left:21.0pt;text-indent:21.0pt"><!—<span style="font-family:宋体;Times New Roman";Times New Roman"">指定集成‹¹‹è¯•配置</span> --></p> <p>              <plugins></p> <p>                     <plugin></p> <p>                            <groupId>org.apache.maven.plugins</groupId></p> <p>                            <artifactId>maven-surefire-plugin</artifactId></p> <p>                            <version>2.4.3</version></p> <p>                            <configuration></p> <p>                                   <junitArtifactName>junit:junit</junitArtifactName></p> <p>                                   <forkMode>once</forkMode></p> <p>                            </configuration></p> <p>                            <executions></p> <p>                                   <execution></p> <p>                                          <id>default-test</id></p> <p>                                          <phase>integration-test</phase></p> <p>                                          <goals></p> <p>                                                 <goal>test</goal></p> <p>                                          </goals></p> <p>                                          <configuration></p> <p>                                                 <skip>false</skip></p> <p>                                                 <includes></p> <p>                                                        <include>**/*TestSuitex.java</include></p> <p>                                                 </includes></p> <p>                                          </configuration></p> <p>                                   </execution></p> <p>                            </executions></p> <p>                     </plugin></p> <p>              </plugins></p> <p>       </build></p><img src ="http://www.aygfsteel.com/matuobasyouca/aggbug/373359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/matuobasyouca/" target="_blank">一酌散千忧</a> 2012-04-05 11:26 <a href="http://www.aygfsteel.com/matuobasyouca/archive/2012/04/05/373359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nosql企业之道http://www.aygfsteel.com/matuobasyouca/archive/2012/04/04/373338.html一酌散千忧一酌散千忧Wed, 04 Apr 2012 13:41:00 GMThttp://www.aygfsteel.com/matuobasyouca/archive/2012/04/04/373338.htmlhttp://www.aygfsteel.com/matuobasyouca/comments/373338.htmlhttp://www.aygfsteel.com/matuobasyouca/archive/2012/04/04/373338.html#Feedback0http://www.aygfsteel.com/matuobasyouca/comments/commentRss/373338.htmlhttp://www.aygfsteel.com/matuobasyouca/services/trackbacks/373338.html阅读全文

一酌散千忧 2012-04-04 21:41 发表评论
]]>
Hadoop in action 实践(伪分布式)http://www.aygfsteel.com/matuobasyouca/archive/2012/04/01/373194.html一酌散千忧一酌散千忧Sun, 01 Apr 2012 07:00:00 GMThttp://www.aygfsteel.com/matuobasyouca/archive/2012/04/01/373194.htmlhttp://www.aygfsteel.com/matuobasyouca/comments/373194.htmlhttp://www.aygfsteel.com/matuobasyouca/archive/2012/04/01/373194.html#Feedback0http://www.aygfsteel.com/matuobasyouca/comments/commentRss/373194.htmlhttp://www.aygfsteel.com/matuobasyouca/services/trackbacks/373194.html《Hadoop in actionã€?span style="font-family: 宋体; ">ç”?/span>Manning出版åQŒç£•¼‚•绊¾lŠæ€È®—是看完了。书的内容就不做介绍åQŒä¸»è¦è®²ä¸€ä¸‹å®žè·ëŠš„˜q‡ç¨‹ã€‚åÆˆä¸”åœ¨å®žè·µ˜q‡ç¨‹ä¸­å‚考的书籍的部分也会简单介¾lã€?br />
灰色背景部分ä¸ÞZ¸€äº›ä»‹¾lï¼Œæˆ–过½E‹ä¸­å‡ºçŽ°é—®é¢˜çš„æ˜qŽÍ¼Œå¯ä»¥ç›´æŽ¥å¿½ç•¥ã€?/span>

ç”׃ºŽå…¬å¸çš„业务需要,要在¾|‘络攉™›†¾|‘页之后对网™åµè¿›è¡Œç»“构化的解析,˜q™ä¸ª¾l“构化过½E‹å¸Œæœ›èƒ½å¤ŸåŸºäº?/span>HDFSòq¶ä¸”使用MR½Ž—法实现ã€?/span>

我虚拟了一个需求,针对http://hadoop.apache.org/common/releases.html ™åµé¢åQŒå‡è®‘Ö·²¾lä¸‹è½½äº†™åµé¢òq¶å…¥åº“。要求最¾lˆä½“现的数据æ˜?/span> “版本å?/span>+完整链接åQˆå³a标签全部内容åQ?#8221; çš„结构ã€?/span>

 

伪分布式环境搭徏在虚拟机上,操作¾pȝ»Ÿæ˜?/span>centos5.5åQ?/span>hadoop的版本是1.0.0.

 

插入书中的一些环境搭建的介绍

书中çš?/span>2.1节中介绍了每个进½E‹çš„作用ã€?/span>2.2节中çš?/span>ssh讄¡½®ä¹Ÿæ¯”较重要,否则好像会一直提½CÞZ½ è¾“入密码ã€?/span>2.3.2节介¾läº†ä¼ªåˆ†å¸ƒå¼çš„配¾|®æ–¹å¼ï¼Œå¯?/span>core-site.xmlåQ?/span>mapred-site.xmlåQ?/span>hdfs-site.xml˜q›è¡Œé…ç½®ä¹‹åŽåQŒéœ€è¦å¯¹namenode节点˜q›è¡Œæ ¼å¼åŒ–ã€?/span>

bin/hadoop namenode –format

 

hadoop的根目录ä¸?/span>/usr/local/hadoop-1.0.0åQŒç›´æŽ¥å¯åŠ?/span>start-all.sh

 

[root@localhost hadoop-1.0.0]# ./bin/start-all.sh

 

启动成功后ä‹Éç”?/span>jps命ä×o

jdkž®å·¥å…?/span>jps介绍 

jps(Java Virtual Machine Process Status Tool)æ˜?/span>JDK 1.5提供的一个显½Cºå½“前所æœ?/span>java˜q›ç¨‹pid的命令,½Ž€å•实用,非常适合åœ?/span>linux/unixòq›_°ä¸Šç®€å•察看当å‰?/span>java˜q›ç¨‹çš„一些简单情å†üc€?/span> jps存放åœ?/span>JAVA_HOME/bin/jps

 

[root@localhost hadoop-1.0.0]# jps

5694 SecondaryNameNode

5461 NameNode

5578 DataNode

6027 Jps

5784 JobTracker

5905 TaskTracker

˜q™å‡ ä¸ªè¿›½E‹æ˜¯éžå¸¸é‡è¦çš„。很多时候出现意外就是因为某™åÒŽœåŠ¡æœªå¯åŠ¨æˆ–å¼‚å¸¸ã€‚å¯ä»¥çœ‹åˆîC¸Šé¢çš„命ä×o上打印出日志位置。出现异常后可以在日志中查看详细的堆栈信息ã€?/span>

 

è‡Ïx­¤åQ?/span>hadoop已经启动åQŒçŽ¯å¢ƒå·²¾lå‡†å¤‡å°±¾lªã€?/span>

 

下面准备我们的测试数据,ž®†ç›®æ ‡é¡µé¢çš„html保存ä¸?/span>news.txtåQŒä¼ªåˆ†å¸ƒå¼ä¹ŸåŒæ ·æ”¯æŒhdfsåQŒæ‰€ä»¥æˆ‘们ä‹Éç”?/span> fs –put ž®?/span>news.txt存入hdfs中ã€?/span>

[root@localhost hadoop-1.0.0]# ./bin/hadoop fs -put /mnt/hgfs/shared/news.txt /user/root

[root@localhost hadoop-1.0.0]# ./bin/hadoop fs -lsr /userdrwxr-xr-x   - root supergroup          0 2012-04-01 11:22 /user/root

-rw-r--r--   1 root supergroup       3935 2012-04-01 11:22 /user/root/news.txt

 

实现的代码在eclipse中ä‹Éç”?/span>maven打包åQŒä¸Šä¼ è‡³è™šæ‹Ÿæœºã€?/span>

æ–‡äšgå?/span>com.suntang.analyse.hadoop-0.0.1.jarã€?br />使用hadoop的中的jar命ä×o调用该jaræ–‡äšgã€?br />


[root@localhost hadoop-1.0.0]# ./bin/hadoop jar com.suntang.analyse.hadoop-0.0.1.jar com.suntang.analyse.hadoop.AnalyseJob /user/root/news.txt output_root_test

12/04/01 14:40:04 INFO input.FileInputFormat: Total input paths to process : 1

12/04/01 14:40:05 INFO mapred.JobClient: Running job: job_201204011420_0001

12/04/01 14:40:06 INFO mapred.JobClient:  map 0% reduce 0%

12/04/01 14:40:19 INFO mapred.JobClient:  map 100% reduce 0%

12/04/01 14:40:31 INFO mapred.JobClient:  map 100% reduce 100%

12/04/01 14:40:37 INFO mapred.JobClient: Job complete: job_201204011420_0001

 

 

此处注意我犯的一个错误:

[root@localhost hadoop-1.0.0]# ./bin/hadoop jar com.suntang.analyse.hadoop-0.0.1.jar AnalyseJob -libjars hadoop-core-1.0.0.jar /user/root/news.txt output_root_test

Exception in thread "main" java.lang.ClassNotFoundException: AnalyseJob

提示找不到类åQŒå› ä¸ºæˆ‘忘了写完整类名,命ä×oåº”è¯¥æ”¹äØ“

./bin/hadoop jar com.suntang.analyse.hadoop-0.0.1.jar com.suntang.analyse.hadoop.AnalyseJob -libjars hadoop-core-1.0.0.jar /user/root/news.txt output_root_test å›_¯ã€?/span>

 

此处˜qè¡Œå¯èƒ½å‡ºçŽ°å¦å¤–ä¸€ä¸ªé”™è¯¯ã€‚åœ¨å‘½ä×o行中出现

12/04/01 14:01:38 INFO mapred.JobClient: Task Id : attempt_201204011356_0001_m_000001_0, Status : FAILED

java.lang.Throwable: Child Error

        at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)

Caused by: java.io.IOException: Creation of symlink from /mnt/hgfs/shared/hadoop-1.0.0/libexec/../logs/userlogs/job_201204011356_0001/attempt_201204011356_0001_m_000001_0 to ã€‚。ã€?/span>

ž®×ƒ¸æ‰“全了,重点在与

Creation of symlinkåQŒçœ‹è¯¦ç»†æ—¥å¿—ä¸?/span>hadoop-root-tasktracker-localhost.localdomain.log中提½C?/span>org.apache.hadoop.fs.FileUtil: Command 'ln -s ....': Operation not supportedåQŒå³ln操作不支持ã€?/span>google可知˜q™ä¸ªæ˜¯ç”±äº?/span>vm中的å…׃ín区域的问题,解决æ–ÒŽ³•ž®±æ˜¯ž®?/span>hadoop完全转移è‡?/span>linux目录中。本例中ä»?/span>/mnt/hgfs/shared/hadoop-1.0.0转移è‡?/span>/usr/local/hadoop-1.0.0ã€?/span>

 

执行完成后可åœ?/span>hdfs中查看结果,查看目录¾l“æž„ä¸?/span>

-rw-r--r--   1 root supergroup          0 2012-04-01 14:40 /user/root/output_root_test/_SUCCESS

drwxr-xr-x   - root supergroup          0 2012-04-01 14:40 /user/root/output_root_test/_logs

drwxr-xr-x   - root supergroup          0 2012-04-01 14:40 /user/root/output_root_test/_logs/history

-rw-r--r--   1 root supergroup      13634 2012-04-01 14:40 /user/root/output_root_test/_logs/history/job_201204011420_0001_1333262405103_root_ccAnalyseJob

-rw-r--r--   1 root supergroup      20478 2012-04-01 14:40 /user/root/output_root_test/_logs/history/job_201204011420_0001_conf.xml

-rw-r--r--   1 root supergroup       3580 2012-04-01 14:40 /user/root/output_root_test/part-r-00000

 

/user/root/output_root_test/part-r-00000å³äØ“æœ€¾lˆç»“果文件ã€?/span>

 

 =======================================================================

附加AnalyseJob代码

package com.suntang.analyse.hadoop;

 

import java.io.IOException;

 

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.conf.Configured;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import org.apache.hadoop.util.Tool;

import org.apache.hadoop.util.ToolRunner;

 

public class AnalyseJob extends Configured implements Tool {

 

       public static class MapClass extends Mapper<LongWritable, Text, Text, Text> {

 

              @Override

              protected void map(LongWritable key, Text value, Context context)

                            throws IOException, InterruptedException {

                    

                    

                     // TODO Auto-generated method stub

                     // super.map(key, value, context);

                     if (value.toString().matches("<a[^>]*>.*?release.*?</a>"))

                            context.write(

                                          new Text(value.toString().substring(

                                                        value.toString().indexOf("release") + 8,

                                                        value.toString().indexOf("available") - 1)),

                                          value);

              }

 

       }

 

       public static class ReduceClass extends Reducer<Text, Text, Text, Text> {

 

              @Override

              protected void reduce(Text arg0, Iterable<Text> arg1, Context arg2)

                            throws IOException, InterruptedException {

                     // TODO Auto-generated method stub

                     // super.reduce(arg0, arg1, arg2);

                     arg2.write(arg0, arg1.iterator().next());

              }

 

       }

 

       public int run(String[] args) throws Exception {

              Configuration conf = getConf();

 

              Job job = new Job(conf, "myAnalyseJob");

              job.setJarByClass(getClass());

 

              Path in = new Path(args[0]);

              Path out = new Path(args[1]);

              FileInputFormat.setInputPaths(job, in);

              FileOutputFormat.setOutputPath(job, out);

 

              job.setMapperClass(MapClass.class);

              job.setReducerClass(ReduceClass.class);

 

              job.setInputFormatClass(TextInputFormat.class);

              job.setOutputFormatClass(TextOutputFormat.class);

              job.setOutputKeyClass(Text.class);

              job.setOutputValueClass(Text.class);

 

              System.exit(job.waitForCompletion(true) ? 0 : 1);

 

              return 0;

       }

 

       public static void main(String[] args) throws Exception {

              int res = ToolRunner.run(new Configuration(), new AnalyseJob(), args);

              System.exit(res);

       }

}



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÇßÑôÊÐ| ÄôÀ­Ä¾ÏØ| ÎÚÀ­ÌØÖÐÆì| ãÉÐÐÇø| ¹¤²¼½­´ïÏØ| Ëç·ÒºÓÊÐ| áéÖÝÊÐ| ÂÞÔ´ÏØ| Î÷ÎÚ| ·Ê³ÇÊÐ| µÂÇìÏØ| ÎÌÅ£ÌØÆì| ¼ªÂ¡ÏØ| ³à³ÇÏØ| ´óÓ¢ÏØ| Æ«¹ØÏØ| Ðí²ýÊÐ| Îñ´¨| äµÔ´ÏØ| èÈÑôÏØ| ÁÙ¸ßÏØ| »ÆÁúÏØ| Ôª½­| ººÒõÏØ| ¹óÑôÊÐ| Åî°²ÏØ| ¶«Ïç×å×ÔÖÎÏØ| ÓÀÐËÏØ| ÁÙÏÄÊÐ| ÁÉÄþÊ¡| ¾¸±ßÏØ| í¸É½ÏØ| ¶¨ÐËÏØ| ´ïÈÕÏØ| ¬ÊÏÏØ| µÂ¸ñÏØ| ÂÞµéÏØ| Óñ»·ÏØ| °²»¯ÏØ| ÄáÄ¾ÏØ| ¸§ÄþÏØ|