淘宝招聘hadoop工程师若q? 面向在校?2014q毕?,工作地点:杭州或北?/strong>
Hadoop研发工程?br />职位描述
(zhn)将负责Q?br />1Q预研、开发、测试hdfs/mapreduce/hive/hbase的功能、性能和扩展;
2Q对有助于提升集处理能?高可用?高扩展性的各种解决Ҏ(gu)q行跟踪和落圎ͼ
3Q解xv量数据不断增镉K临的挑战Q解决业务需求?/span>
(zhn)需要具备:(x)
1、熟l运用java语言Q?br />2、熟(zhn)jvmq行机制、熟(zhn)linuxQ?br />3、至熟(zhn)hadoop、hbase、hive{Y件之一Q?br />
有意者请发送邮件到 yuling.sh@taobao.com
mapreduce?/span>,一?/span>job?/span>map个数, 每个map处理的数据量是如何决定的?/span>? 另外每个map又是如何d输入文g的内容呢? 用户是否可以自己军_输入方式, 军_map个数?/span>? q篇文章详l讲q?/span>hadoop中各U?/span>InputFormat的功能和如何~写自定义的InputFormat.
?/span>: mapreduce作业?x)根据输入目录生多?/span>mapd, 通过多个mapdq行执行来提高作业运行速度, 但如?/span>map数量q少, q行量低, 作业执行?/span>, 如果map数过?/span>, 资源有限, 也会(x)增加调度开销. 因此, Ҏ(gu)输入产生合理?/span>map?/span>, 为每?/span>map分配合适的数据?/span>, 能有效的提升资源利用?/span>, q作业q行速度加快.
?/span>mapreduce?/span>, 每个作业都会(x)通过 InputFormat来决?/span>map数量. InputFormat是一个接?span>, 提供两个Ҏ(gu):
InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
RecordReader<K, V> getRecordReader(InputSplit split,
JobConf job,
Reporter reporter) throws IOException;
其中getSplitsҎ(gu)?x)根据输入目录?/span>InputSplit数组, 每个InputSplit?x)相应生一?/span>mapd, map的输入定义在InputSplit?/span>. getRecordReaderҎ(gu)q回一?/span>RecordReader对象, RecordReader军_?/span>mapd如何d输入数据, 例如一行一行的dq是一个字节一个字节的d, {等.
下图?/span>InputFormat的实现类:
(暂时无法上传)
q理详细介绍FileInputFormat?/span>CombineFileInputFormat, 其它不常?/span>,有兴的可以自己查看hadoop源码.
FileInputFormat(旧接?/span>org.apache.hadoop.mapred)
mapreduce默认使用TextInputFormatQ?/span>TextInputFormat没有实现自己?/span>getSplitsҎ(gu),?/span>l承?/span>FileInputFormat, 因此使用?/span>FileInputFormat?
org.apache.hadoop.mapred.FileInputFormat?/span>getSplits程:
两个配置
mapred.min.split.size (一?/span>map最输入长?/span>),
mapred.map.tasks (推荐map数量)
如何军_每个map输入长度?/span>? 首先获取输入目录下所有文件的长度?/span>, 除以mapred.map.tasks得到一个推荐长?/span>goalSize, 然后通过式子: Math.max(minSize, Math.min(goalSize, blockSize))军_map输入长度. q里?/span>minSize?/span>mapred.min.split.size, blockSize为相应文件的block长度. q式子能保证一?/span>map的输入至大?/span>mapred.min.split.size, 对于推荐?/span>map长度,只有它的长度于blockSize且大?/span>mapred.min.split.size才会(x)有效?/span>. ׃mapred.min.split.size默认长度?/span>1, 因此通常情况下只要小?/span>blockSize有效果,否则使用blockSize做ؓ(f)map输入长度.
因此, 如果惛_?/span>map?/span>, 可以?/span>mapred.min.split.size调小(其实默认值即?/span>), 另外q需要把mapred.map.tasks讄?
如果需要减?/span>map?/span>,可以?/span>mapred.min.split.size调大, 另外?/span>mapred.map.tasks调小.
q里要特别指出的?/span>FileInputFormat?x)让每个输入文g臛_产生一?/span>mapd, 因此如果你的输入目录下有许多文g, 而每个文仉很小, 例如几十kb, 那么每个文g都生一?/span>map?x)增加调度开销. 作业变慢.
那么如何防止q种问题?/span>? CombineFileInputFormat能有效的减少map数量.
FileInputFormat(新接?/span>org.apache.hadoop.mapreduce.lib.input)
Hadoop 0.20开始定义了一套新?/span>mapreduce~程接口, 使用新的FileInputFormat, 它与旧接口下?/span>FileInputFormat主要区别在于, 它不再?/span>mapred.map.tasks, 而?/span>mapred.max.split.size参数代替goalSize, 通过Math.max(minSize, Math.min(maxSize, blockSize))军_map输入长度, 一?/span>map的输入要大于minSize,于
Math.min(maxSize, blockSize).
若需增加map?/span>,可以?/span>mapred.min.split.size调小,?/span>mapred.max.split.size调大. 若需减少map?/span>, 可以?/span>mapred.min.split.size调大, q把mapred.max.split.size调小.
CombineFileInputFormat
思义, CombineFileInputFormat的作用是把许多文件合q作Z?/span>map的输?/span>.
在它之前,可以使用MultiFileInputFormat,不过其功能太?/span>, ?/span>以文件ؓ(f)单位Q一个文件至多分l一?/span>map处理, 如果某个目录下有许多文?/span>, 另外q有一个超大文?/span>, 处理大文件的map?x)严重偏?/span>.
CombineFileInputFormat是一个被推荐使用?/span>InputFormat. 它有三个配置:
mapred.min.split.size.per.nodeQ?/span> 一个节点上split的至的大小
mapred.min.split.size.per.rack 一个交换机?/span>split臛_的大?/span>
mapred.max.split.size 一?/span>split最大的大小
它的主要思\是把输入目录下的大文件分成多?/span>map的输?/span>, q合q小文g, 做ؓ(f)一?/span>map的输?/span>. 具体的原理是下述三步:
1.Ҏ(gu)输入目录下的每个文g,如果光度超q?/span>mapred.max.split.size,?/span>block为单位分成多?/span>split(一?/span>split是一?/span>map的输?/span>),每个split的长度都大于mapred.max.split.size, 因ؓ(f)?/span>block为单?/span>, 因此也会(x)大于blockSize, 此文件剩下的长度如果大于mapred.min.split.size.per.node, 则生成一?/span>split, 否则先暂时保?/span>.
2. 现在剩下的都是一些长度效短的片,把每?/span>rack下碎片合q?/span>, 只要长度过mapred.max.split.size合q成一?/span>split, 最后如果剩下的片?/span>mapred.min.split.size.per.rack?/span>, 合q成一?/span>split, 否则暂时保留.
3. 把不?/span>rack下的片合ƈ, 只要长度过mapred.max.split.size合q成一?/span>split, 剩下的碎片无论长?/span>, 合ƈ成一?/span>split.
举例: mapred.max.split.size=1000
mapred.min.split.size.per.node=300
mapred.min.split.size.per.rack=100
输入目录下五个文?/span>,rack1下三个文?/span>,长度?/span>2050,1499,10, rack2下两个文?/span>,长度?/span>1010,80. 另外blockSize?/span>500.
l过W一?/span>, 生成五个split: 1000,1000,1000,499,1000. 剩下的碎片ؓ(f)rack1?/span>:50,10; rack2?/span>10:80
׃两个rack下的片和都不超q?/span>100, 所以经q第二步, split和碎片都没有变化.
W三?/span>,合ƈ四个片成一?/span>split, 长度?/span>150.
如果要减?/span>map数量, 可以调大mapred.max.split.size, 否则调小卛_.
其特Ҏ(gu): 一个块臛_作ؓ(f)一?/span>map的输入,一个文件可能有多个块,一个文件可能因为块多分l做Z?/span>map的输入, 一?/span>map可能处理多个块,可能处理多个文g?/span>
~写自己?/span>InputFormat
待箋
Yarn做ؓ(f)hadoop下一代集资源管理和调度q_, 其上能支持多U计框?/span>, 本文q要介l一下这些计框?/span>.
1. MapReduce
首先是大家熟(zhn)的mapreduce, ?/span>MR2之前, hadoop包括HDFS?/span>mapreduce, 做ؓ(f)hadoop上唯一的分布式计算框架, 其优Ҏ(gu)用户可以很方便的~写分布式计程?/span>, q支持许多的应用, ?/span>hive, mahout, pig{?/span>. 但是其缺Ҏ(gu)无法充分利用集群资源, 不支?/span>DAG, q代式计等. Z解决q些问题, yahoo提出?/span>Yarn (next generation mapreduce), 一个分布式集群集群资源理和调度^?/span>. q样除了mapreduce?/span>, q可以支持各U计框?/span>.
2. Spark
Spark是一U与mapreduce怼的开源计框?/span>, 不同之处在于Spark在某些工作负载方面表现更?/span>, 因ؓ(f)它用了内存分布式数据集, 另外除了提供交互式查询外, 它还可以优化q代工作负蝲.
3. Apache HAMA
Apache Hama 是一个运行在HDFS上的BSP(Bulk Synchronous Parallel大容量同步ƈ? 计算框架, 主要针对大规模科学计?如矩? 囑փ, |络法{?当前它有一下功?
4. Apache Giraph
囑փ处理q_上运行这大型法(?/span>page rank, shared connections, personalization-based popularity {?/span>)已经很流?/span>, Giraph采用BSP模型Q?/span>bulk-synchronous parallel modelQ,可用于等q代cȝ法?/span>
5. Open MPI
q是一个高性能计算函数库,通常?/span>HPCQ?/span>High Performance ComputingQ中采用Q与MapReduce相比Q其性能更高Q用户可控性更强,但编E复杂,定w性差Q可以说Q各有所长,在实际应用中Q针对不?/span> 该应用会(x)采用MPI或?/span>MapReduce?/span>
6. Apache HBase
HBase是一?/span>hadoop数据?/span>, 其特Ҏ(gu)分布式,可扩展的Q存储大数据。当有需要随?/span>,实时d的大数据? 使用HBase很适合.
本文参?
W一步,打开l端Q看看你的显卡Ubuntu能认出多显C分辨率讄Q输入命?br />
wufujun@wufujun-VirtualBox:~$ xrandr
pȝl出的结?/p>
Screen 0: minimum 64 x 64, current 1024 x 768, maximum 32000 x 32000
VBOX0 connected 1024×768+0+0 0mm x 0mm
1024×768 60.0 + 60.0
1600×1200 60.0
1440×1050 60.0
1280×960 60.0
800×600 60.0
640×480 60.0
q里可以看到Q没?6Q?的的分L率设|?/p>
W二步,用cvt命o(h)试1368×768是否可用
wufujun@wufujun-VirtualBox:~$ cvt 1368 768
昄l果如下
# 1368×768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.86 MHz
Modeline “1368x768_60.00″ 85.25 1368 1440 1576 1784 768 771 781 798 -hsync +vsync
从这个结果里可以刎ͼ16Q?的分辨率是可以用?/p>
W三?输入
wufujun@wufujun-VirtualBox:~$ sudo xrandr --newmode "1368x768" 85.86 1368 1440 1576 1784 768 771 781 798 -hsync +vsync
建立新的分L率模?368×768Q把刚才cvt得到的数据写q参?/p>
W四?l箋输入
sudo xrandr --addmode VBOX0 "1368x768"
l当前显C器VBOX0增加1368×768分L率设|?/p>
做完以上操作后,可以?#8221;昄“讄里面看到昄的分辨率列表中多了一?1368×768(16:9)的选项。选中q个选项Q点d用,完美的宽屏显C回来了Q?/p>
l过试Q上面的Ҏ(gu)做完以后Q每ơ注销后就又变回了4Q?的比例,而且?x)有的报错,没办法,按上面的修改完毕后,q要再修改一?etc/X11/xorg.confq个文gQ这个配|文件在现在的版里已l取消了Q所以需要我们新Z?/p>
$ sudo gedit /etc/X11/xorg.conf
~辑内容为:(x)
Section "Device"
Identifier "Configured Video Device"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
Modeline "1368x768_60.00" 85.86 1368 1440 1584 1800 768 769 772 795 -HSync +Vsync
EndSection
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
SubSection "Display"
Modes "1368x768@60"
EndSubSection
EndSection
其中 Modeline “1368x768_60.00″ 85.86 1368 1440 1584 1800 768 769 772 795 -HSync +Vsync 是? cvt 1368 768得到的倹{也可以? gtf 1368 768 60命o(h)来得到这个Modeline的|q个命o(h)中,1368 768是分辨率 60为刷新率Q用q个命o(h)得到的值可能会(x)更ؓ(f)准确一些?br />
SubSection "Display"
Modes "1368x768@60"
EndSubSection
q段是设|默认显C最?jng)_辨率?/p>
注意q段文g中的一些规?/p>
Section “Device”区块中,Identifier指定了显卡的唯一名称Q这个名U可以随便取Q但一定要与Section “Screen”区块中的device选项中的名称相同。在Section “Monitor”区块中,Identifier指定了显C器的唯一名称Q这个名U可以随便取Q但一定要与Section “Screen”区块中的Monitor选项中所指定的名U相同。Section “Screen”区块中的Identifier选项Q指定了q个昑֍与显C器相结合的唯一名称。这个名UC可以随便取的。这个名U需要与Section “ServerLayout” 区块中的名称相同。这个Section “ServerLayout” 区块我们一般不必编?/p>
在互联网q个领域一直有q样的说法:(x)“如果老二无法战胜老大Q那么就把老大赖以生存的东西开源吧”。当qYahoo!与Googleq是处在 强烈竞争关系时候,招聘了Doug(Hadoop创始?Q把Google老大赖以生存的DFS与Map-Reduce开源了Q开始了Hadoop的童q?时期。差不多?008q的时候,Hadoop才算逐渐成熟?/p>
从初创到现在QHadoopl过了至?q的U篏Q现在的Hadoop不仅是当q的老二Yahoo的专用品了Q从Hadoop镉K的用户名单中Q?可以看到Facebook、Linkedin、AmazonQ可以看到EMC、eBay、Twitter、IBM、Microsoft,、Apple?HP…国内的公司有淘宝、百度等{?/p>
本文对Hadoop七年Q?004-2011Q的发展历程q?行梳理。读完本文后Q将不难看出QHadoop的发展基本上l历了这样一个过E:(x)从一个开源的Apache基金?x)项目,随着来多的用L(fng)加入Q不断地 使用、A(ch)献和完善QŞ成一个强大的生态系l,?009q开始,随着云计和大数据的发展QHadoop作ؓ(f)量数据分析的最佌x案,开始受到许?IT厂商的关注,从而出C许多Hadoop的商业版以及(qing)支持Hadoop的品,包括软g和硬件?/p>
在梳理的q程中,W者发C上图Q它很好地展CHadoop生态系l是如何在用中一步一步成长v来的?/p>
生活?Bash shell 中,熟记以下快捷键,极大的提高你的命o(h)行操作效率?
友情提示Q?/p>
set -o emacs
讄?/li>stty
命o(h)讄?/li>