大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

一、实验目的

  1. 熟悉Hadoop分布式集群的搭建过程
  2. 学习Hadoop分布式集群的使用示例

 

二、实验内容

  1. 搭建Hadoop分布式集群环境
  2. 掌握HDFS常见操作,自行编写一个英文文本文件,上传至HDFS中
  3. 使用Hadoop提供的example程序实现统计该文件的wordcount
  4. *自行编写实现wordcount功能的MapReduce程序

 

三、实验过程

3.1 虚拟机环境配置

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.1.1 从https://www.virtualbox.org下载并安装安装Oracle VM VirtualBox,新建一台Linux虚拟机,分配1024MB内存(master分配2048MB)、50GB虚拟硬盘(使用VDI映像,动态分配空间)

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.1.2 刚新建完成的虚拟机没有操作系统,为了兼顾稳定性和主机负载,我选用了桌面版Ubuntu 16.04(https://ubuntu.com/download/desktop)下载镜像后,在存储区挂载Ubuntu安装镜像的虚拟光盘后开机

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.1.3 根据安装程序的提示,在虚拟机中安装Ubuntu,按照默认设置安装即可,静等安装完成,安装完成后卸载ISO虚拟光驱

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.1.4为了便于后续的IP与MAC绑定操作,设置虚拟机的网络连接方式为“桥接网卡”,至此,虚拟机的配置大体完成

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

 

3.2 前置配置操作()

(为减轻重复配置的工作量,先配置一台虚拟机,配置完成后克隆出三台虚拟机,然后配置虚拟机之间不同部分)

3.2.1 编辑hostname文件,将第一台虚拟机命名为master,保存

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.2 编辑hosts文件,修改127.0.1.1的名称为master,保存

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.3 安装ssh并配置SSH免密登录

  1. 打开终端,运行sudo apt-get install openssh-server,安装ssh
  2. 运行sudo ufw disable,关闭防火墙
  3. 运行ssh-****** –t rsa,一直回车,设置密码为空,直至出现RSA**
  4. 运行cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys,将公钥追加到“authorized_keys”文件
  5. 设定文件权限:chmod 600 .ssh/authorized_keys
  6. 运行ssh localhost,如出现下图界面,说明配置成功

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.4 安装JDK和Hadoop

  1. 运行sudo apt-get install openjdk-8-jdk,完成JDK的安装
  2. https://hadoop.apache.org/下载Hadoop 2.10.0,下载完成后解压,移动到“/usr/local”目录下,重命名文件夹名为hadoop

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

jdk安装界面

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

Hadoop下载页面

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

Hadoop安装目录

3.2.5 配置JDK与Hadoop的系统环境变量

需要修改配置文件/etc/profile,添加Java和Hadoop的环境变量

  1. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64  
  2. export PATH=$JAVA_HOME/bin:$PATH  
  3. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
  4.   
  5. export HADOOP_HOME=/usr/local/hadoop  
  6. export PATH=$PATH:$HADOOP_HOME/bin  

保存后运行“source /etc/profile”指令使刚刚的配置立即生效

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.6 配置Hadoop相关配置文件

3.2.6.1 修改/usr/local/hadoop/etc/hadoop/hadoop-env.sh,配置JDK路径为:

“/usr/lib/jvm/java-1.8.0-openjdk-amd64”

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作  

3.2.6.2 修改/usr/local/hadoop/etc/hadoop/core-site.xml —— HDFS默认地址和Web UI配置

  1. <configuration>  
  2.     <property>  
  3.         <name>hadoop.tmp.dir</name>  
  4.         <value>file:/usr/local/hadoop/tmp</value>  
  5.         <description>Abase for other temporary directories.</description>  
  6.     </property>  
  7.     <property>  
  8.         <name>fs.defaultFS</name>  
  9.         <value>hdfs://master:9000</value>  
  10.     </property>  
  11. </configuration>  

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.6.3 修改/usr/local/hadoop/etc/hadoop/hdfs-site.xml —— HDFS副本

  1. <configuration>  
  2.     <property>  
  3.         <name>dfs.replication</name>  
  4.         <value>3</value>  
  5.     </property>  
  6.     <property>  
  7.         <name>dfs.name.dir</name>  
  8.         <value>/usr/local/hadoop/hdfs/name</value>  
  9.     </property>  
  10.     <property>  
  11.         <name>dfs.data.dir</name>  
  12.         <value>/usr/local/hadoop/hdfs/data</value>  
  13.     </property>  
  14.     <!--  
  15.     <property>  
  16.         <name>dfs.namenode.datanode.registration.ip-hostname-check</name>  
  17.         <value>false</value>  
  18.     </property>  
  19.     -->  
  20. </configuration>  

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.6.4 修改/usr/local/hadoop/etc/hadoop/mapred-site.xml——设置MapReduce使用的框架:拷贝mapred-site.xml.template,命名为“mapred-site.xml”,对其做如下配置:

  1. <configuration>  
  2.   <property>  
  3.       <name>mapreduce.framework.name</name>  
  4.       <value>yarn</value>  
  5.   </property>  
  6.    <property>  
  7.       <name>mapred.job.tracker</name>  
  8.       <value>http://master:9001</value>  
  9.   </property>  
  10.   <property>  
  11.       <name>mapreduce.reduce.maxattempts</name>  
  12.       <value>100</value>  
  13.   </property>  
  14.   <property>  
  15.       <name>mapreduce.map.maxattempts</name>  
  16.       <value>100</value>  
  17.   </property>  
  18. </configuration>  

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.6.5 修改/usr/local/hadoop/etc/hadoop/yarn-site.xml

  1. <configuration>  
  2. <!-- Site specific YARN configuration properties -->  
  3.     <property>  
  4.         <name>yarn.nodemanager.aux-services</name>  
  5.         <value>mapreduce_shuffle</value>  
  6.     </property>  
  7.     <property>  
  8.         <name>yarn.resourcemanager.hostname</name>  
  9.         <value>master</value>  
  10.     </property>  
  11. </configuration>  

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.2.6.6 修改/usr/local/hadoop/etc/hadoop/slaves,添加以下内容(即hostname文件中要设置的主机名):

  1. data1  
  2. data2  
  3. data3  

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.3 克隆虚拟机

将虚拟机复制3份,重新生成MAC地址,使用“完全复制”,作为从机

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

VM VirtualBox中的四台虚拟机,全部启动

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

虚拟机全部启动后,系统资源使用情况

3.4 前置配置操作()

3.4.1 使用ifconfig命令查询每一台虚拟机的IP地址

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

经查询,master的IP地址为10.0.0.103,三台从机的IP地址为10.0.0.104、10.0.105、10.0.107

3.4.2 编辑hostname文件,将三台从机分别命名为data1、data2、data3,保存

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.4.3 编辑hosts文件,修改127.0.1.1的名称为本机的hostname,加入四个IP地址对应虚拟机的host,保存

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.4.4 为了避免各虚拟机的内网IP地址发生变化,在路由器设置界面将IP与MAC地址绑定,或将DHCP地址租期设置为最大值,以免反复调整hosts文件

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.4.5 ssh免密登录配置

把自己的**拷贝到需要免密的机器上,对每台虚拟机执行以下命令:

ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@IP地址【注意是用户名,不是主机名!】

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.5 启动Hadoop

3.5.1 启动HDFS

3.5.1.1 格式化文件系统:在master的/usr/local/hadoop目录运行以下命令:

  1. bin/hdfs namenode –format   

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.5.1.2 开启HDFS

在master的/usr/local/hadoop目录运行以下命令:

sbin/start-all.sh   

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

出现上图所示界面,Hadoop启动成功

3.6 上传一个文件至HDFS

  1. 在hadoop目录下新建一个文本文件,填充英文文本,命名为U201717126.txt,执行以下命令:hadoop fs -copyFromLocal U201717126.txt /dest
  2. 执行命令hadoop fs -ls /dest,显示相应的文件,表明上传成功

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.7 使用example程序统计文件wordcount

  1. 输入命令: hadoop jar usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar wordcount /dest /out     
  2. 在虚拟机中打开http://master:8088,可以看到wordcount正在运行

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

静等其运行完成:

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

从localhost:50070/explorer.html打开hadoop的文件浏览器,在out文件夹下有_SUCCESS和part-r-00000两个文件

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

下载part-r-00000文件并打开,词频统计与文档U201717126.txt内容一致

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

3.8 编写实现wordcount功能的MapReduce程序(选做)

3.8.1 编写WordMain.java:

  1. package wordcount;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.hadoop.conf.Configuration;  
  6. import org.apache.hadoop.fs.Path;  
  7. import org.apache.hadoop.io.IntWritable;  
  8. import org.apache.hadoop.io.Text;  
  9. import org.apache.hadoop.mapreduce.Job;  
  10. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  11. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  12. import org.apache.hadoop.util.GenericOptionsParser;  
  13.   
  14. public class WordMain {  
  15.     public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {  
  16.         // Configuration类:读取配置文件内容-core-site.xml  
  17.         Configuration conf = new Configuration();  
  18.           
  19.         // 读取命令行参数,并设置到conf  
  20.         String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();  
  21.           
  22.         // 添加内容  
  23.         conf.set("fs.defaultFS""hdfs://10.13.7.72:9000");  
  24.         conf.set("hadoop.job.user""hadoop");  
  25.         conf.set("mapreduce.framework.name""yarn");  
  26.         conf.set("mapreduce.jobtracker.address""10.13.7.72:9001");  
  27.         conf.set("yarn.resourcemanager.hostname""10.13.7.72");  
  28.         conf.set("yarn.resourcemanager.admin.adress""10.13.7.72:8033");  
  29.         conf.set("yarn.resourcemanager.adress""10.13.7.72:8032");  
  30.         conf.set("yarn.resourcemanager.resource-tracker.address""10.13.7.72:8036");  
  31.         conf.set("yarn.resourcemanager.scheduler.address""10.13.7.72:8030");  
  32.           
  33.           
  34.         if (otherArgs.length != 2) { // 输入目录 输出目录  
  35.             System.err.println("Usage: wordcount <in><out>");  
  36.             System.exit(2);  
  37.         }  
  38.           
  39.         Job job = new Job(conf, "word count"); // 新建一个job  
  40.         job.setJar("wordcount.jar");  
  41.           
  42.         job.setJarByClass(WordMain.class); // 设置主类  
  43.         job.setMapperClass(WordMapper.class); // 设置Mapper  
  44.         job.setCombinerClass(WordReducer.class); // 设置作业合成类  
  45.         job.setReducerClass(WordReducer.class); // 设置Reducer  
  46.         job.setOutputKeyClass(Text.class); // 设置输出数据的关键类  
  47.         job.setOutputValueClass(IntWritable.class); // 设置输出值类  
  48.         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));  
  49.         FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));  
  50.         System.exit(job.waitForCompletion(true) ? 0 : 1);         
  51.     }  
  52. }  

