菜鸟配置hadoop集群模式

前言

这个本来是本人的云计算应用的课程作业,好吧!我承认我倒腾了半天,不过还是捣腾出来了,特此记之,方便后人。

环境配置

1.hadoop配置
首先安装虚拟机VMware Workstation Pro,然后安装镜像Ubuntu 14.04.3 LTS,系统安装完毕手动安装VMware Tools工具。
(1).首先更新软件包,执行命令:

sudo apt-get update

在这里插入图片描述
(2).配置jdk,首先从本机桌面拖拽到虚拟机桌面;执行命令:

sudo mkdir /usr/lib/jvm  # 新建文件夹
sudo tar zxvf /home/ubuntu/Desktop/jdk-7-linux-i586.tar.gz  -C/usr/lib/jvm # 解压文件

在这里插入图片描述

(3).进入配置文件,更改配置环境:

sudo gedit /etc/profile

在文件最后添加如下代码,注意路径按照自己的:

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

(4).重启系统,使配置文件生效:

sudo shutdown -r now

(5).查看是否安装配置成功:

java -version

在这里插入图片描述

(6).复制hadoop-0.22.0.tar.gz文件到桌面,然后解压到指定路径下:

sudo tar zxvf /home/ubuntu/Desktop/hadoop-0.22.0.tar.gz -C/home/ubuntu # 解压
mv /home/ubuntu/hadoop-0.22.0 /home/ubuntu/Hadoop # 重命名文件

(7).打开hadoop目录下面的conf文件夹,更改环境变量:

sudo gedit /home/ubuntu/Hadoop/conf/hadoop-env.sh

#export JAVA_HOME=/usr/lib/jvm/java-7-sun改为export JAVA_HOME=/usr/lib/jvm/jdk1.7.0,如下:
在这里插入图片描述
(8).配置ssh,命令如下:

sudo apt-get install ssh

在这里插入图片描述
sudo apt-get install rsync

单机模式操作

  1. 实验介绍
    在一台虚拟机上配置hadoop的环境,最终运行hadoop的测试文件。
  2. 实验过程
    首先进入之前的hadoop的安装目录,然后输入如下命令:
