菜鸟配置hadoop集群模式

mac2026-03-06  4

前言

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

环境配置

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

单机模式操作

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

实验结果 查看实验结果,执行如下命令: 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)