3.8.2 编写WordMapper.java:

  1. package wordcount;  
  2.   
  3.   
  4. import java.io.IOException;  
  5. import java.util.StringTokenizer;  
  6.   
  7. import org.apache.hadoop.io.IntWritable;  
  8. import org.apache.hadoop.io.Text;  
  9. import org.apache.hadoop.mapreduce.Mapper;  
  10.   
  11. public class WordMapper extends Mapper<Object, Text, Text, IntWritable> {  
  12.     private final static IntWritable one = new IntWritable(1);  
  13.     private Text word = new Text();  
  14.       
  15.     // Mapper类的核心方法  
  16.     /** 
  17.      *  key 首字符偏移量 
  18.      *  value 文件的一行内容 
  19.      *  context Mapper端的上下文 
  20.      * @throws InterruptedException  
  21.      * @throws IOException  
  22.      */  
  23.     public void map(Object key, Text value, Context context) throws IOException, InterruptedException {  
  24.         StringTokenizer itr = new StringTokenizer(value.toString());  
  25.         while (itr.hasMoreTokens()) {  
  26.             word.set(itr.nextToken());  
  27.             context.write(word, one);  
  28.         }  
  29.     }  
  30. }  

3.8.3 编写WordReducer.java:

  1. package wordcount;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.hadoop.io.IntWritable;  
  6. import org.apache.hadoop.io.Text;  
  7. import org.apache.hadoop.mapreduce.Reducer;  
  8.   
  9. public class WordReducer extends Reducer<Text, IntWritable, Text, IntWritable> {  
  10.     private IntWritable result = new IntWritable();  // 记录词的频数  
  11.       
  12.     // Reducer抽象类的核心方法  
  13.     public void reduce (Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {  
  14.         int sum = 0;  
  15.         // 遍历values  list<value> 叠加  
  16.         for (IntWritable value : values) {  
  17.             sum += value.get();  
  18.         }  
  19.         result.set(sum);  
  20.         context.write(key, result);  
  21.     }  
  22. }  

3.8.4 将Java程序打包为my_wordcount.jar,置于hadoop目录,运行:

hadoop my_wordcount.jar wordcount.WordMain /U201717126.txt /out2  

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

出现上图界面,顺利运行完成

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

在hadoop中的out2文件夹生成了两个文件

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

下载part-r-00000文件并打开,词频统计与文档U201717126.txt内容一致

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作

(U201717126.txt的文件内容)

 

四、实验结果

  1. 完成Hadoop分布式集群环境搭建
  2. 完成编写一个英文文本文件,上传至HDFS中
  3. 完成用Hadoop提供的example程序实现统计该文件的wordcount
  4. 自行编写实现wordcount功能的MapReduce程序并运行成功

 

五、体会

通过本次实验,我对Hadoop分布式集群、HDFS分布式存储、MapReduce分布式计算、Yarn资源调度有了更深刻的理解,掌握了Hadoop分布式集群环境搭建、HDFS文件的操作与MapReduce分布式计算程序的编译运行,对大数据与云计算的功能与原理有了进一步的了解。