mkdir input
cp conf/*.xml input
bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'

在这里插入图片描述

  1. 实验结果
    查看实验结果,执行如下命令:
cat output/*

在这里插入图片描述

伪分布模式操作

(1).更改conf目录下的配置文件。
conf/core-site.xml文件
添加如下代码:

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

文件内容如下图所示:
在这里插入图片描述
conf/hdfs-site.xml文件
添加如下代码:

<configuration>
     <property>
            <name>dfs.replication</name>
        <value>1</value>
     </property>
</configuration>

文件内容如下图所示:

conf/mapred-site.xml文件
添加如下代码:

<configuration>
      <property>
           <name>mapred.job.tracker</name> 
       <value>localhost:9001</value>
      </property>
</configuration> 

文件内容如下图所示:
在这里插入图片描述
(2).查看是否能够免密登录。
在这里插入图片描述

ssh localhost

如果提示需要输入密码,则执行如下命令:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

(3).格式化一个新的分布式文件系统:

bin/hadoop namenode -format

在这里插入图片描述

(4).启动hadoop守护进程:

bin/start-all.sh

在这里插入图片描述

(5).将输入文件拷贝到分布式文件系统,并运行实例程序:

bin/hadoop fs -put conf input
bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'

在这里插入图片描述

(6).查看输出文件:
方式一:从分布式系统拷贝到本地进行查看:

bin/hadoop fs -get output output
cat output/*

在这里插入图片描述

方式二:在分布式文件系统上查看输出文件:

bin/hadoop fs -cat output/*

在这里插入图片描述

(7).web页面查看管理界面。
hdfs管理界面查看:(http://localhost:50070)
在这里插入图片描述
Reduce Administrationg管理界面查看:(http://localhost:50030)
在这里插入图片描述
(8).完成全部操作后,停止守护进程。

bin/stop-all.sh

集群模式操作

前提:集群在原有的单击模式下进行修改,复制虚拟机并新建若干个虚拟机(此处为2个),配置好jdk环境并添加环境变量,安装ssh并实现自身的免密登录,教程见上。
(1).更改每台虚拟机的主机名,此处我们设置主节点为master,子节点分别为slave1,slave2,之后依次类推。主节点命令如下:

sudo gedit /etc/hostname

在这里插入图片描述

(2).更改主机名后,为每台虚拟机分别设置hosts映射;并注释127.0.1.1 ubuntu,具体配置依照自身情况进行设置。个人配置如下,执行命令并进行修改:

sudo gedit /etc/hosts

在这里插入图片描述

(3).配置hosts文件后,每台虚拟机都进行重新操作,保证配置文件生效。重启后交叉测试ping,保证每台虚拟机都能够相互连通,此处测试其一,ping后Ctrl+C进行取消:

ping slave1

在这里插入图片描述

(4).为主节点进入子节点设置免密登录。
在每个子节点中分别执行如下命令(注意“ubuntu@master”是指主节点的“用户名@主机名”,可以直接在Terminal前面看到):

cd ~/.ssh 
ls
scp ubuntu@master:~/.ssh/id_dsa.pub ./master_dsa.pub # 上传命令

由于我之前进行了配置,默认需要进行确定并输入密码进行验证,此处省略。
在这里插入图片描述
(5).配置后,在主节点上测试是否能远程免密连接所有子节点,此处测试其一。若命令行之前的标识发生改变则进入成功,注意操作完需要exit进行退出操作。

ssh slave1 # 远程连接
yes # 确定
exit # 退出子节点

在这里插入图片描述

(6).添加hadoop的环境变量,按自身的条件进行设置,然后source使配置文件生效。

sudo gedit /etc/profile # 修改文件
source /etc/profile

在这里插入图片描述

(7).查看配置文件是否成效。

hadoop version

在这里插入图片描述

(8).配置hadoop集群配置文件。
core-site.xml文件
在这里插入图片描述
hdfs-site.xml文件

在这里插入图片描述

mapred-site.xml文件
需要注意的是此处的IP为主节点的IP地址。
在这里插入图片描述
hadoop-en.sh文件
在这里插入图片描述
masters文件
主节点的IP地址。
在这里插入图片描述
slaves文件
子节点的IP地址。
在这里插入图片描述
(9).向各节点复制配置好的hadoop目录,使其配置一致。注意此处的本地路径和上传路径。每个子节点都需要上传。

scp -r ./hadoop slave1:~
scp -r ./Hadoop slace2:~

(10).格式化一个新的分布式文件系统:

bin/hadoop namenode -format

(11).启动hadoop守护进程:

bin/start-all.sh

(12).使用jps命令查看集群是否正常运行:
主节点应该为4个进程:
在这里插入图片描述
子节点应该为3个进程(每个节点都需要查看):

实验介绍

输入两个文件,一个代表工厂表,包含工厂名列和地址编号列;另一个代表地址表,包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系,输出“工厂名——地址名”表,按工厂名排序输出。数据文件自己设计样例。

实验过程

(1).按要求编写Relevance.java文件,放在主节点的/home/ubuntu/achieve目录下, 测试文件address和factory文件放在achieve目录下的input文件夹下,代码见第六部分。
address文件
在这里插入图片描述

addressID    addressname
1    Beijing
2    Guangzhou
3    Shenzhen
4    Xian
5    Wuhan

factory文件

factoryname    addressed
Beijing Red Star    1
Shenzhen Thunder    3
Guangzhou Honda    2
Huasheng Henghui    4
Beijing Rising    1
Micro pie Technology     5
Xian San yi     4
Guangzhou Development Bank    2
Tencent    3
Back of Beijing    1
douyu TV    5

(2).编译Relevance.java程序。执行命令为:

javac -classpath /home/ubuntu//hadoop/hadoop-0.20.2-core.jar Relevance.java -d /home/ubuntu/achieve

(3).将class文件打包成jar包。

jar cvf Relevance.jar *.class

(4).上传测试文件进入hdfs中。

hadoop fs -put input/ /user/ubuntu/input

(5).运行程序,会显示job运行时的一些信息。

hadoop jar Relevance.jar Relevance

(6).查看运行结果。

hadoop fs -cat output/*

(7).关于hadoop守护进程。

stop-all.sh

实验源码

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Relevance {
	public static int time = 0;
	public static class Map extends Mapper<Object, Text, Text, Text> {
		public void map(Object key, Text value, Context context)
			throws IOException, InterruptedException {
		String line = value.toString();
		String relationtype = new String();
	if(line.contains("factoryname")||line.contains("addressed")) {
			return;
		} 
		StringTokenizer itr = new StringTokenizer(line);
		String mapkey = new String();
		String mapvalue = new String();
		int i = 0;
		while (itr.hasMoreTokens()) {
		String token = itr.nextToken();
		if (token.charAt(0) >= '0' && token.charAt(0) <= '9') {
			mapkey = token;
			if (i > 0) {
				relationtype = "1";
			} else {
				relationtype = "2";
			} 
			continue;
		} 
			mapvalue += token + " ";
			i++;
		} 
		context.write(new Text(mapkey), new Text(relationtype + "+"+ mapvalue));
		}
	}

	public static class Reduce extends Reducer<Text, Text, Text, Text> {
		public void reduce(Text key, Iterable<Text> values, Context context)
		throws IOException, InterruptedException {
			if (time == 0) {
				context.write(new Text("factoryname"), new Text("addressname"));
				time++;
			}
			int factorynum = 0;
			String[] factory = new String[10];
			int addressnum = 0;
			String[] address = new String[10];
			Iterator ite = values.iterator();
			while (ite.hasNext()) {
				String record = ite.next().toString();
				int len = record.length();
				int i = 2;
				if (len == 0) {
					continue;
				} 
				char relationtype = record.charAt(0);
				if (relationtype == '1') {
				factory[factorynum] = record.substring(i);
				factorynum++;
				} 
				if (relationtype == '2') {
				address[addressnum] = record.substring(i);
				addressnum++;
				}
			}
			if (factorynum != 0 && addressnum != 0) {
				for (int m = 0; m < factorynum; m++) {
					for (int n = 0; n < addressnum; n++) {
					context.write(new Text(factory[m]),
						new Text(address[n]));
					}
				}
			}
		}
	} 

	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		conf.set("mapred.job.tracker", "192.168.177.128:9001");
		Job job = new Job(conf, "Multiple Table Join");
		job.setJarByClass(MTjoin.class);
		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		FileInputFormat.addInputPath(job,new Path("/user/ubuntu/input"));
		FileOutputFormat.setOutputPath(job,new Path("/user/ubuntu/output"));
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

后记

还不睡觉,真的等着猝死啊,虽然还有很多事情没做,不管了,先美美的睡一觉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值