Hadoop的个人理解1Hadoop的关键技术Hadoop是一个比较成熟的分布式数据处理的框架。它有两个关键的技术:HDFS和map/reduce。HDFS是分布式的数据存储系统,能够将海量的数据分布式的存储在大量PC上,而map/reduce则是分布式的计算框架,能够实现将数据在多个节点上同时进行计算。1.1HDFSHDFS的结构示意图如下。图1HDFS的结构示意图HDFS的结构HDFS上的文件为了能够分布式存储,都被拆分为一个个的小数据块,默认是64M。这些数据块分散的存储在整个HDFS中。为了能够管理好这个集群,需要一个监控点,就是namenode。它维护着HDFS上面的所有文件块所在数据节点的位置。而数据节点datanode才是真正用来存储分散的文件块。HDFS的冗余备份整个HDFS的文件数据的信息都在namenode上,一旦namenode出现故障,那么HDFS就无法工作,所以secondnamenode是用来给namenode做备份节点。同样,每个文件数据块也不是仅仅保存一份,根据用户的设置dfs.replicaton能够复制多份,一般是默认为3份。这3份也是通过算法来选择的,第二个数据块应该在同机架的其他节点上,第三个数据块应该在其他机架上,用以保证无论发生何种情况,文件数据块不会完全丢失。HDFS的故障处理HDFS这种大型的集群往往都需要keep-alive机制,datanode周期性的会向namenode发送心跳信息告知datanode是存活的。一旦datanode发生故障而失效,namenode能够在短时间内感知到。此时,不仅新上传的数据不会再传输给此节点,由于这个节点的失效,此节点上的数据的复制因子也下降了,namenode会寻找其他的节点来再复制失效节点上的数据。1.2map/reduce机制map/reduce结构如图:图2map/reduce结构分为jobtracker和tasktracker。结构可以和HDFS相对应,jobtracker是用来负责分配计算任务的节点,它掌握所有节点计算的程度,调配节点。tasktracker就是真正负责处理计算的节点。文件块在传送给map进行处理时,需要先处理成key,value的键值对。之后,map会在k1,v1的基础上进行计算,传送出结果k2,v2。最后,reduce任务在处理之前会将相同key的键值对合并在一起,形成key,(value1,value2…),reduce任务进行最后的规约处理,将所有value进行叠加,完成输出结果k3,v3。下图是HDFS与map/reduce整体运行的示意图。图3HDFS与map/reduce整体运行的示意图客户端首先需要提交任务到Jobtracker,然后Jobtracker会分配一个作业ID,然后告知客户端HDFS的路径。客户端将需要处理的文件传给HDFS。Tasktracker会不断的发送心跳保活信息给Jobtracker,告知其自己现在的状态,是否能够接受计算任务。如果Tasktracker可以接受任务,且有需要计算的任务。Jobtracker会在response信息中将任务分配给Tasktracker。分配是有就近原则的,最好分配的计算任务的文件块就是在本地的datanode上。Tasktracker进行map/reduce计算好后,会将结果输出到HDFS中。2wordcount执行关于分布式处理我们可以使用wordcount来进行分析。我用vmware虚拟化出三台虚拟机,hdp0作为namenode,hdp1和hdp2作为datanode。Hadoop的搭建方法可从网上找到,=ts2VDONqG8g4IMXGf4tbUi6GGs3krDXbmMt0OavJEo9TvTBzzkNXsgRXIpw0pZXCif9hLWaCPnqUv4h7vJAeVbllMgL2DWT5YLundbJVSri重点在于namenode和datanode之间的密钥的交换,Hadoop的配置。其中有几个比较容易忽视的地方。(1)/etc/hostname,每个主机都需要在里面设置自己的主机名,否则Hadoop启动时会发现以localhost.domain来启动,结果启动失败。(2)在vmware中挂起主机再打开后可能会发现接口变成未托管状态,无法联网。这是因为CentOS中存在两套网络设置方案冲突的缘故,可在/etc/NetworkManager/NetworkManager.conf中加入如下:[ifupdown]managed=true之后systemctlrestartnetwork.service,重启网络服务即可解决。安装完成并启动之后能够通过设置好的web的监控页面开看到整个集群的存储情况。下图为数据节点集群监控页面。图4数据节点集群监控页面之后创建testfile文件。testmapreduceifitisrightthemapreducenumberwillbe2.然后需要上传此文件到集群中。hadoopfs–mkdir/testhadoopfs–put/home/hadoop/test/testfile.txt/test此时可见,HDFS中已经创建了test文件夹,其中有testfile.txt文件图5HDFS文件系统示意图接着,我们执行wordcount程序来对文件进行记数操作,并把结果导入/test/output中。图6wordcount打印信息此时可以从hdp0:8088网页监控页面中看到有一个task正在运行计算中。图7Hadoopjob监控页面经过一段时间的运算后,map/reduce工作完成。图8wordcount运行完成打印信息图之后,查看运算结果。图9map/reduce运行结果图从中可以看见,mapreduce的出现次数为2,计算结果正确。3wordcount源码分析接下来结合wordcount源码来分析第2节中的运算过程。如下是比较关键的几处代码:JobConfconf=newJobConf(WordCount.class);conf.setJobName(wordcount);//设置一个用户定义的job名称conf.setOutputKeyClass(Text.class);//为job的输出数据设置Key类conf.setOutputValueClass(IntWritable.class);//为job输出设置value类conf.setMapperClass(Map.class);//为job设置Mapper类conf.setCombinerClass(Reduce.class);//为job设置Combiner类conf.setReducerClass(Reduce.class);//为job设置Reduce类conf.setInputFormat(TextInputFormat.class);//为map-reduce任务设置InputFormat实现类conf.setOutputFormat(TextOutputFormat.class);//为map-reduce任务设置OutputFormat实现类在执行wordcount时的打印信息中我们可以看到,首先会将这个wordcount的任务作为一个job提交给jobtracker。jobtracker作为管理任务的节点会分配map任务和reduce任务的tasktracker。提交的文件是inputsplit操作之后的。inputsplit这个操作的用途是将文件数据块转换成键值对key,value的形式传输给map进行处理。而inputsplit这个操作可以在inputformat中进行设置。从源码中可以看到,设置为TextInputFormat。这个TextInputFormat的作用是按照字符的偏移位置进行键值对的切分。如我们的testfile.txt,经过inputsplit后应该如下:0testmapreduce0ifitisrightthemapreducenumberwillbe2.map的处理map接收inputsplit处理后的键值对,进行进一步的处理publicvoidmap(LongWritablekey,Textvalue,outcollectorText,IntWritable)throwsIOException,InterruptedException{StringTokenizeritr=newStringTokenizer(value.toString());while(itr.hasMoreTokens()){word.set(itr.nextToken());output.collect(word,one);}}从代码中可见,map接收LongWritable的key和Text的文字进行处理,输出则为Text,IntWritable的类型的。outputcollector通过收集所有的键值对,将所有相同的key的value组合在一起,形成key,listofvalue。reduce的处理publicvoidreduce(Textkey,IterableIntWritablevalues,outcollectorText,IntWritable)throwsIOException,InterruptedException{intsum=0;for(IntWritableval:values){sum+=val.get();}result.set(sum);output.collect(key,result);}reduce的输入是经过map处理过的Text,IntWritable的键值对,输出是每个单词的数目,格式自然也是Text,IntWritable。reduce的处理就是将相同key的value一个一个的累加起来即可。最终,会调用outputformat将结果输入到指定的文件中。4ecplise连接Hadoop在Windows下可以使用ecplise这种开发工具连接Hadoop集群进行开发。首先需要下载插件hadoop-eclipse-plugin-2.5.2.jar将其放入plugin文件夹下,然后重启ecplise。再设定map/reducelocation这个选项,设定好hdfsmaster的IP地址和端口。需要注意的是由于Windows和Linux的用户名不同,存在权限问题。需要在hdfs-site.xml中加入dfs.perssion选择false,这样就可以通过ecplise来接入Hadoop,操作HDFS的文件。同时,还可以在Windows下进行开发分布式计算的程序。图10ecplise连接Hadoop示意图从之前的wordcount的结果来看,示例程序的wordcount是按照空格来区分单词的,所以2.被认为是一个单词,可以尝试修改源码来达到识别.的效果。