分布式系统Hadoop实践报告实践分工:1.Hadoop简介Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS,HadoopDistributedFilesystem)和MapReduce(GoogleMapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。2.Hadoop环境搭建Hadoop的三种模式:本地模式:本地模拟实现,不使用分布式文件系统;伪分布式模式:5个进程在一台主机上启动,一般开发人员调试hadoop程序使用;完全分布式模式:至少3个结点,JobTracker和NameNode在同一台主机上,secondaryNameNode一台主机,DataNode和Tasktracker一台主机。由于条件有限,本实验采用伪分布式模式。windows7(64bit,memory8G)环境下利用vmware创建一个Linux虚拟机做主节点,然后复制两个Linux虚拟机做从节点。Hadoop实验环境:共3台测试机,1台namenode,2台datanodeOS版本:CentOS6.5(64bit)Hadoop:2.2.0Jdk:jdk1.7.02.1JDK环境变量设置1.cdetc进入此目录2.viprofile编辑配置文件3.加入如下配置exportJAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386exportJRE_HOME=/usr/lib/jvm/java-7-openjdk-i386/jreexportCLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH4.保存保存后,执行sourceprofile刷新配置文件。5.如果已安装JDK,查看JDK路径再配置。查看JDK的安装路径及版本。whereisjavawhichjava2.2修改主机名,IP地址映射1.主机、IP地址映射IP主机名用户名密码192.168.60.136masterroot123456192.168.60.137slave1root123456192.168.60.138slave2root1234562.查看IP地址3.修改主机名4.Ip,主机地址映射2.3准备3个节点Jdk,SSH,IP地址映射完成后,可以进行节点复制。这样可节省工作量。将主机master复制两份,分别命名为slave1,slave2。一个主节点,二个子节点1、复制的节点,要修改主机名,其它的不用改。2.4配置免登录2.4.1配置master免登录1.配置1)使用命令ssh-keygen一路回车,密码也输入空的就行了。2)查看生成的文件id_rsa.pub为公钥,id_rsa为私钥,紧接着将公钥文件复制成authorized_keys文件,这个步骤是必须的,过程如下:执行命令cat/root/.ssh/id_rsa.pub/root/.ssh/authorized_keys生成文件authorized_keys2.测试master自身免登录1)执行命令sshmaster无需输入密码,可直接进入。2.4.2配置slave1免登录1.配置cat/root/.ssh/id_rsa.pub/root/.ssh/authorized_keys2.测试slave1自身免登录2.4.3配置slave2免登录1.配置cat/root/.ssh/id_rsa.pub/root/.ssh/authorized_keys2.测试slave2自身免登录2.4.4配置master免登录slave1slave2为了实现这个功能,两个slave结点的公钥文件中必须要包含主结点的公钥信息,这样当master就可以顺利安全地访问这两个slave结点了。操作过程如下:1.配置slave12.配置slave23.关闭3台机器的防火墙2.5配置Hadoop环境1.找到配置文件在目录/root/hadoop-2.2.0/etc/hadoop2.配置hadoop-env.sh修改此文件找到exportJAVA_HOME这一列,后面改成自己的jdk安装目录3.配置yarn-env.sh5.配置slaves6.配置core-site.xmlconfigurationpropertynamefs.defaultFS/namevaluehdfs://master:9000/value/propertypropertynameio.file.buffer.size/namevalue131072/value/propertypropertynamehadoop.tmp.dir/namevaluefile:/root/temp/valuedescriptionAbaseforothertemporarydirectories./description/propertypropertynamehadoop.proxyuser.hduser.hosts/namevalue*/value/propertypropertynamehadoop.proxyuser.hduser.groups/namevalue*/value/property/configuration7.配置hdfs-site.xmlconfigurationpropertynamedfs.namenode.secondary.http-address/namevaluemaster:9001/value/propertypropertynamedfs.namenode.name.dir/namevaluefile:/root/hdfs/name/value/propertypropertynamedfs.datanode.data.dir/namevaluefile:/root/hdfs/data/value/propertypropertynamedfs.replication/namevalue2/value/propertypropertynamedfs.webhdfs.enabled/namevaluetrue/value/property/configuration8.配置mapred-site.xmlconfigurationpropertynamemapreduce.framework.name/namevalueyarn/valuefinaltrue/final/property/configuration9.配置yarn-site.xmlconfigurationpropertynameyarn.nodemanager.aux-services/namevaluemapreduce_shuffle/value/propertypropertynameyarn.nodemanager.aux-services.mapreduce.shuffle.class/namevalueorg.apache.hadoop.mapred.ShuffleHandler/value/property!--resourcemanagerhostname或ip地址--propertynameyarn.resourcemanager.hostname/namevaluemaster/value/property/configuration10.格式化3环境测试3.1启动Hdfs的启动和mpareduce的启动可以分开。3.1.1启动hdfs3.1.2启动mapreduce3.2访问测试测试程序3.3.1编写WordCount例子Map.javapackagehadoop.main;importjava.io.IOException;importjava.util.StringTokenizer;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapred.MapReduceBase;importorg.apache.hadoop.mapred.Mapper;importorg.apache.hadoop.mapred.OutputCollector;importorg.apache.hadoop.mapred.Reporter;@SuppressWarnings(deprecation)publicclassMapextendsMapReduceBaseimplementsMapperLongWritable,Text,Text,IntWritable{/***LongWritable,IntWritable,Text均是Hadoop中实现的用于封装Java*数据类型的类,这些类实现了WritableComparable接口,*都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为long,int,String的替代品。*/privatefinalstaticIntWritableone=newIntWritable(1);privateTextword=newText();/***Mapper接口中的map方法:voidmap(K1key,V1value,OutputCollectorK2,V2*output,Reporterreporter)映射一个单个的输入k/v对到一个中间的k/v对*输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。*OutputCollector接口:收集Mapper和Reducer输出的k,v对。OutputCollector接口的collect(k,*v)方法:增加一个(k,v)对到output*/publicvoidmap(LongWritablekey,Textvalue,OutputCollectorText,IntWritableoutput,Reporterreporter)throwsIOException{Stringline=value.toString();StringTokenizertokenizer=newStringTokenizer(line);while(tokenizer.hasMoreTokens()){word.set(tokenizer.nextToken());output.collect(word,one);}}}Reduce.javapackagehadoop.main;importjava.io.IOException;importjava.util.Iterator;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapred.MapReduceBase;importorg.apache.hadoop.mapred.OutputCollector;importorg.apache.hadoop.mapred.Reducer;importorg.apache