赞
踩
这个本来是本人的云计算应用的课程作业,好吧!我承认我倒腾了半天,不过还是捣腾出来了,特此记之,方便后人。
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
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); } }
还不睡觉,真的等着猝死啊,虽然还有很多事情没做,不管了,先美美的睡一觉!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。