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>呢?
l 能够建立集群åQŒåˆ†å¸ƒå¼çš„ä¿å˜æ•°æ®æ–‡ä»¶å†…容(¾lŸä¸€æŽ§åˆ¶åQŒå¯é…ç½®åQ‰ã€?/span>
l æœ‰ä¸€å®šçš„ä¿æŠ¤æœºåˆ¶åQŒä¿è¯æ•°æ®æˆ–节点丢失ä¸ä¼šå½±å“¾pÈ»Ÿä½¿ç”¨ã€?/span>
l 如果有一个ä“Q务脚本执行框架机制就好了åQˆç”¨äºŽåƈ行计½Ž—)ã€?/span>
l 能够˜q›è¡ŒèŠ‚ç‚¹é—´çš„æ•°æ®å‡è¡¡ã€?/span>
l 能够½Ž€å•的查看所有的状æ€ä¸Žæ—¥å¿—å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>
¼‹¬äš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>
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>
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
ä»£ç ¾~–写部分比较½Ž€å•ï¼Œå› äØ“æš´éœ²çš„æŽ¥å£å¾ˆž®‘,主è¦å¤æ‚在于™å¹ç›®å¦‚何使用节点以åŠèŠ‚ç‚¹ä¿¡æ¯ã€?/span>
å¯åЍZookeeperæœåС之åŽåQŒå®¢æˆïL«¯ä»£ç ˜q›è¡ŒèŠ‚ç‚¹çš„å¢žåˆ ï¼ŒWatch的设¾|®ï¼Œå†…容的改查ç‰ã€?/span>
æ¤å¤„廸™®®æŸ¥çœ‹å®˜æ–¹çš„《Programming with ZooKeeper - A basic tutorial》部分,当ä¸ä¸¾äº†ä¸¤ä¸ªä¾‹åæ¥æ¨¡æ‹Ÿåˆ†å¸ƒå¼¾pÈ»Ÿçš„应用ã€?/span>
代ç 基本没有问题åQŒå”¯ä¸€éœ€è¦æ³¨æ„çš„ž®±æ˜¯åQšè‹¥ä¹‹é—´æŒ‰ç…§åŽŸç‰ˆ˜q›è¡Œè°ƒè¯•æ—Óž¼Œæœ‰å¯èƒ½åœ¨è°ƒç”¨
˜q™å¥ä»£ç 时会出现一个异常,当ä¸åŒ…括“KeeperErrorCode = ConnectionLoss for”ã€?/span>
˜q™ä¸ªé—®é¢˜å¼•è“vçš„åŽŸå› å¯ä»¥çœ‹ä¸€ä¸‹ä»£ç ?/span>
最åŽä¸€è¡Œæœ‰æ‰“å°å‡ºZookeeperç›®å‰çš„ä¿¡æ¯ï¼Œè‹¥æœªä¿®æ”¹çš„原代ç åQŒæ¤å¤„çš„State应当是CONECTING。连接ä¸çš„æ—¶å€™åŽ»éªŒè¯æ˜¯å¦å˜åœ¨èŠ‚ç‚¹ä¼šæŠ¥é”™ã€‚è§£å†³çš„æ–ÒŽ³•也很½Ž€å•,ž®±æ˜¯½{‰åˆ°Zookeeper客户端以åŠå®Œå…¨è¿žæŽ¥ä¸ŠæœåŠ¡å™¨ï¼ŒState为CONECTED之åŽå†è¿›è¡Œå…¶ä»–æ“作。给å‡ÞZ»£ç 示例:
˜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> 在分布å¼çŽ¯å¢ƒä¸ï¼Œç›¸åŒçš„业务应用分布在ä¸åŒçš„æœºå™¨ä¸Šå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> |
|
转å˜äº†æ•°æ®ç®¡ç†æ–¹å¼çš„æŠ€æœ¯æ£æ˜¯è™šæ‹ŸåŒ–ã€‚ä½Žæˆæœ¬å˜å‚¨ã€äº‘计算ã€?/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
ç”׃ºŽå…¬å¸çš„业务需è¦ï¼Œè¦åœ¨¾|‘络攉™›†¾|‘页之åŽå¯¹ç½‘™åµè¿›è¡Œç»“构化的解æžï¼Œ˜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);
}
}