大数据与云计算 | 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常见操作_第1张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第2张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第3张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第4张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第5张图片

 

3.2 前置配置操作()

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

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第6张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第7张图片

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

  1. 打开终端,运行sudo apt-get install openssh-server,安装ssh
  2. 运行sudo ufw disable,关闭防火墙
  3. 运行ssh-keygen –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常见操作_第8张图片

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常见操作_第9张图片

jdk安装界面

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第10张图片

Hadoop下载页面

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第11张图片

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”指令使刚刚的配置立即生效

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常见操作_第12张图片  

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

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第13张图片

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

  1.   
  2.       
  3.         dfs.replication  
  4.         3  
  5.       
  6.       
  7.         dfs.name.dir  
  8.         /usr/local/hadoop/hdfs/name  
  9.       
  10.       
  11.         dfs.data.dir  
  12.         /usr/local/hadoop/hdfs/data  
  13.       
  14.       
  15.       
  16.         yarn.nodemanager.aux-services  
  17.         mapreduce_shuffle  
  18.       
  19.       
  20.         yarn.resourcemanager.hostname  
  21.         master  
  22.       
  23.   

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第16张图片

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

  1. data1  
  2. data2  
  3. data3  

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第17张图片

3.3 克隆虚拟机

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第18张图片

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第19张图片

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第20张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第21张图片

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

3.4 前置配置操作()

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第22张图片

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

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

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第23张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第24张图片

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第25张图片

3.4.5 ssh免密登录配置

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

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第26张图片

3.5 启动Hadoop

3.5.1 启动HDFS

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

  1. bin/hdfs namenode –format   

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第27张图片

3.5.1.2 开启HDFS

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

sbin/start-all.sh   

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第28张图片

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

3.6 上传一个文件至HDFS

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第29张图片

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常见操作_第30张图片

静等其运行完成:

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第31张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第32张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第33张图片

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 ");  
  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 {  
  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 {  
  10.     private IntWritable result = new IntWritable();  // 记录词的频数  
  11.       
  12.     // Reducer抽象类的核心方法  
  13.     public void reduce (Text key, Iterable values, Context context) throws IOException, InterruptedException {  
  14.         int sum = 0;  
  15.         // 遍历values  list 叠加  
  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常见操作_第34张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第35张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第36张图片

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

大数据与云计算 | Hadoop分布式集群搭建与HDFS、Hadoop、MapReduce常见操作_第37张图片

(U201717126.txt的文件内容)

 

四、实验结果

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

 

五、体会

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

你可能感兴趣的:(实验,考试与课设)