撰文目的:记录 NUAA 2022-2023 学年第一学期选修实验课的过程,也希望对后面学这门课程的同学有所帮助。
主要参考链接:https://blog.csdn.net/catharryy/article/details/9186757
Hadoop实验教程部分由老师给出,这部分内容非常详细,我在自己实践的基础上稍加改动了一些。
一、安装虚拟机软件VirtualBox (Vmware Workstation也可)
二、使用VirtualBox新建虚拟机并安装Ubuntu系统
Ubuntu镜像下载地址 https://ubuntu.com/download/desktop
唯一要提醒大家的是:虚拟机用户名尽量能体现自己的身份(比如名字拼写之类的),这样就可以跳过第三个步骤了。
三、创建一个新账户(教程中红色hadoop为用户名,黑色hadoop为文件夹)
1、使用CTRL+ALT+T打开命令行终端,输入命令创建新用户
sudo useradd –m hadoop –s /bin/bash
说明:-m表示自动创建用户目录(/home/hadoop),hadoop是用户名,-s表示使用/bin/bash作为shell (注意用户名能体现是自己做的)
4、注销当前用户,并以新用户登录(登录新建的hadoop账户)
1、“设备”->“共享文件夹”,记住共享文件夹的共享名
说明:安装好了,桌面上会出现光盘图标VBox_GAs_5.2.18和一个虚拟盘sf_VirtualBoxShare
3、进入目录/media/hadoop/VBox_GAs_5.2.18,执行命令./VBoxLinuxAddtion.run
(2)挂载
mount –t vboxsf VirtualBoxShare ~/share
说明:VirtualBox是共享文件夹的共享名,share目录需要事先在家目录(~,即/home/hadoop) 下创建
2.弹出的对话框中依次点击“选项”、“共享文件夹”、“下一步”
4.进入虚拟机,安装VMware Tools:依次点击“虚拟机”、“重新安装VMware Tools”(1. 具体安装方法自行查找2. 如果该选项是灰色,说明已经安装好,无需再次安装)
5.至此,在/mnt/hgfs/下应该就能看到刚才在虚拟机中设置的windows下的共享文件夹vmshare了
6.如果到上面一步时/mnt/hgfs/下没有共享文件夹,再加一条命令即可:
vmhgfs-fuse .host:/ /mnt/hgfs/
这时把你在windows下的文件放入共享文件夹vmshare中,再回到Ubuntu中,cd 到/mnt/hgfs/vmshare,就可以看到这些共享的文件了。
五、安装一些必要的工具
sudo apt–get update (执行这一步之前可将用户模式切换到根模式——输入sudo -s)
apt–get install openssh–server
1、禁用防火墙
ssh localhost(测试一下 SSH 是否可用,要在用户模式下登录——在此之前输入 su hadoop)
exit
说明:一路回车,在~/.ssh目录会生成一个两个文件,id_rsa和id_rsa.pub
说明:也可cat ./id_rsa.pub >> ./authorized_keys,这样~/.ssh目录又会多一个文件authorized_keys
4、登录测试
exit
2、在真机中将jdk、hadoop的安装包复制到真机的共享文件夹中
jdk、hadoop安装包下载地址(hadoop尽量下载最新的适用版本,jdk下载jdk8的版本)
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
https://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.10.1/
3、安装jdk
tar -zxvf /mnt/hgfs/vmshare/jdk-8u311-linux-x64.tar.gz -C ~/app
mv ~/app/jdk1.8.0_311 ~/app/jdk (注意文件名匹配)
vim ~/.bashrc (不习惯用vim编辑器可改用 gedit ~/.bashrc,下同)(稍微提一下vim,可能经常用到的:i -> 插入模式,此时可以在文件任意位置编辑内容;编辑完成后,按下Esc键,依次输入 :wq 即可完成保存)
export JAVA_HOME=/home/hadoop/app/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
八、安装hadoop
1、安装hadoop
tar -zxvf /mnt/hgfs/vmshare/hadoop-2.10.1.tar.gz -C ~/app //解压
mv ~/app/hadoop-2.10.1 ~/app/hadoop //改名 (注意文件名匹配)
sudo chown -R hadoop ./hadoop //修改hadoop权限
2、配置hadoop
export HADOOP_HOME=/app/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
(2)配置hadoop-env.sh
vim ~/app/hadoop/etc/hadoop/hadoop-env.sh
找到export JAVA_HOME=${JAVA_HOME}这一行,将其修改为:
export JAVA_HOME=/home/hadoop/app/jdk
(3)配置core–site.xml (均位于~/app/hadoop/etc/hadoop/,下同)
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/hadoop/tmp</value>
<!–配置块的副本数 –>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
说明:需将mapred–site.xml.template复制成mapred–site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
九、运行hadoop
说明:首次运行须格式化,以后运行就不需要这一步。格式化后会在core–site.xml中hadoop.tmp.dir所指定的目录中生成name文件夹。
./start-all.sh
jps
14262 NameNode
15976 NodeManager
14385 DataNode
15884 ResourceManager
14601 SecondaryNameNode
16120 Jps
如果出现以上进程(前面的数字不一定一致),说明hadoop环境搭建成功,分布式系统启动完成。
http://localhost:50070 //查看hdfs
http://localhost:8088 //查看mapreduce作业情况
mkdir ~/tmp
echo ‘hello world hello hadoop’ > ~/tmp/word1.txt
echo ‘hive run on hadoop’ > ~/tmp/word2.txt
(1)在hdfs上新建输入数据的目录(在~/app/hadoop/bin目录下)
./hdfs dfs -mkdir /input
(2)上传文件
./hdfs dfs -put ~/tmp/word*.txt /input
./hadoop jar ~/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples–2.7.3.jar wordcount /input output
注:这里的红字部分可能需要修改,这时你需要去对应的路径下查看文件名,按实际情况进行修改,比如我在做这一步骤的时候,就将2.7.3修改成了2.10.1
4、查看结果
./hdfs dfs –cat /user/hadoop/output/part-r-00000
由于伪分布式环境下,节点性能有限,尤其是跑在虚拟机环境下,试了一下跑500*500的矩阵,Map到66%左右就发现虚拟机硬盘爆了,所以,为了测试算法的正确性,下面使用50*50的矩阵来运行。只要算法是恰当的,数据规模可以随硬件支持程度而改变。
参考博客 https://blog.csdn.net/catharryy/article/details/9186757
若对具体实现思路有兴趣,可以看看上面这篇文章,这里只说要实际操作的部分。
1、在~/app/hadoop目录下新建一个名为 local_matrix 的文件夹
2、在 local_matrix 文件夹下新建一个名为 MartrixMultiplication 的java文件,
参考 https://github.com/intergret/snippet/blob/master/MartrixMultiplication.java
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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 MartrixMultiplication{
public static class MartrixMapper extends Mapper<Object, Text, Text, Text>{
private Text map_key = new Text();
private Text map_value = new Text();
int rNumber = 50;
int cNumber = 50;
String fileTarget;
String i, j, k, ij, jk;
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String eachterm[] = value.toString().split("#");
fileTarget = eachterm[0];
if(fileTarget.equals("M")){
i = eachterm[1];
j = eachterm[2];
ij = eachterm[3];
for(int c = 1; c<=cNumber; c++){
map_key.set(i + "#" + String.valueOf(c));
map_value.set("M" + "#" + j + "#" + ij);
context.write(map_key, map_value);
}
}else if(fileTarget.equals("N")){
j = eachterm[1];
k = eachterm[2];
jk = eachterm[3];
for(int r = 1; r<=rNumber; r++){
map_key.set(String.valueOf(r) + "#" +k);
map_value.set("N" + "#" + j + "#" + jk);
context.write(map_key, map_value);
}
}
}
}
public static class MartrixReducer extends Reducer<Text,Text,Text,Text> {
private Text reduce_value = new Text();
int jNumber = 50;
int M_ij[] = new int[jNumber+1];
int N_jk[] = new int[jNumber+1];
int j, ij, jk;
String fileTarget;
int jsum = 0;
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
jsum = 0;
for (Text val : values) {
String eachterm[] = val.toString().split("#");
fileTarget = eachterm[0];
j = Integer.parseInt(eachterm[1]);
if(fileTarget.equals("M")){
ij = Integer.parseInt(eachterm[2]);
M_ij[j] = ij;
}else if(fileTarget.equals("N")){
jk = Integer.parseInt(eachterm[2]);
N_jk[j] = jk;
}
}
for(int d = 1; d<=jNumber; d++){
jsum += M_ij[d] * N_jk[d];
}
reduce_value.set(String.valueOf(jsum));
context.write(key, reduce_value);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: MartrixMultiplication <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "martrixmultiplication");
job.setJarByClass(MartrixMultiplication.class);
job.setMapperClass(MartrixMapper.class);
job.setReducerClass(MartrixReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
javac MartrixMultiplication.java -cp $(~/app/hadoop/bin/hadoop classpath) ,
此时目录下多出了一个MartrixMultiplication.class文件
4、接着在终端依次输入:
cd ..
jar –cvf local_matrix/MartrixMultiplication.jar -C local_matrix/ .
此时 local_matrix文件夹下又多出两个class文件和一个jar文件
5、回到根目录,创建一个名为 input2 的文件夹,在里面新建两个文件 M.data 和 N.data
M#a#b#c 表示M矩阵第a行第b列的值是c;
N#a#b#c 表示M矩阵第a行第b列的值是c;
注:1 <= a,b <= 50,c = 1
6、在hdfs上新建输入数据的目录(在~/app/hadoop/bin目录下)
./hdfs dfs -mkdir /input2
7、上传文件
./hdfs dfs -put ~/input2/*.data /input2
8、运行
./hadoop jar ~/app/hadoop/local_matrix/MartrixMultiplication.jar MartrixMultiplication /input2 output2
9、查看结果
./hdfs dfs –cat /user/hadoop/output2/part-r-00000
正确的结果图(部分)
原文地址:https://blog.csdn.net/m0_61530293/article/details/128399748
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_8981.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!