﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-shenh062326</title><link>http://www.blogjava.net/shenh062326/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 06:24:47 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 06:24:47 GMT</pubDate><ttl>60</ttl><item><title>招聘 hadoop开发工程师</title><link>http://www.blogjava.net/shenh062326/archive/2013/09/15/404093.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Sun, 15 Sep 2013 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2013/09/15/404093.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/404093.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2013/09/15/404093.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/404093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/404093.html</trackback:ping><description><![CDATA[<h1><br /></h1><div id="cnblogs_post_body" style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; word-break: normal !important;"><p style="margin-top: 10px; margin-bottom: 10px;"><span style="font-family: 宋体; color: #000000;"><span style="font-size: small;"><strong>淘宝招聘hadoop工程师若干, 面向</strong></span></span><span style="font-family: 宋体;"><span style="font-size: small;"><strong>在校生(2014年毕业),工作地点:杭州或北京</strong></span></span></p><p style="margin-top: 10px; margin-bottom: 10px;"><span style="color: #000000;"><strong><span style="font-family: 宋体;">Hadoop研发工程师<br />职位描述<br />您将负责：<br />1．预研、开发、测试hdfs/mapreduce/hive/hbase的功能、性能和扩展；<br />2．对有助于提升集群处理能力/高可用性/高扩展性的各种解决方案进行跟踪和落地；<br />3．解决海量数据不断增长面临的挑战，解决业务需求。</span></strong></span></p><p style="margin-top: 10px; margin-bottom: 10px;"><span style="color: #000000;"><strong><span style="font-family: 宋体;">您需要具备：<br />1、熟练运用java语言；<br />2、熟悉jvm运行机制、熟悉linux；<br />3、至少熟悉hadoop、hbase、hive等软件之一；<br /></span></strong></span></p><p style="margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px;"><span style="color: #000000;"><strong><span style="font-family: 宋体;">有意者请发送邮件到 yuling.sh@taobao.com&nbsp;</span></strong></span></p></div><img src ="http://www.blogjava.net/shenh062326/aggbug/404093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2013-09-15 18:21 <a href="http://www.blogjava.net/shenh062326/archive/2013/09/15/404093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hadoop各种输入方法(InputFormat)汇总</title><link>http://www.blogjava.net/shenh062326/archive/2012/07/03/hadoop.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Tue, 03 Jul 2012 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2012/07/03/hadoop.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/382115.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2012/07/03/hadoop.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/382115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/382115.html</trackback:ping><description><![CDATA[<div>  <p><span style="font-size:12.0pt;font-family:Consolas;color:black;"><br /></span><span style="font-size:12.0pt;font-family:宋体;color:black;"></span></p><p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas; color:black;">mapreduce</span><span style="font-size:10.0pt; font-family:宋体;color:black;">中</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">,</span><span style="font-size:10.0pt; font-family:宋体;color:black;">一个</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">job</span><span style="font-size:10.0pt; font-family:宋体;color:black;">的</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">个数</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">每个</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">处理的数据量是如何决定的呢</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">? </span><span style="font-size: 10.0pt;font-family:宋体;color:black;">另外每个</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size: 10.0pt;font-family:宋体;color:black;">又是如何读取输入文件的内容呢</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">? </span><span style="font-size: 10.0pt;font-family:宋体;color:black;">用户是否可以自己决定输入方式</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">, </span><span style="font-size: 10.0pt;font-family:宋体;color:black;">决定</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size: 10.0pt;font-family:宋体;color:black;">个数呢</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">? </span><span style="font-size: 10.0pt;font-family:宋体;color:black;">这篇文章将详细讲述</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">hadoop</span><span style="font-size: 10.0pt;font-family:宋体;color:black;">中各种</span><span style="font-size:9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">InputFormat</span><span style="font-size:9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">的功能和如何编写自定义的InputFormat. </span></p>  <p>&nbsp;</p>  <p><span style="font-size:10.0pt;font-family:宋体;color:black;">简介</span><span style="font-size:10.0pt; font-family:Consolas;color:black;">: mapreduce</span><span style="font-size:10.0pt;font-family:宋体;color:black;">作业会根据输入目录产生多个</span><span style="font-size: 10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size:10.0pt;font-family:宋体; color:black;">任务</span><span style="font-size: 10.0pt;font-family:Consolas;color:black;">, </span><span style="font-size:10.0pt;font-family:宋体; color:black;">通过多个</span><span style="font-size: 10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size:10.0pt;font-family:宋体; color:black;">任务并行执行来提高作业运行速度</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">但如果</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">数量过少</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">并行量低</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">作业执行慢</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">如果</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">数过多</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">资源有限</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">也会增加调度开销</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">. </span><span style="font-size:10.0pt; font-family:宋体;color:black;">因此</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">根据输入产生合理的</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">数</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">为每个</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">分配合适的数据量</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">能有效的提升资源利用率</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">并使作业运行速度加快</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">.</span></p>  <p><span style="font-size:10.0pt;font-family:Consolas;color:black;">&nbsp;&nbsp;&nbsp; </span><span style="font-size:10.0pt; font-family:宋体;color:black;">在</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">mapreduce</span><span style="font-size:10.0pt; font-family:宋体;color:black;">中</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">每个作业都会通过</span> <span style="font-size: 9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">InputFormat</span><span style="font-size:10.0pt;font-family:宋体;color:black;">来决定</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size: 10.0pt;font-family:宋体;color:black;">数量</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">. </span><span style="font-size:9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">InputFormat</span><span style="font-size:9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">是一个接口<span>, </span>提供两个方法:</span></p>  <p style="text-align:left;text-autospace:none" align="left"><span style="font-size:9.0pt;font-family: Consolas;color:black;">InputSplit[] getSplits(JobConf job, </span><strong><span style="font-size:9.0pt; font-family:Consolas;color:#7F0055;">int</span></strong><span style="font-size:9.0pt;font-family:Consolas;color:black;"> numSplits) </span><strong><span style="font-size:9.0pt;font-family:Consolas;color:#7F0055;">throws</span></strong><span style="font-size:9.0pt;font-family:Consolas; color:black;"> IOException;</span></p>  <p style="text-align:left;text-autospace:none" align="left"><span style="font-size:9.0pt;font-family: Consolas;color:black;">RecordReader&lt;K, V&gt; getRecordReader(InputSplit split,</span></p>  <p style="text-align:left;text-autospace:none" align="left"><span style="font-size:9.0pt;font-family: Consolas;color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JobConf job, </span></p>  <p><span style="font-size:9.0pt;font-family:Consolas;color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reporter reporter) </span><strong><span style="font-size:9.0pt;font-family:Consolas;color:#7F0055;">throws</span></strong><span style="font-size:9.0pt;font-family:Consolas;color:black;"> IOException;</span></p>  <p><span style="font-size:10.0pt;font-family:Consolas;color:black;">&nbsp;&nbsp;&nbsp; </span><span style="font-size:10.0pt; font-family:宋体;color:black;">其中</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">getSplits</span><span style="font-size:10.0pt; font-family:宋体;color:black;">方法会根据输入目录产生</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">InputSplit</span><span style="font-size:10.0pt; font-family:宋体;color:black;">数组</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">每个</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">InputSplit</span><span style="font-size:10.0pt; font-family:宋体;color:black;">会相应产生一个</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">任务</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">的输入定义在</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">InputSplit</span><span style="font-size:10.0pt; font-family:宋体;color:black;">中</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">.&nbsp;getRecordReader</span><span style="font-size:10.0pt;font-family:宋体;color:black;">方法返回一个</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">RecordReader</span><span style="font-size:10.0pt;font-family:宋体;color:black;">对象</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">, RecordReader</span><span style="font-size:10.0pt;font-family:宋体;color:black;">决定了</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size: 10.0pt;font-family:宋体;color:black;">任务如何读取输入数据</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">, </span><span style="font-size: 10.0pt;font-family:宋体;color:black;">例如一行一行的读取还是一个字节一个字节的读取</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">, </span><span style="font-size: 10.0pt;font-family:宋体;color:black;">等等</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">.</span></p>  <p><span style="font-size:10.0pt;font-family:Consolas;color:black;">&nbsp;&nbsp;&nbsp; </span><span style="font-size:10.0pt; font-family:宋体;color:black;">下图是</span><span style="font-size:9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">InputFormat</span><span style="font-size:9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">的实现类:</span></p>  <p><span style="font-size:9.0pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (暂时无法上传)</span><span style="font-size: 12.0pt;font-family:宋体;"></span></p>  <p><span style="font-size:10.0pt;font-family:Consolas;color:black;">&nbsp;&nbsp;&nbsp; </span><span style="font-size:10.0pt; font-family:宋体;">这理详细介绍</span><span style="font-size: 10.0pt;font-family:Consolas;">FileInputFormat</span><span style="font-size:10.0pt;font-family:宋体;">和</span><span style="font-size:10.0pt; font-family:Consolas;">CombineFileInputFormat, </span><span style="font-size:10.0pt;font-family:宋体;">其它不常用</span><span style="font-size:10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt; font-family:宋体;">有兴趣的可以自己查看</span><span style="font-size:10.0pt;font-family:Consolas;">hadoop</span><span style="font-size:10.0pt;font-family: 宋体;">源码</span><span style="font-size: 10pt; font-family: Consolas;">.</span></p><p><span style="font-size:10.0pt; font-family:Consolas;"><br /></span></p>  <p>&nbsp;</p><div>  <p><span style="font-size:14.0pt;font-family:Consolas;">FileInputFormat(</span><span style="font-size:14.0pt;font-family:宋体;">旧接口</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">org.apache.hadoop.mapred</span><span style="font-size:14.0pt;font-family:Consolas;">)</span></p>  </div><span style="font-size:14.0pt;font-family:宋体;"></span><span style="font-size: 10.0pt;font-family:Consolas;color:black;"></span><span style="font-size:14.0pt;font-family:Consolas;"></span><span style="font-size:14.0pt;font-family:Consolas;"></span><p>&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas; color:black;">mapreduce</span><span style="font-size:10.0pt; font-family:宋体;color:black;">默认使用</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">TextInputFormat</span><span style="font-size: 10.0pt;font-family:宋体;color:black;">，</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">TextInputFormat</span><span style="font-size:10.0pt;font-family:宋体;color:black;">没有实现自己的</span><span style="font-size:9.0pt;font-family:Consolas;color:black;">getSplits</span><span style="font-size:9.0pt;font-family:宋体;color:black;">方法</span><span style="font-size:9.0pt;font-family:Consolas;color:black;">,</span><span style="font-size:9.0pt; font-family:宋体;color:black;">它</span><span style="font-size:10.0pt; font-family:宋体;color:black;">继承于</span><span style="font-size:10.0pt;font-family:Consolas;">FileInputFormat, </span><span style="font-size:10.0pt; font-family:宋体;">因此使用了</span><span style="font-size: 10.0pt;font-family:Consolas;">FileInputFormat的.</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas; color:black;">org.apache.hadoop.mapred.</span><span style="font-size:10.0pt;font-family:Consolas;">FileInputFormat</span><span style="font-size: 10.0pt;font-family:宋体;">的</span><span style="font-size:9.0pt;font-family:Consolas; color:black;">getSplits</span><span style="font-size:9.0pt; font-family:宋体;color:black;">流程</span><span style="font-size:9.0pt;font-family:Consolas; color:black;">:</span></p>  <p style="text-indent:21.0pt"><span style="font-size:9.0pt; font-family:宋体;">两个配置</span></p>  <p style="margin-left:21.0pt;text-indent:21.0pt"><span style="font-size: 10pt; font-family: Consolas;">mapred.min.split.size</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-size:10.0pt;font-family:Consolas;">(</span><span style="font-size:10.0pt;font-family:宋体;">一个</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt; font-family:宋体;">最小输入长度</span><span style="font-size: 10.0pt;font-family:Consolas;">), </span></p>  <p style="margin-left:16.0pt;text-indent:26.0pt;"><span style="font-size: 10pt; font-family: Consolas;">mapred.map.tasks</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-size:10.0pt;font-family:Consolas;">(</span><span style="font-size: 10.0pt;font-family:宋体;">推荐</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">数量</span><span style="font-size:10.0pt; font-family:Consolas;">)</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">如何决定每个</span><span style="font-size: 10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">输入长度呢</span><span style="font-size:10.0pt;font-family:Consolas;">? </span><span style="font-size:10.0pt;font-family:宋体;">首先获取输入目录下所有文件的长度和</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">除以</span><span style="font-size:10.0pt; font-family:Consolas;">mapred.map.tasks</span><span style="font-size:10.0pt;font-family:宋体;">得到一个推荐长度</span><span style="font-size:10.0pt;font-family:Consolas;">goalSize, </span><span style="font-size:10.0pt; font-family:宋体;">然后通过式子</span><span style="font-size: 10.0pt;font-family:Consolas;">: Math.<em>max</em>(minSize, Math.<em>min</em>(goalSize, blockSize))</span><span style="font-size:10.0pt;font-family:宋体;">决定</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt; font-family:宋体;">输入长度</span><span style="font-size: 10.0pt;font-family:Consolas;">. </span><span style="font-size:10.0pt;font-family:宋体;">这里的</span><span style="font-size:10.0pt;font-family:Consolas;">minSize</span><span style="font-size:10.0pt;font-family:宋体;">为</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.min.split.size, blockSize</span><span style="font-size:10.0pt;font-family:宋体;">为相应文件的</span><span style="font-size:10.0pt;font-family:Consolas;">block</span><span style="font-size:10.0pt; font-family:宋体;">长度</span><span style="font-size:10.0pt; font-family:Consolas;">. </span><span style="font-size:10.0pt;font-family:宋体;">这式子能保证一个</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt; font-family:宋体;">的输入至少大于</span><span style="font-size: 10.0pt;font-family:Consolas;">mapred.min.split.size, </span><span style="font-size:10.0pt;font-family: 宋体;">对于推荐的</span><span style="font-size:10.0pt; font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">长度</span><span style="font-size:10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt; font-family:宋体;">只有它的长度小于</span><span style="font-size:10.0pt;font-family:Consolas;">blockSize</span><span style="font-size:10.0pt;font-family: 宋体;">且大于</span><span style="font-size:10.0pt; font-family:Consolas;">mapred.min.split.size</span><span style="font-size:10.0pt;font-family:宋体;">才会有效果</span><span style="font-size:10.0pt;font-family:Consolas;">. </span><span style="font-size:10.0pt; font-family:宋体;">由于</span><span style="font-size:10.0pt; font-family:Consolas;">mapred.min.split.size</span><span style="font-size:10.0pt;font-family:宋体;">默认长度为</span><span style="font-size:10.0pt;font-family:Consolas;">1, </span><span style="font-size:10.0pt; font-family:宋体;">因此通常情况下只要小于</span><span style="font-size:10.0pt;font-family:Consolas;">blockSize</span><span style="font-size:10.0pt;font-family: 宋体;">就有效果</span><span style="font-size:10.0pt; font-family:Consolas;">,</span><span style="font-size:10.0pt;font-family:宋体;">否则使用</span><span style="font-size:10.0pt;font-family:Consolas;">blockSize</span><span style="font-size:10.0pt; font-family:宋体;">做为</span><span style="font-size:10.0pt; font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">输入长度</span><span style="font-size:10.0pt;font-family:Consolas;">.</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">因此</span><span style="font-size:10.0pt; font-family:Consolas;">, </span><span style="font-size:10.0pt;font-family:宋体;">如果想增加</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt; font-family:宋体;">数</span><span style="font-size:10.0pt; font-family:Consolas;">, </span><span style="font-size:10.0pt;font-family:宋体;">可以把</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.min.split.size</span><span style="font-size:10.0pt;font-family:宋体;">调小</span><span style="font-size:10.0pt;font-family:Consolas;">(</span><span style="font-size:10.0pt; font-family:宋体;">其实默认值即可</span><span style="font-size: 10.0pt;font-family:Consolas;">), </span><span style="font-size:10.0pt;font-family:宋体;">另外还需要把</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.map.tasks</span><span style="font-size:10.0pt;font-family:宋体;">设置大.</span><span style="font-size:10.0pt;font-family:Consolas;"> </span><span style="font-size:10.0pt;font-family:Consolas;"></span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">如果需要减少</span><span style="font-size: 10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">数</span><span style="font-size:10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt;font-family:宋体;">可以把</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.min.split.size</span><span style="font-size:10.0pt;font-family:宋体;">调大</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">另外把</span><span style="font-size: 10.0pt;font-family:Consolas;">mapred.map.tasks</span><span style="font-size:10.0pt;font-family:宋体;">调小</span><span style="font-size:10.0pt; font-family:Consolas;">.</span></p>  <p style="text-indent:21.0pt"><span style="font-size:9.0pt; font-family:宋体;color:black;">这里要特别指出的是</span><span style="font-size:10.0pt;font-family:Consolas;">FileInputFormat</span><span style="font-size:10.0pt; font-family:宋体;">会让每个输入文件至少产生一个</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">任务</span><span style="font-size:10.0pt; font-family:Consolas;">, </span><span style="font-size:10.0pt;font-family:宋体;">因此如果你的输入目录下有许多文件</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">而每个文件都很小</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt;font-family:宋体;">例如几十</span><span style="font-size:10.0pt; font-family:Consolas;">kb, </span><span style="font-size:10.0pt;font-family:宋体;">那么每个文件都产生一个</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt; font-family:宋体;">会增加调度开销</span><span style="font-size: 10.0pt;font-family:Consolas;">. </span><span style="font-size:10.0pt;font-family:宋体;">作业变慢</span><span style="font-size:10.0pt;font-family:Consolas;">.</span></p>  <p style="text-indent: 21pt;"><span style="font-size:10.0pt; font-family:宋体;">那么如何防止这种问题呢</span><span style="font-size:10.0pt;font-family:Consolas;">? <span style="color:red">CombineFileInputFormat</span></span><span style="font-size:10.0pt;font-family:宋体;">能有效的减少</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt; font-family:宋体;">数量</span><span style="font-size: 10pt; font-family: Consolas;">.</span></p><p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:Consolas;"><br /></span></p>  <div>  <p><span style="font-size:14.0pt;font-family:Consolas;">FileInputFormat(</span><span style="font-size:14.0pt;font-family:宋体;">新接口</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">org.apache.hadoop.mapreduce.lib.input</span><span style="font-size:14.0pt;font-family:Consolas;">)</span></p>  <p style="text-indent:21.0pt"><span style="font-size:9.0pt;font-family:Consolas;">Hadoop 0.20</span><span style="font-size:9.0pt; font-family:宋体;">开始定义了一套新的</span><span style="font-size:9.0pt;font-family:Consolas;">mapreduce</span><span style="font-size:9.0pt;font-family: 宋体;">编程接口</span><span style="font-size:9.0pt; font-family:Consolas;">, </span><span style="font-size:9.0pt;font-family:宋体;">使用新的</span><span style="font-size:9.0pt;font-family:Consolas;">FileInputFormat, </span><span style="font-size: 9.0pt;font-family:宋体;">它与旧接口下的</span><span style="font-size:9.0pt;font-family:Consolas;">FileInputFormat</span><span style="font-size: 9.0pt;font-family:宋体;">主要区别在于</span><span style="font-size:9.0pt;font-family:Consolas;">, </span><span style="font-size:9.0pt; font-family:宋体;">它不再使用</span><span style="font-size: 10.0pt;font-family:Consolas;">mapred.map.tasks, </span><span style="font-size:10.0pt;font-family:宋体;">而使用</span><span style="font-size:10.0pt; font-family:Consolas;color:#2A00FF">mapred.max.split.size</span><span style="font-size:10.0pt;font-family:宋体;color:black;">参数代替</span><span style="font-size:10.0pt;font-family:Consolas;">goalSize, </span><span style="font-size:10.0pt; font-family:宋体;">通过</span><span style="font-size:10.0pt; font-family:Consolas;">Math.<em>max</em>(minSize, Math.<em>min</em>(maxSize, blockSize))</span><span style="font-size:10.0pt; font-family:宋体;">决定</span><span style="font-size:10.0pt; font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">输入长度</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">一个</span><span style="font-size:10.0pt; font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">的输入要大于</span><span style="font-size:10.0pt;font-family:Consolas;">minSize,</span><span style="font-size:10.0pt; font-family:宋体;">小于</span></p>  <p><span style="font-size:10.0pt;font-family:Consolas;">Math.<em>min</em>(maxSize, blockSize).</span></p>  <p><span style="font-size:10.0pt;font-family:Consolas;">&nbsp;&nbsp;&nbsp; </span><span style="font-size:10.0pt;font-family:宋体;">若需增加</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">数</span><span style="font-size:10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt; font-family:宋体;">可以把</span><span style="font-size: 10.0pt;font-family:Consolas;">mapred.min.split.size</span><span style="font-size:10.0pt;font-family: 宋体;">调小</span><span style="font-size:10.0pt; font-family:Consolas;">,</span><span style="font-size:10.0pt;font-family:宋体;">把</span><span style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">mapred.max.split.size</span><span style="font-size:10.0pt;font-family:宋体;color:black;">调大</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">. </span><span style="font-size:10.0pt;font-family:宋体;color:black;">若需减少</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size:10.0pt;font-family:宋体;color:black;">数</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">,</span> <span style="font-size:10.0pt;font-family:宋体;">可以把</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.min.split.size</span><span style="font-size:10.0pt;font-family:宋体;">调大</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">并把</span><span style="font-size:10.0pt; font-family:Consolas;color:#2A00FF">mapred.max.split.size</span><span style="font-size:10.0pt;font-family:宋体;">调小</span><span style="font-size:10.0pt;font-family:Consolas;">.</span></p>  </div><br />  <p><span style="font-size:14.0pt;font-family:Consolas;color:red;">CombineFileInputFormat</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">顾名思义</span><span style="font-size: 10.0pt;font-family:Consolas;">, CombineFileInputFormat</span><span style="font-size:10.0pt;font-family: 宋体;">的作用是把许多文件合并作为一个</span><span style="font-size: 10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">的输入</span><span style="font-size:10.0pt;font-family:Consolas;">.</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">在它之前</span><span style="font-size: 10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt;font-family:宋体;">可以使用</span><s><span style="font-size:10.0pt;font-family:Consolas;color:black;">MultiFileInputFormat</span></s><span style="font-size:10.0pt;font-family:Consolas;color:black;">,</span><span style="font-size:10.0pt; font-family:宋体;color:black;">不过其功能太简单</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">, </span><span style="font-size:10.0pt; font-family:宋体;color:black;">它</span><span style="font-family: 宋体;">以文件为单位，一个文件至多分给一个</span>map<span style="font-family:宋体;">处理</span>, <span style="font-family:宋体;">如果某个目录下有许多小文件</span><span>, </span><span style="font-family:宋体;">另外还有一个超大文件</span>, <span style="font-family:宋体;">处理大文件的</span>map<span style="font-family:宋体;">会严重偏慢</span>.</p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;">CombineFileInputFormat</span><span style="font-size:10.0pt; font-family:宋体;">是一个被推荐使用的</span><span style="font-size:10.0pt;font-family:Consolas;">InputFormat. </span><span style="font-size:10.0pt; font-family:宋体;">它有三个配置</span><span style="font-size: 10.0pt;font-family:Consolas;">:</span></p>  <p style="margin-left:21.0pt;text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;color:#2A00FF;">mapred.min.split.size.per.node</span><span style="font-size:10.0pt;font-family:宋体;color:#2A00FF;">，</span> <span style="font-size:10.0pt; font-family:宋体;color:#2A00FF;">一个节点上</span><span style="font-size:10.0pt;font-family:Consolas; color:#2A00FF;">split</span><span style="font-size:10.0pt; font-family:宋体;color:#2A00FF;">的至少的大小</span></p>  <p style="margin-left:21.0pt;text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;color:#2A00FF;">mapred.min.split.size.per.rack&nbsp;&nbsp; </span><span style="font-size:10.0pt; font-family:宋体;color:#2A00FF;">一个交换机下</span><span style="font-size:10.0pt;font-family:Consolas; color:#2A00FF;">split</span><span style="font-size:10.0pt; font-family:宋体;color:#2A00FF;">至少的大小</span></p>  <p style="margin-left:21.0pt;text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;color:#2A00FF;">mapred.max.split.size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.0pt;font-family:宋体;color:#2A00FF;">一个</span><span style="font-size:10.0pt;font-family:Consolas;color:#2A00FF;">split</span><span style="font-size:10.0pt;font-family:宋体;color:#2A00FF;">最大的大小</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">它的主要思路是把输入目录下的大文件分成多个</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">的输入</span><span style="font-size:10.0pt; font-family:Consolas;">, </span><span style="font-size:10.0pt;font-family:宋体;">并合并小文件</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">做为一个</span><span style="font-size: 10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">的输入</span><span style="font-size:10.0pt;font-family:Consolas;">. </span><span style="font-size:10.0pt;font-family:宋体;">具体的原理是下述三步</span><span style="font-size:10.0pt;font-family:Consolas;">: </span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;">1.</span><span style="font-size:10.0pt;font-family:宋体;">根据输入目录下的每个文件</span><span style="font-size: 10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt;font-family:宋体;">如果其长度超过</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.max.split.size,</span><span style="font-size:10.0pt;font-family:宋体;">以</span><span style="font-size:10.0pt;font-family:Consolas;">block</span><span style="font-size:10.0pt; font-family:宋体;">为单位分成多个</span><span style="font-size: 10.0pt;font-family:Consolas;">split(</span><span style="font-size:10.0pt;font-family:宋体;">一个</span><span style="font-size:10.0pt;font-family:Consolas;">split</span><span style="font-size:10.0pt;font-family:宋体;">是一个</span><span style="font-size:10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt; font-family:宋体;">的输入</span><span style="font-size: 10.0pt;font-family:Consolas;">),</span><span style="font-size:10.0pt;font-family:宋体;">每个</span><span style="font-size:10.0pt;font-family:Consolas;">split</span><span style="font-size:10.0pt;font-family:宋体;">的长度都大于</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.max.split.size, </span><span style="font-size:10.0pt;font-family:宋体;">因为以</span><span style="font-size:10.0pt;font-family:Consolas;">block</span><span style="font-size:10.0pt; font-family:宋体;">为单位</span><span style="font-size: 10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt;font-family:宋体;">因此也会大于</span><span style="font-size:10.0pt;font-family:Consolas;">blockSize, </span><span style="font-size:10.0pt;font-family:宋体;">此文件剩下的长度如果大于</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.min.split.size.per.node, </span><span style="font-size:10.0pt;font-family:宋体;">则生成一个</span><span style="font-size:10.0pt;font-family:Consolas;">split, </span><span style="font-size:10.0pt; font-family:宋体;">否则先暂时保留</span><span style="font-size: 10.0pt;font-family:Consolas;">.</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;">2. </span><span style="font-size:10.0pt;font-family:宋体;">现在剩下的都是一些长度效短的碎片</span><span style="font-size: 10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt;font-family:宋体;">把每个</span><span style="font-size:10.0pt;font-family:Consolas;">rack</span><span style="font-size:10.0pt;font-family:宋体;">下碎片合并</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">只要长度超过</span><span style="font-size: 10.0pt;font-family:Consolas;">mapred.max.split.size</span><span style="font-size:10.0pt;font-family: 宋体;">就合并成一个</span><span style="font-size:10.0pt; font-family:Consolas;">split, </span><span style="font-size:10.0pt;font-family:宋体;">最后如果剩下的碎片比</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.min.split.size.per.rack</span><span style="font-size:10.0pt;font-family:宋体;">大</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">就合并成一个</span><span style="font-size: 10.0pt;font-family:Consolas;">split, </span><span style="font-size:10.0pt;font-family:宋体;">否则暂时保留</span><span style="font-size:10.0pt;font-family:Consolas;">.</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;">3. </span><span style="font-size:10.0pt;font-family:宋体;">把不同</span><span style="font-size:10.0pt; font-family:Consolas;">rack</span><span style="font-size:10.0pt;font-family:宋体;">下的碎片合并</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">只要长度超过</span><span style="font-size: 10.0pt;font-family:Consolas;">mapred.max.split.size</span><span style="font-size:10.0pt;font-family: 宋体;">就合并成一个</span><span style="font-size:10.0pt; font-family:Consolas;">split, </span><span style="font-size:10.0pt;font-family:宋体;">剩下的碎片无论长度</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">合并成一个</span><span style="font-size: 10.0pt;font-family:Consolas;">split.</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">举例</span><span style="font-size:10.0pt; font-family:Consolas;">: mapred.max.split.size=1000</span></p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt;font-family:Consolas;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapred.min.split.size.per.node=300</span></p>  <p style="text-indent:21.0pt;"><span style="font-size:10.0pt;font-family:Consolas;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapred.min.split.size.per.rack=100</span></p>  <p style="text-indent:21.0pt;"><span style="font-size:10.0pt;font-family:宋体;">输入目录下五个文件</span><span style="font-size:10.0pt;font-family:Consolas;">,rack1</span><span style="font-size:10.0pt; font-family:宋体;">下三个文件</span><span style="font-size: 10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt;font-family:宋体;">长度为</span><span style="font-size:10.0pt;font-family:Consolas;">2050,1499,10, rack2</span><span style="font-size:10.0pt;font-family:宋体;">下两个文件</span><span style="font-size:10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt; font-family:宋体;">长度为</span><span style="font-size: 10.0pt;font-family:Consolas;">1010,80. </span><span style="font-size:10.0pt;font-family:宋体;">另外</span><span style="font-size:10.0pt;font-family:Consolas;">blockSize</span><span style="font-size:10.0pt;font-family:宋体;">为</span><span style="font-size:10.0pt;font-family:Consolas;">500.</span></p>  <p style="text-indent:21.0pt;"><span style="font-size:10.0pt;font-family:宋体;">经过第一步</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt; font-family:宋体;">生成五个</span><span style="font-size: 10.0pt;font-family:Consolas;">split: 1000,1000,1000,499,1000. </span><span style="font-size:10.0pt; font-family:宋体;">剩下的碎片为</span><span style="font-size: 10.0pt;font-family:Consolas;">rack1</span><span style="font-size:10.0pt;font-family:宋体;">下</span><span style="font-size:10.0pt;font-family:Consolas;">:50,10; rack2</span><span style="font-size:10.0pt;font-family:宋体;">下</span><span style="font-size:10.0pt;font-family:Consolas;">10:80</span></p>  <p style="text-indent:21.0pt;"><span style="font-size:10.0pt;font-family:宋体;">由于两个</span><span style="font-size:10.0pt;font-family:Consolas;">rack</span><span style="font-size:10.0pt; font-family:宋体;">下的碎片和都不超过</span><span style="font-size:10.0pt;font-family:Consolas;">100, </span><span style="font-size:10.0pt;font-family: 宋体;">所以经过第二步</span><span style="font-size:10.0pt; font-family:Consolas;">, split</span><span style="font-size:10.0pt;font-family:宋体;">和碎片都没有变化</span><span style="font-size:10.0pt;font-family:Consolas;">.</span></p>  <p style="text-indent:21.0pt;"><span style="font-size:10.0pt;font-family:宋体;">第三步</span><span style="font-size:10.0pt;font-family:Consolas;">,</span><span style="font-size:10.0pt; font-family:宋体;">合并四个碎片成一个</span><span style="font-size:10.0pt;font-family:Consolas;">split, </span><span style="font-size:10.0pt;font-family: 宋体;">长度为</span><span style="font-size:10.0pt; font-family:Consolas;">150.</span></p>  <p style="text-indent:21.0pt">&nbsp;</p>  <p style="text-indent:21.0pt"><span style="font-size:10.0pt; font-family:宋体;">如果要减少</span><span style="font-size: 10.0pt;font-family:Consolas;">map</span><span style="font-size:10.0pt;font-family:宋体;">数量</span><span style="font-size:10.0pt;font-family:Consolas;">, </span><span style="font-size:10.0pt;font-family:宋体;">可以调大</span><span style="font-size:10.0pt;font-family:Consolas;">mapred.max.split.size, </span><span style="font-size:10.0pt;font-family:宋体;">否则调小即可</span><span style="font-size:10.0pt;font-family:Consolas;">.</span></p>    <p style="text-indent: 21pt;"><span style="font-size:10.0pt; font-family:宋体;color:black;">其特点是</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">: </span><span style="font-size:10.0pt; font-family:宋体;color:black;">一个块至多作为一个</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size:10.0pt; font-family:宋体;color:black;">的输入，一个文件可能有多个块，一个文件可能因为块多分给做为不同</span><span style="font-size:10.0pt;font-family:Consolas;color:black;">map</span><span style="font-size: 10.0pt;font-family:宋体;color:black;">的输入，</span> <span style="font-size:10.0pt; font-family:宋体;color:black;">一个</span><span style="font-size:10.0pt;font-family:Consolas; color:black;">map</span><span style="font-size: 10pt; font-family: 宋体; color: black;">可能处理多个块，可能处理多个文件。</span></p><p style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体; color: black;"><br /></span></p><p style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体; color: black;"></span></p><div>  <p><span style="font-size:10.0pt;font-family:宋体;color:black;"></span></p><div>  <p><span style="font-size:14.0pt;font-family:宋体;color:black;">编写自己的</span><span style="font-size:14.0pt; font-family:Consolas;color:black;">InputFormat</span></p>  </div><span style="font-size:10.0pt; font-family:Consolas;color:black;"></span><p>&nbsp;</p>  <p><span style="font-size:10.0pt;font-family:Consolas;color:black;">&nbsp;&nbsp;&nbsp; </span><span style="font-size:10.0pt; font-family:宋体;color:black;">待续</span></p>  </div><br /><p>&nbsp;</p>  </div><img src ="http://www.blogjava.net/shenh062326/aggbug/382115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2012-07-03 22:17 <a href="http://www.blogjava.net/shenh062326/archive/2012/07/03/hadoop.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Yarn(MR2)上的应用汇总</title><link>http://www.blogjava.net/shenh062326/archive/2012/06/03/379845.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Sun, 03 Jun 2012 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2012/06/03/379845.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/379845.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2012/06/03/379845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/379845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/379845.html</trackback:ping><description><![CDATA[<div>      <p>Yarn<span style="font-family:宋体;">做为</span>hadoop<span style="font-family:宋体;">下一代集群资源管理和调度平台</span>, <span style="font-family:宋体;">其上能支持多种计算框架</span>, <span style="font-family:宋体;">本文就简要介绍一下这些计算框架</span>.</p>  <p><br /></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>1.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>MapReduce</p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;">首先是大家熟悉的</span>mapreduce, <span style="font-family:宋体;">在</span>MR2<span style="font-family:宋体;">之前</span>, hadoop<span style="font-family:宋体;">包括</span>HDFS<span style="font-family:宋体;">和</span>mapreduce, <span style="font-family:宋体;">做为</span>hadoop<span style="font-family:宋体;">上唯一的分布式计算框架</span>, <span style="font-family:宋体;">其优点是用户可以很方便的编写分布式计算程序</span>, <span style="font-family:宋体;">并支持许多的应用</span>, <span style="font-family:宋体;">如</span>hive, mahout, pig<span style="font-family:宋体;">等</span>. <span style="font-family:宋体;">但是其缺点是无法充分利用集群资源</span>, <span style="font-family:宋体;">不支持</span>DAG, <span style="font-family:宋体;">迭代式计算等</span>. <span style="font-family:宋体;">为了解决这些问题</span>, yahoo<span style="font-family:宋体;">提出了</span>Yarn (next generation mapreduce), <span style="font-family: 宋体;">一个分布式集群集群资源管理和调度平台</span>. <span style="font-family:宋体;">这样除了</span>mapreduce<span style="font-family:宋体;">外</span>, <span style="font-family:宋体;">还可以支持各种计算框架</span>.</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>2.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Spark</p>  <p style="margin-left:18.0pt;text-indent:0cm;">Spark<span style="font-family:宋体;">是一种与</span>mapreduce<span style="font-family:宋体;">相似的开源计算框架</span>, <span style="font-family:宋体;">不同之处在于</span>Spark<span style="font-family:宋体;">在某些工作负载方面表现更优</span>, <span style="font-family:宋体;">因为它使用了内存分布式数据集</span>, <span style="font-family:宋体;">另外除了提供交互式查询外</span>, <span style="font-family:宋体;">它还可以优化迭代工作负载</span>.</p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>3.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Apache HAMA</p>  <p style="margin-left:18.0pt"><strong>Apache Hama 是一个运行在HDFS上的</strong>BSP(Bulk Synchronous Parallel大容量同步并行) 计算框架, 主要针对大规模科学计算,如矩阵, 图像, 网络算法等.当前它有一下功能:</p>  <ul type="disc"><li style="      text-align:left;"><span style="font-family:宋体;">作业提交和管理接口</span></li><li style="      text-align:left;"><span style="font-family:宋体;">单节点上运行多个任务</span></li><li style="      text-align:left;"><span style="font-family:宋体;">输入</span>/<span style="font-family:宋体;">输出格式化</span></li><li style="      text-align:left;"><span style="font-family:宋体;">备份恢复</span></li><li style="      text-align:left;"><span style="font-family:宋体;">支持通过</span><a href="http://incubator.apache.org/hama/hama_on_clouds.html">Apache Whirr</a><span style="font-family:宋体;">运行在云端</span></li><li style="      text-align:left;"><span style="font-family:宋体;">支持与</span>Yarn<span style="font-family:宋体;">一起运行</span></li></ul>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>4.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Apache Giraph</p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;">图像处理平台上运行这大型算法</span>(<span style="font-family:宋体;">如</span>page rank, shared connections, personalization-based popularity <span style="font-family:宋体;">等</span>)<span style="font-family:宋体;">已经很流行</span>, Giraph<span style="font-family:宋体;">采用</span>BSP<span style="font-family:宋体;">模型（</span><span>bulk-synchronous parallel model</span><span style="font-family:宋体;">），可用于等迭代类算法。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>5.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Open MPI</p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;">这是一个高性能计算函数库，通常在</span>HPC<span style="font-family:宋体;">（</span>High Performance Computing<span style="font-family:宋体;">）中采用，与</span>MapReduce<span style="font-family:宋体;">相比，其性能更高，用户可控性更强，但编程复杂，容错性差，可以说，各有所长，在实际应用中，针对不同</span> <span style="font-family:宋体;">该应用会采用</span>MPI<span style="font-family:宋体;">或者</span>MapReduce<span style="font-family:宋体;">。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;"><span><span>6.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Apache HBase</p>  <p style="margin-left: 18pt; text-indent: 0cm;">HBase<span style="font-family:宋体;">是一个</span>hadoop<span style="font-family:宋体;">数据库</span>, <span style="font-family:宋体;">其特点是分布式，可扩展的，存储大数据。当有需要随机</span>,<span style="font-family:宋体;">实时读写的大数据时, </span><span style="font-family:宋体;">使用HBase</span><span><span style="font-family: 宋体;">很适合</span>. <br /></span></p><p style="margin-left: 18pt; text-indent: 0cm;"><span>本文参考:</span></p><p style="margin-left: 18pt; text-indent: 0cm;"><span><div>http://wiki.apache.org/hadoop/PoweredByYarn<br /><div>http://www.oschina.net/p/open+mpi</div></div></span></p><p style="margin-left:18.0pt;text-indent:0cm;"><span><div>http://incubator.apache.org/hama/<br /><div>http://incubator.apache.org/giraph/</div></div></span></p>  <p style="margin-left:18.0pt;text-indent:0cm;"><a href="http://hbase.apache.org/">http://hbase.apache.org/</a></p>    </div><img src ="http://www.blogjava.net/shenh062326/aggbug/379845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2012-06-03 11:43 <a href="http://www.blogjava.net/shenh062326/archive/2012/06/03/379845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VirtualBox虚拟安装Ubuntu 不能设置宽屏的解决办法</title><link>http://www.blogjava.net/shenh062326/archive/2012/05/24/379026.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Thu, 24 May 2012 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2012/05/24/379026.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/379026.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2012/05/24/379026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/379026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/379026.html</trackback:ping><description><![CDATA[<div><div>                 <h1><span style="font-size: 12pt;">转载 </span><div><span style="font-size: 12pt;">http://fujun.sinaapp.com/2011/11/02/68.html</span></div></h1><p> 第一步，打开终端，看看你的显卡Ubuntu能认出多少显示分辨率设置，输入命令<br /> <code><br /> wufujun@wufujun-VirtualBox:~$ xrandr<br /> </code></p> <p>系统给出的结果</p> <p>Screen 0: minimum 64 x 64, current 1024 x 768, maximum 32000 x 32000<br /> VBOX0 connected 1024&#215;768+0+0 0mm x 0mm<br /> 1024&#215;768 60.0 + 60.0<br /> 1600&#215;1200 60.0<br /> 1440&#215;1050 60.0<br /> 1280&#215;960 60.0<br /> 800&#215;600 60.0<br /> 640&#215;480 60.0</p> <p>这里可以看到，没有16：9的的分辨率设置</p> <p>第二步，用cvt命令测试1368&#215;768是否可用<br /> <code><br /> wufujun@wufujun-VirtualBox:~$ cvt 1368 768<br /> </code><br /> 显示结果如下<br /> # 1368&#215;768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.86 MHz<br /> Modeline &#8220;1368x768_60.00&#8243;   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync</p> <p>从这个结果里可以到，16：9的分辨率是可以用的</p> <p>第三步 输入<br /> <code><br /> wufujun@wufujun-VirtualBox:~$ sudo xrandr --newmode "1368x768" 85.86  1368 1440 1576 1784  768 771 781 798 -hsync +vsync<br /> </code><br /> 建立新的分辨率模式1368&#215;768，把刚才cvt得到的数据写进参数</p> <p>第四步 继续输入<br /> <code><br /> sudo xrandr --addmode VBOX0  "1368x768"<br /> </code><br /> 给当前显示器VBOX0增加1368&#215;768分辨率设置</p> <p>做完以上操作后，可以在&#8221;显示&#8220;设置里面看到显示的分辨率列表中多了一个 1368&#215;768(16:9)的选项。选中这个选项，点击应用，完美的宽屏显示回来了！</p> <p>经过测试，上面的方法做完以后，每次注销后就又变回了4：3的比例，而且会有的报错，没办法，按上面的修改完毕后，还要再修改一下/etc/X11/xorg.conf这个文件，这个配置文件在现在的版里已经取消了，所以需要我们新建一个</p> <p><code><br /> $ sudo gedit /etc/X11/xorg.conf<br /> </code></p> <p>编辑内容为：<br /> <code><br /> Section "Device"<br /> Identifier "Configured Video Device"<br /> EndSection</code></p><code> <p>Section "Monitor"<br /> Identifier "Configured Monitor"<br /> Modeline "1368x768_60.00"  85.86  1368 1440 1584 1800  768 769 772 795  -HSync +Vsync<br /> EndSection</p> </code><p><code>Section "Screen"<br /> Identifier "Default Screen"<br /> Monitor "Configured Monitor"<br /> Device "Configured Video Device"<br /> SubSection "Display"<br /> Modes "1368x768@60"<br /> EndSubSection<br /> EndSection<br /> </code><br /> 其中 Modeline &#8220;1368x768_60.00&#8243;  85.86  1368 1440 1584 1800  768 769 772  795  -HSync +Vsync 就是用$ cvt 1368 768得到的值。也可以用$ gtf 1368 768  60命令来得到这个Modeline的值，这个命令中，1368 768是分辨率 60为刷新率，用这个命令得到的值可能会更为准确一些。<br /> <code><br /> SubSection "Display"<br /> Modes "1368x768@60"<br /> EndSubSection<br /> </code><br /> 这段是设置默认显示最佳分辨率。</p> <p>注意这段文件中的一些规则</p> <p>Section &#8220;Device&#8221;区块中，Identifier指定了显卡的唯一名称，这个名称可以随便取，但一定要与Section  &#8220;Screen&#8221;区块中的device选项中的名称相同。在Section  &#8220;Monitor&#8221;区块中，Identifier指定了显示器的唯一名称，这个名称可以随便取，但一定要与Section  &#8220;Screen&#8221;区块中的Monitor选项中所指定的名称相同。Section  &#8220;Screen&#8221;区块中的Identifier选项，指定了这个显卡与显示器相结合的唯一名称。这个名称也可以随便取的。这个名称需要与Section  &#8220;ServerLayout&#8221; 区块中的名称相同。这个Section &#8220;ServerLayout&#8221; 区块我们一般不必编写</p>                                 </div></div><img src ="http://www.blogjava.net/shenh062326/aggbug/379026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2012-05-24 14:46 <a href="http://www.blogjava.net/shenh062326/archive/2012/05/24/379026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现自定义的classLoader加载classpath中的class</title><link>http://www.blogjava.net/shenh062326/archive/2012/05/20/yuling20120520.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Sun, 20 May 2012 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2012/05/20/yuling20120520.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/378623.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2012/05/20/yuling20120520.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/378623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/378623.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp; 最近这些天学习了classLoader的原理, 原因是因为服务器上的一个java进程启动时加载两个不同版本的jar包, 含有相同名字的类, 而且服务端的jar包排在前面, 我上传的jar包排在后面, 于是每次都使用服务端的jar包, 我的jar包便无法生效, 因此希望修改classLader, 让它按相反的顺序加载jar包.&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/shenh062326/archive/2012/05/20/yuling20120520.html'>阅读全文</a><img src ="http://www.blogjava.net/shenh062326/aggbug/378623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2012-05-20 19:43 <a href="http://www.blogjava.net/shenh062326/archive/2012/05/20/yuling20120520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>High Availability for the HDFS Namenode（翻译）</title><link>http://www.blogjava.net/shenh062326/archive/2012/03/24/yuling111.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Sat, 24 Mar 2012 13:38:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2012/03/24/yuling111.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/372624.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2012/03/24/yuling111.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/372624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/372624.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: High Availability for the HDFS Namenode  Sanjay Radia, Suresh Srinivas  Yahoo! Inc  &nbsp;(本文为namdnoe HA的设计文档翻译)  1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题阐述  有许多方法可以改善HDFS Namednoe（NN）的可用性，包括减少启动时间，更...&nbsp;&nbsp;<a href='http://www.blogjava.net/shenh062326/archive/2012/03/24/yuling111.html'>阅读全文</a><img src ="http://www.blogjava.net/shenh062326/aggbug/372624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2012-03-24 21:38 <a href="http://www.blogjava.net/shenh062326/archive/2012/03/24/yuling111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA代码编写的30条建议 </title><link>http://www.blogjava.net/shenh062326/archive/2011/11/28/364989.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Mon, 28 Nov 2011 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2011/11/28/364989.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/364989.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2011/11/28/364989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/364989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/364989.html</trackback:ping><description><![CDATA[<div><span id="ArticleContent1_ArticleContent1_lblContent">本文转自:<div>http://blog.csdn.net/zhouysh/article/details/304767</div><br />JAVA代码编写的30条建议 <br />(1) 类名首字母应该大写。字段、方法以及对象（句柄）的首字母应小写。对于所有标识符，其中包含的所有单词都应紧靠在一起，而且大写中间单词的首字母。例如： <br />ThisIsAClassName <br />thisIsMethodOrFieldName <br />若在定义中出现了常数初始化字符，则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。 <br />Java包（Package）属于一种特殊情况：它们全都是小写字母，即便中间的单词亦是如此。对于域名扩展名称，如com，org，net或者edu等，全部都应小写（这也是Java 1.1和Java 1.2的区别之一）。 <br /><br />(2) 为了常规用途而创建一个类时，请采取"经典形式"，并包含对下述元素的定义： <br /><br />equals() <br />hashCode() <br />toString() <br />clone()（implement Cloneable） <br />implement Serializable <br /><br />(3) 对于自己创建的每一个类，都考虑置入一个main()，其中包含了用于测试那个类的代码。为使用一个项目中的类，我们没必要删除测试代码。若进行了任何形式的改动，可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。 <br /><br />(4) 应将方法设计成简要的、功能性单元，用它描述和实现一个不连续的类接口部分。理想情况下，方法应简明扼要。若长度很大，可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用（有些时候，方法必须非常大，但它们仍应只做同样的一件事情）。 <br /><br />(5) 设计一个类时，请设身处地为客户程序员考虑一下（类的使用方法应该是非常明确的）。然后，再设身处地为管理代码的人考虑一下（预计有可能进行哪些形式的修改，想想用什么方法可把它们变得更简单）。 <br />(6) 使类尽可能短小精悍，而且只解决一个特定的问题。下面是对类设计的一些建议： <br />&#9632;一个复杂的开关语句：考虑采用"多形"机制 <br />&#9632;数量众多的方法涉及到类型差别极大的操作：考虑用几个类来分别实现 <br />&#9632;许多成员变量在特征上有很大的差别：考虑使用几个类 <br /><br />(7)   让一切东西都尽可能地"私有"--private。可使库的某一部分"公共化"（一个方法、类或者一个字段等等），就永远不能把它拿出。若强行拿出，就可 能破坏其他人现有的代码，使他们不得不重新编写和设计。若只公布自己必须公布的，就可放心大胆地改变其他任何东西。在多线程环境中，隐私是特别重要的一个 因素--只有private字段才能在非同步使用的情况下受到保护。 <br /><br />(8) 谨惕"巨大对象综合症"。对一些习惯于顺序编程思维、且初涉OOP领域的新手，往往喜欢先写一个顺序执行的程序，再把它嵌入一个或两个巨大的对象里。根据编程原理，对象表达的应该是应用程序的概念，而非应用程序本身。 <br /><br />(9) 若不得已进行一些不太雅观的编程，至少应该把那些代码置于一个类的内部。 <br /><br />(10) 任何时候只要发现类与类之间结合得非常紧密，就需要考虑是否采用内部类，从而改善编码及维护工作（参见第14章14.1.2小节的"用内部类改进代码"）。 <br /><br />(11) 尽可能细致地加上注释，并用javadoc注释文档语法生成自己的程序文档。 <br /><br />(12)   避免使用"魔术数字"，这些数字很难与代码很好地配合。如以后需要修改它，无疑会成为一场噩梦，因为根本不知道"100"到底是指"数组大小"还是"其他 全然不同的东西"。所以，我们应创建一个常数，并为其使用具有说服力的描述性名称，并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。  <br /><br />(13) 涉及构建器和异常的时候，通常希望重新丢弃在构建器中捕获的任何异常--如果它造成了那个对象的创建失败。这样一来，调用者就不会以为那个对象已正确地创建，从而盲目地继续。 <br /><br />(14)   当客户程序员用完对象以后，若你的类要求进行任何清除工作，可考虑将清除代码置于一个良好定义的方法里，采用类似于cleanup()这样的名字，明确表 明自己的用途。除此以外，可在类内放置一个boolean（布尔）标记，指出对象是否已被清除。在类的finalize()方法里，请确定对象已被清除， 并已丢弃了从RuntimeException继承的一个类（如果还没有的话），从而指出一个编程错误。在采取象这样的方案之前，请确定 finalize()能够在自己的系统中工作（可能需要调用System.runFinalizersOnExit(true)，从而确保这一行为）。 <br /><br />(15) 在一个特定的作用域内，若一个对象必须清除（非由垃圾收集机制处理），请采用下述方法：初始化对象；若成功，则立即进入一个含有finally从句的try块，开始清除工作。 <br /><br />(16)   若在初始化过程中需要覆盖（取消）finalize()，请记住调用super.finalize()（若Object属于我们的直接超类，则无此必 要）。在对finalize()进行覆盖的过程中，对super.finalize()的调用应属于最后一个行动，而不应是第一个行动，这样可确保在需要 基础类组件的时候它们依然有效。 <br /><br />(17) 创建大小固定的对象集合时，请将它们传输至一个数组（若准备从一个方法里返回这个集合，更应如此操作）。这样一来，我们就可享受到数组在编译期进行类型检查的好处。此外，为使用它们，数组的接收者也许并不需要将对象"造型"到数组里。 <br /><br />(18)   尽量使用interfaces，不要使用abstract类。若已知某样东西准备成为一个基础类，那么第一个选择应是将其变成一个interface（接 口）。只有在不得不使用方法定义或者成员变量的时候，才需要将其变成一个abstract（抽象）类。接口主要描述了客户希望做什么事情，而一个类则致力 于（或允许）具体的实施细节。 <br /><br />(19) 在构建器内部，只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法，因为那些方法可能被其他人覆盖或取消，从而在构建过程中产生不可预知的结果（参见第7章的详细说明）。 <br /><br />(20) 对象不应只是简单地容纳一些数据；它们的行为也应得到良好的定义。 <br /><br />(21) 在现成类的基础上创建新类时，请首先选择"新建"或"创作"。只有自己的设计要求必须继承时，才应考虑这方面的问题。若在本来允许新建的场合使用了继承，则整个设计会变得没有必要地复杂。 <br /><br />(22) 用继承及方法覆盖来表示行为间的差异，而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色，这是绝对应该避免的：应直接使用一个"颜色"字段。 <br /><br />(23) 为避免编程时遇到麻烦，请保证在自己类路径指到的任何地方，每个名字都仅对应一个类。否则，编译器可能先找到同名的另一个类，并报告出错消息。若怀疑自己碰到了类路径问题，请试试在类路径的每一个起点，搜索一下同名的.class文件。 <br /><br />(24)  在Java 1.1  AWT中使用事件"适配器"时，特别容易碰到一个陷阱。若覆盖了某个适配器方法，同时拼写方法没有特别讲究，最后的结果就是新添加一个方法，而不是覆盖现 成方法。然而，由于这样做是完全合法的，所以不会从编译器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。 <br /><br />(25)   用合理的设计方案消除"伪功能"。也就是说，假若只需要创建类的一个对象，就不要提前限制自己使用应用程序，并加上一条"只生成其中一个"注释。请考虑将 其封装成一个"独生子"的形式。若在主程序里有大量散乱的代码，用于创建自己的对象，请考虑采纳一种创造性的方案，将些代码封装起来。 <br /><br />(26) 警惕"分析瘫痪"。请记住，无论如何都要提前了解整个项目的状况，再去考察其中的细节。由于把握了全局，可快速认识自己未知的一些因素，防止在考察细节的时候陷入"死逻辑"中。 <br /><br />(27)   警惕"过早优化"。首先让它运行起来，再考虑变得更快--但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候，才应进行优化。 除非用专门的工具分析瓶颈，否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解，而且难于维护。 <br /><br />(28)  请记住，阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序，但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自 己，还是对后来的人，它们都是相当重要的。如对此仍有怀疑，那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折，这样或许能将你说服。 <br /><br />(29)   如认为自己已进行了良好的分析、设计或者实施，那么请稍微更换一下思维角度。试试邀请一些外来人士--并不一定是专家，但可以是来自本公司其他部门的人。 请他们用完全新鲜的眼光考察你的工作，看看是否能找出你一度熟视无睹的问题。采取这种方式，往往能在最适合修改的阶段找出一些关键性的问题，避免产品发行 后再解决问题而造成的金钱及精力方面的损失。 <br /><br />(30)  良好的设计能带来最大的回报。简言之，对于一个特定的问题，通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法，以后的工作就轻松 多了，再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报（甚至无可估量）。而且由于自己倾注了大量心血，最终获得一个出色的 设计方案，成功的快感也是令人心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失 </span></div><img src ="http://www.blogjava.net/shenh062326/aggbug/364989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2011-11-28 14:34 <a href="http://www.blogjava.net/shenh062326/archive/2011/11/28/364989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大象的崛起！Hadoop七年发展风雨录</title><link>http://www.blogjava.net/shenh062326/archive/2011/11/21/364390.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Mon, 21 Nov 2011 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2011/11/21/364390.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/364390.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2011/11/21/364390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/364390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/364390.html</trackback:ping><description><![CDATA[<div>   	 	 		  						<h2><div>本文转自it186云计算频道，原文地址：<a href="http://cloud.it168.com/a2011/0906/1243/000001243128.shtml">cloud.it168.com</a></div><br /></h2><p>在互联网这个领域一直有这样的说法：&#8220;如果老二无法战胜老大，那么就把老大赖以生存的东西开源吧&#8221;。当年Yahoo!与Google还是处在 强烈竞争关系时候，招聘了Doug(Hadoop创始人)，把Google老大赖以生存的DFS与Map-Reduce开源了，开始了Hadoop的童年 时期。差不多在2008年的时候，Hadoop才算逐渐成熟。</p> <p>从初创到现在，Hadoop经过了至少7年的积累，现在的Hadoop不仅是当年的老二Yahoo的专用产品了，从Hadoop长长的用户名单中， 可以看到Facebook、Linkedin、Amazon，可以看到EMC、eBay、Twitter、IBM、Microsoft,、Apple、 HP&#8230;国内的公司有淘宝、百度等等。</p> <p><img title="hadoop" src="http://pic.yupoo.com/iammutex/BmrJ41KM/medium.jpg" alt="" width="500" height="483" /></p> <p>本文将对Hadoop七年（2004-2011）的<a href="http://blog.nosqlfan.com/tags/%e5%8f%91%e5%b1%95%e5%8e%86%e7%a8%8b" title="查看 发展历程 的全部文章" target="_blank">发展历程</a>进 行梳理。读完本文后，将不难看出，Hadoop的发展基本上经历了这样一个过程：从一个开源的Apache基金会项目，随着越来越多的用户的加入，不断地 使用、贡献和完善，形成一个强大的生态系统，从2009年开始，随着云计算和大数据的发展，Hadoop作为海量数据分析的最佳解决方案，开始受到许多 IT厂商的关注，从而出现了许多Hadoop的商业版以及支持Hadoop的产品，包括软件和硬件。</p> <ul><li>2004年，Google发表论文，向全世界介绍了MapReduce。</li><li>2005年初，为了支持Nutch搜索引擎项目，Nutch的开发者基于Google发布的MapReduce报告，在Nutch上开发了一个可工作的MapReduce应用。</li><li>2005年年中，所有主要的Nutch算法被移植到使用MapReduce和NDFS(Nutch Distributed File System )来运行。</li><li>2006年1月，Doug Cutting加入雅虎，Yahoo!提供一个专门的团队和资源将Hadoop发展成一个可在网络上运行的系统。</li><li>2006年2月，Apache Hadoop项目正式启动以支持MapReduce和HDFS的独立发展。</li><li>2007年，百度开始使用Hadoop做离线处理，目前差不多80%的Hadoop集群用作日志处理。</li><li>2007年，中国移动开始在&#8220;大云&#8221;研究中使用Hadoop技术，规模超过1000台。</li><li>2008年，淘宝开始投入研究基于Hadoop的系统&#8212;&#8212;云梯，并将其用于处理<a title="电子商务" href="http://product.it168.com/list/b/1362_1.shtml" target="_blank">电子商务</a>相关数据。云梯1的总容量大概为9.3PB，包含了1100台机器，每天处理约18000道作业，扫描500TB数据。</li><li>2008年1月，Hadoop成为Apache顶级项目。</li><li>2008年2月，Yahoo!宣布其搜索引擎产品部署在一个拥有1万个内核的Hadoop集群上。</li><li>2008年7月，Hadoop打破1TB数据排序基准测试记录。Yahoo!的一个Hadoop集群用209秒完成1TB数据的排序 ，比上一年的纪录保持者保持的297秒快了将近90秒。</li><li>2009 年 3 月，Cloudera推出CDH(Cloudera&#8217;s Distribution including Apache Hadoop)平台，完全由开放源码软件组成，目前已经进入第3版。</li><li>2009年5月，Yahoo的团队使用Hadoop对1 TB的数据进行排序只花了62秒时间。</li><li>2009年7月 ，Hadoop Core项目更名为Hadoop Common;</li><li>2009年7月 ，MapReduce 和 Hadoop Distributed File System (HDFS) 成为Hadoop项目的独立子项目。</li><li>2009年7月 ，Avro 和 Chukwa 成为Hadoop新的子项目。</li><li>2010年5月 ，Avro脱离Hadoop项目，成为Apache顶级项目。</li><li>2010年5月 ，HBase脱离Hadoop项目，成为Apache顶级项目。</li><li>2010年5月，IBM提供了基于Hadoop 的大数据分析软件&#8212;&#8212;InfoSphere BigInsights，包括基础版和企业版。</li><li>2010年9月，Hive( Facebook) 脱离Hadoop，成为Apache顶级项目。</li><li>2010年9月，Pig脱离Hadoop，成为Apache顶级项目。</li><li>2011年1月，ZooKeeper 脱离Hadoop，成为Apache顶级项目。</li><li>2011年3月，Apache Hadoop获得Media Guardian Innovation Awards 。</li><li>2011年3月， Platform Computing 宣布在它的Symphony软件中支持Hadoop MapReduce API。</li><li>2011年5月，Mapr Technologies公司推出分布式文件系统和MapReduce引擎&#8212;&#8212;MapR Distribution for Apache Hadoop。</li><li>2011年5月，HCatalog 1.0发布。该项目由Hortonworks  在2010年3月份提出，HCatalog主要用于解决数据存储、元数据的问题，主要解决HDFS的瓶颈，它提供了一个地方来存储数据的状态信息，这使得 数据清理和归档工具可以很容易的进行处理。</li><li>2011年4月，SGI( Silicon Graphics International )基于SGI Rackable和CloudRack<a title="服务器" href="http://product.it168.com/list/b/0402_1.shtml" target="_blank">服务器</a>产品线提供Hadoop优化的解决方案。</li><li>2011年5月，EMC为客户推出一种新的基于开源Hadoop解决方案的数据中心设备&#8212;&#8212;GreenPlum HD，以助其满足客户日益增长的数据分析需求并加快利用开源数据分析软件。Greenplum是EMC在2010年7月收购的一家开源数据仓库公司。</li><li>2011年5月，在收购了Engenio之后， NetApp推出与Hadoop应用结合的产品E5400存储系统。</li><li>2011年6月，Calxeda公司(之前公司的名字是Smooth-Stone)发起了&#8220;开拓者行动&#8221;，一个由10家软件公司组成的团队将为基于Calxeda即将推出的ARM系统上芯片设计的<a title="服务器" href="http://product.pcpop.com/Server/00000_1.html" target="_blank">服务器</a>提供支持。并为Hadoop提供低功耗服务器技术。</li><li>2011年6月，数据集成供应商Informatica发布了其旗舰产品，产品设计初衷是处理当今事务和社会媒体所产生的海量数据，同时支持Hadoop。</li><li>2011年7月，Yahoo!和硅谷风险投资公司 Benchmark Capital创建了Hortonworks 公司，旨在让Hadoop更加鲁棒(可靠)，并让企业用户更容易安装、管理和使用Hadoop。</li><li>2011年8月，Cloudera公布了一项有益于合作伙伴生态系统的计划&#8212;&#8212;创建一个生态系统，以便硬件供应商、软件供应商以及系统集成商可以一起探索如何使用Hadoop更好的洞察数据。</li><li>2011年8月，Dell与Cloudera联合推出Hadoop解决方案&#8212;&#8212;Cloudera Enterprise。Cloudera  Enterprise基于Dell PowerEdge C2100机架服务器以及Dell PowerConnect 6248以太网<a title="交换机" href="http://product.it168.com/list/b/0412_1.shtml" target="_blank">交换机</a> 。</li></ul> <p><a href="http://pic.yupoo.com/iammutex/BmrJ2XRi/HOxzN.png" target="_blank"><img title="hadoop map" src="http://pic.yupoo.com/iammutex/BmrJ2XRi/medium.jpg" alt="" width="500" height="374" /></a></p> <p>在梳理的过程中，笔者发现了上图，它很好地展现了Hadoop生态系统是如何在使用中一步一步成长起来的。</p></div><img src ="http://www.blogjava.net/shenh062326/aggbug/364390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2011-11-21 09:04 <a href="http://www.blogjava.net/shenh062326/archive/2011/11/21/364390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让你提升命令行效率的 Bash 快捷键 [完整版]</title><link>http://www.blogjava.net/shenh062326/archive/2011/11/15/363791.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Tue, 15 Nov 2011 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2011/11/15/363791.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/363791.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2011/11/15/363791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/363791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/363791.html</trackback:ping><description><![CDATA[<div><h2>本文转自:<div>http://linuxtoy.org/archives/bash-shortcuts.html</div><br /></h2><div style="float:right; padding-left:5px;"> </div> 	<p>生活在 Bash shell 中，熟记以下快捷键，将极大的提高你的命令行操作效率。 </p>  <h3>编辑命令</h3>  <ul><li>Ctrl + a ：移到命令行首</li><li>Ctrl + e ：移到命令行尾</li><li>Ctrl + f ：按字符前移（右向）</li><li>Ctrl + b ：按字符后移（左向）</li><li>Alt  + f ：按单词前移（右向）</li><li>Alt  + b ：按单词后移（左向）</li><li>Ctrl + xx：在命令行首和光标之间移动</li><li>Ctrl + u ：从光标处删除至命令行首</li><li>Ctrl + k ：从光标处删除至命令行尾</li><li>Ctrl + w ：从光标处删除至字首</li><li>Alt  + d ：从光标处删除至字尾</li><li>Ctrl + d ：删除光标处的字符</li><li>Ctrl + h ：删除光标前的字符</li><li>Ctrl + y ：粘贴至光标后</li><li>Alt  + c ：从光标处更改为首字母大写的单词</li><li>Alt  + u ：从光标处更改为全部大写的单词</li><li>Alt  + l ：从光标处更改为全部小写的单词</li><li>Ctrl + t ：交换光标处和之前的字符</li><li>Alt  + t ：交换光标处和之前的单词</li><li>Alt  + Backspace：与 Ctrl + w 相同类似，分隔符有些差别 [感谢 rezilla 指正]</li></ul>  <h3>重新执行命令</h3>  <ul><li>Ctrl + r：逆向搜索命令历史</li><li>Ctrl + g：从历史搜索模式退出</li><li>Ctrl + p：历史中的上一条命令</li><li>Ctrl + n：历史中的下一条命令</li><li>Alt  + .：使用上一条命令的最后一个参数</li></ul>  <h3>控制命令</h3>  <ul><li>Ctrl + l：清屏</li><li>Ctrl + o：执行当前命令，并选择上一条命令</li><li>Ctrl + s：阻止屏幕输出</li><li>Ctrl + q：允许屏幕输出</li><li>Ctrl + c：终止命令</li><li>Ctrl + z：挂起命令</li></ul>  <h3>Bang (!) 命令</h3>  <ul><li>!!：执行上一条命令</li><li>!blah：执行最近的以 blah 开头的命令，如 !ls</li><li>!blah:p：仅打印输出，而不执行</li><li>!$：上一条命令的最后一个参数，与 Alt + . 相同</li><li>!$:p：打印输出 !$ 的内容</li><li>!*：上一条命令的所有参数</li><li>!*:p：打印输出 !* 的内容</li><li>^blah：删除上一条命令中的 blah</li><li>^blah^foo：将上一条命令中的 blah 替换为 foo</li><li>^blah^foo^：将上一条命令中所有的 blah 都替换为 foo</li></ul>  <p><em>友情提示</em>：</p>  <ol><li>以上介绍的大多数 Bash 快捷键仅当在 emacs 编辑模式时有效，若你将 Bash 配置为 vi 编辑模式，那将遵循 vi 的按键绑定。Bash 默认为 emacs 编辑模式。如果你的 Bash 不在 emacs 编辑模式，可通过 <code>set -o emacs</code> 设置。</li><li>^S、^Q、^C、^Z 是由终端设备处理的，可用 <code>stty</code> 命令设置。</li></ol></div><img src ="http://www.blogjava.net/shenh062326/aggbug/363791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2011-11-15 10:04 <a href="http://www.blogjava.net/shenh062326/archive/2011/11/15/363791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国外java 经典地址</title><link>http://www.blogjava.net/shenh062326/archive/2011/11/15/363789.html</link><dc:creator>俞灵</dc:creator><author>俞灵</author><pubDate>Tue, 15 Nov 2011 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/shenh062326/archive/2011/11/15/363789.html</guid><wfw:comment>http://www.blogjava.net/shenh062326/comments/363789.html</wfw:comment><comments>http://www.blogjava.net/shenh062326/archive/2011/11/15/363789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shenh062326/comments/commentRss/363789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shenh062326/services/trackbacks/363789.html</trackback:ping><description><![CDATA[<div><br />希望大家喜欢，自己留个备份，没事逛逛！！<br /><br /><a href="http://www.javaalmanac.com/" target="_blank"><span style="color: #000000;">http://www.javaalmanac.com</span></a> - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处. <br /><a href="http://www.onjava.com/" target="_blank"><span style="color: #000000;">http://www.onjava.com</span></a> - O'Reilly的Java网站. 每周都有新文章. <br /><a href="http://java.sun.com/" target="_blank"><span style="color: #000000;">http://java.sun.com</span></a> - 官方的Java开发者网站 - 每周都有新文章发表. <br /><a href="http://www.developer.com/java" target="_blank"><span style="color: #000000;">http://www.developer.com/java</span></a> - 由Gamelan.com 维护的Java技术文章网站. <br /><a href="http://www.java.net/" target="_blank"><span style="color: #000000;">http://www.java.net</span></a> - Sun公司维护的一个Java社区网站. <br /><a href="http://www.builder.com/" target="_blank"><span style="color: #000000;">http://www.builder.com</span></a> - Cnet的Builder.com网站 - 所有的技术文章, 以Java为主. <br /><a href="http://www.ibm.com/developerworks/java" target="_blank"><span style="color: #000000;">http://www.ibm.com/developerworks/java</span></a> - IBM的Developerworks技术网站; 这是其中的Java技术主页. <br /><a href="http://www.javaworld.com/" target="_blank"><span style="color: #000000;">http://www.javaworld.com</span></a> - 最早的一个Java站点. 每周更新Java技术文章. <br /><a href="http://www.devx.com/java" target="_blank"><span style="color: #000000;">http://www.devx.com/java</span></a> - DevX维护的一个Java技术文章网站. <br /><a href="http://www.fawcette.com/javapro" target="_blank"><span style="color: #000000;">http://www.fawcette.com/javapro</span></a> - JavaPro在线杂志网站. <br /><a href="http://www.sys-con.com/java" target="_blank"><span style="color: #000000;">http://www.sys-con.com/java</span></a> - Java Developers Journal的在线杂志网站. <br /><a href="http://www.javadesktop.org/" target="_blank"><span style="color: #000000;">http://www.javadesktop.org</span></a> - 位于Java.net的一个Java桌面技术社区网站. <br /><a href="http://www.theserverside.com/" target="_blank"><span style="color: #000000;">http://www.theserverside.com</span></a> - 这是一个讨论所有Java服务器端技术的网站. <br /><a href="http://www.jars.com/" target="_blank"><span style="color: #000000;">http://www.jars.com</span></a> - 提供Java评论服务. 包括各种framework和应用程序. <br /><a href="http://www.jguru.com/" target="_blank"><span style="color: #000000;">http://www.jguru.com</span></a> - 一个非常棒的采用Q&amp;A形式的Java技术资源社区. <br /><a href="http://www.javaranch.com/" target="_blank"><span style="color: #000000;">http://www.javaranch.com</span></a> - 一个论坛，得到Java问题答案的地方，初学者的好去处。 <br /><a href="http://www.ibiblio.org/javafaq/javafaq.html" target="_blank"><span style="color: #000000;">http://www.ibiblio.org/javafaq/javafaq.html</span></a> - comp.lang.java的FAQ站点 - 收集了来自comp.lang.java新闻组的问题和答案的分类目录. <br /><a href="http://java.sun.com/docs/books/tutorial/" target="_blank"><span style="color: #000000;">http://java.sun.com/docs/books/tutorial/</span></a> - 来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助. <br /><a href="http://www.javablogs.com/" target="_blank"><span style="color: #000000;">http://www.javablogs.com</span></a> - 互联网上最活跃的一个Java Blog网站. <br /><a href="http://java.about.com/" target="_blank"><span style="color: #000000;">http://java.about.com/</span></a> - 来自About.com的Java新闻和技术文章网站.</div><img src ="http://www.blogjava.net/shenh062326/aggbug/363789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shenh062326/" target="_blank">俞灵</a> 2011-11-15 09:45 <a href="http://www.blogjava.net/shenh062326/archive/2011/11/15/363789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>