Hadoop环境搭建与⼊门实例
1⽬的及要求
基于Hadoop平台,实现⼴度优先搜索(BFS)的Mapreduce算法到图中两个点的最短路径。hadoop分布式集搭建
给定⼀个图<V,E>(采⽤邻接列表输⼊⽂件格式:源节点ID,相邻节点ID,源节点到相邻节点的距离),基于MapReduce的⽅式,采⽤⼴度优先搜索(BFS)到两个顶点的最短距离。
2实验环境
本实验基于虚拟机环境,所采⽤的软件及其版本如下:
虚拟机软件:Oracle VirtualBox 5.2.6
虚拟机操作系统:Ubuntu 16.04.1 LTS - 64 bit
Java环境:JDK-1.8
Hadoop平台:Hadoop 2.7.6
3实验内容与步骤
3.1实验环境搭建
3.1.1搭建Java开发环境
1)键⼊如下命令将jdk软件包解压⾄指定⽬录:
tar -zxvf -C your_java_home
2)键⼊如下命令编辑profile⽂件:
sudo vim /etc/profile
设置jdk环境变量,在profile⽂件的末尾添加如下内容:
export JAVA_HOME=your_java_home
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
需要注意的是,设置CLASSPATH环境变量时,等号后⾯有个点,代表当前⽬录。
3)键⼊如下命令,让环境变量⽴即⽣效:
source /etc/profile
4)检查jdk是否安装好,键⼊如下命令:
java -version
结果如下图所⽰:
3.1.2搭建Hadoop环境
Hadoop有多种部署模式,包括本地模式,伪分布式模式和完全分布式模式。
其中,本地模式主要⽤于本地开发调试;伪分布式模式主要⽤于学习⽤途,这种模式是在⼀台机器的不同进程上运⾏Hadoop的各个模块,伪分布式的意思是虽然各个模块是在各个进程上分开运⾏的,但是只是运⾏在⼀个操作系统上的,并不是真正的分布式。完全分布式模式是⽣产环境采⽤的模式,Hadoop运⾏在服务器集上。
这⾥搭建的是伪分布式模式,过程如下:
1)键⼊如下命令将hadoop软件包解压⾄指定⽬录:
tar -zxvf hadoop-2.7. -C your_hadoop_home
2)键⼊如下命令,给hadoop添加Java环境变量:
vim your_hadoop_home/etc/hadoop/hadoop-env.sh
在hadoop-env.sh⽂件中设置JAVA_HOME的位置添加如下内容:
export JAVA_HOME=your_java_home
3)修改hadoop配置⽂件
⾸先进⼊hadoop配置⽂件⽬录
cd your_hadoop_home/etc/hadoop
编辑l配置⽂件,在configuration标签之间添加如下内容:
其中,p.dir⽤于设置hadoop存储临时⽂件的⽬录。
编辑l配置⽂件,添加如下内容:
其中,dfs.name.dir与dfs.data.dir分别⽤于设置hdfs的namenode和datanode存储数据。
4)格式化hdfs,命令如下:
your_hadoop_home/bin/hdfs namenode -format
5)键⼊如下命令,启动hdfs:
your_hadoop_home/sbin/start-dfs.sh
启动完毕后,使⽤jps命令可以查看当前运⾏的Java进程,如下图所⽰:
hdfs启动后,在浏览器中输⼊如下地址,可以进⼊hadoop的管理界⾯:
如下图所⽰:
在⽹页的Utilities-Browse the file system⼦页⾯,可以查看当前存储在hdfs⾥的内容。
3.2实验步骤
1)准备可执⾏jar⽂件
根据实验要求,使⽤Java语⾔编写程序,程序分为两个模块,预处理模和MapReduce迭代模块。其中,预处理模块包括Preprocess.java ⼀个源⽂件,迭代模块包括Mainjob.java和Node.java两个源⽂件。由于程序中使⽤了Hadoop的类库,在源⽂件编译时需要在classpath 中加⼊Hadoop的类库所在路径,使⽤如下命令进⾏编译:
javac Preprocess.java Node.java Mainjob.java -cp `hadoop classpath`
需要注意,hadoop classpath两边的是反单引号,通过执⾏hadoop classpath这⼀命令,可以返回Hadoop的类库路径。
编译完成后,使⽤jar命令将两个模块编译⽣成的类分别打包成两个jar⽂件,并命名为preprocess.jar和mainjob.jar。
2)上传输⼊⽂件到HDFS
在hdfs启动后,⾸先在hdfs中创建⽬录:
your_hadoop_path/bin/hdfs dfs -mkdir -p /BFS/10000EWG/input
然后使⽤如下命令将欲处理的⽂件上传到hdfs:
your_hadoop_path/bin/hdfs dfs - /BFS/10000EWG/input
3)执⾏程序
在准备好可执⾏jar⽂件和待处理的输⼊⽂件后,⾸先提交预处理程序⾄Hadoop平台运⾏:
your_hadoop_path/bin/hadoop jar preprocess.jar
然后提交执⾏MapReduce循环迭代程序:
your_hadoop_path/bin/hadoop jar mainjob.jar
4)程序运⾏输出
预处理程序运⾏较快,主处理模块由于包含⼤量迭代步骤运⾏较慢,通过程序输出可知,共迭代了69次(以为输⼊数据),如下图所⽰:
在HDFS中保存了迭代过程中⽣成的中间⽂件,如下图所⽰:
4实验结果与数据处理
4.1 MapReduce介绍
MapReduce是由Google提出的⼀种分布式计算模型,⽤于解决海量数据的计算问题。MapReduce计算模型的原理是:利⽤⼀个输⼊key/value对集合来产⽣⼀个输出的key/value对集合。MapReduce库的⽤户⽤两个函数表达这个计算:Map()和Reduce()。⽤户⾃定义的Map函数接受⼀个输⼊的key/value对值,然后产⽣⼀个中间key/value对值的集合。MapReduce库把所有具有相同中间key值的中间value值集合在⼀起后传递给Reduce函数。⽤户⾃定义的Reduce函数接受⼀个中间key的值和相关的⼀个value值的集合。Reduce函数合并这些具有相同key的value值,从⽽形成⼀个较⼩的key/value对集合。
4.2 Dijkstra算法
Dijkstra算法使⽤了⼴度优先搜索解决赋权有向图或者⽆向图的单源最短路径问题。下⾯来回顾⼀下该算法的步骤:
1)把所有结点的标识都设为UNVISITED,距离设为INFINIT。
2)把出发点s的距离设置为0,状态设置为VISITED。
3)从图中所有UNVISITED的点中选择距离最⼩的结点v。
4)设置v的状态为VISITED。
5)⽤v来更新其相邻结点。若某相邻结点u的当前距离D[u] > D[v] + weight(v, u),则把u的距离D[u]更新为D[v] + weight(v, u)。
6)重复3到5步的操作,直到所有结点状态都被设置为VISITED。
4.3实验数据处理
在实验给出的输⼊数据中,每⼀⾏表⽰的是任意两个顶点间的距离,为了便于使⽤最短路径算法,要先
对数据进⾏预处理,使每⼀⾏表⽰顶点到其所有相邻定点距离的形式。
基于map-reduce的并⾏最短路径算法和Dijkstra算法类似,也是基于迭代的思想。它每次迭代执⾏⼀个map-reduce job,并且只遍历⼀个顶点。在Map中,它先输出这个顶点的完整邻接顶点数据,然后遍历该顶点的邻接顶点,并输出该顶点ID及距离。在Reduce中,对当前顶点,遍历map的输出权重,若⽐当前的路径值⼩,则更新。最后输出当前该顶点到其它定点的距离,作为下⼀次迭代的输⼊。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论