因为实验室项目需求需要进行上亿规模的图文件计算,还好学校HPC(高性能计算机中心)有100多台机器可以用,不用花高价买阿里云服务了,不过。。因为HPC的机器都是用来跑mpi程序的,很少进行分布式计算,更坑爹的是里面装的Hadoop2.7.4版本和Giraph不兼容,所以只有全部纯手动进行安装配置了... 在安装的过程中遇到了非常非常多的坑,下面进行学习总结,以防重蹈覆辙。
一、项目需求
首先简单介绍一下需求,就是目前有几个非常大的图文件(注:数据结构的graph,即:G(V,E)这种,而不是image!)需要进行一些图计算操作(比如求PageRank、单源最短路径、三角形...),传统的做法是用Hadoop/Spark等分布式框架先进行分布式数据读取,再进行分布式计算操作,最后合并结果,但由于图这种数据结构存在着顶点与边相连的关联性,在分布式读取数据时贸然进行切割操作分区间会造成极大的通信开销,但是要是最大程度保持不破坏图结构进行切割,势必会造成分区间的负载不均衡,从而造成水桶效应,因此,大规模图划分问题是一个同时要达到最小化通信开销和保持负载均衡的多目标优化问题,而目前要做的事就是为了验证我们当前设计的图划分算法的性能比别人(Spinner算法)的好,因此需要进行对比实验,而Spinner用的是Giraph图处理框架,Giraph是Pregel的开源实现,内部依赖于Hadoop和Zookeeper,因此,要顺利运行Giraph,就得先配置好Hadoop和Zookeeper,在介绍如何配置之前,先交代一下软硬件环境。
二、软硬件环境
西安电子科大集群系统由2 个管理节点xdhpc01\xdhpc02 、2 个登陆节点 xdhpc03\xdhpc04,6 个lustre 节点,136 个刀片计算节点,7 个gpu 节点(14 个gpu 卡),3个mic节点(6个mic卡),153TB存储组成,节点间通过InfiniBand网络互连。集群系统理论峰值浮点计算性能达到85.52TFlops。单节点配置为:刀片计算节点均采用2个 Intel Xeon E5-2692v2,12核处理器(2.60GHz), 共24计算核心1.8Tsas硬盘,配置64GB内存。每个节点都是一个多核SMP服务器,计算节点用于运行串行和并行计算任务,支持MPI、OpenMP及MPI/OpenMP混合并行编程模式。作业管理系统以CPU核作为并行作业的资源分配单位,实现并行作业的调度运行。每个计算节点为24核的SMP服务器,可以最大支持146* 24 = 3504核并行作业的计算。IO存储系统由AS1000g6光纤存储+扩展柜与6个IO节点构成lustre文件系统,提供集群系统的全局并行文件系统,可提供153TB的可用存储容量,所有用户目录直接建立在该文件系统下边。
西安电子科大集群系统所有节点均采用RedHat Enterprise Linux 6.4x86_64版本,遵循POSIX,LSB等标准,提供了64位程序开发与运行环境。
软件共享目录/opt/soft,通过NFS模式挂载软件管理节点xdhpc01上所有软件资源。 作业提交脚本参考目录/opt/pbs_script。用户目录/ home/用户名:所有节点通过lustre客户端的模式共享用户目录存储空间。
三、相关软件安装与配置
0.前期准备
(1) 首先执行java -version命令确认是否已安装JDK,若未安装,则先需要安装并配好环境变量JAVA_HOME1.Hadoop
home路径下解压Hadoop后,开始进行配置:
(1) 配置ssh免密登录,这样hadoop才能让每个节点都能启动
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
(2) 配置环境变量
/etc/profile文件配置hadoop环境变量
#JAVA
JAVA_HOME=你的jre路径
CLASS_PATH=$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME CLASS_PATH
#HADOOP
export HADOOP_INSTALL=/home/用户名/hadoop-2.5.1
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
(3) 在home/用户名/hadoop-2.5.1/etc/hadoop/路径下进行文件配置:
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://masterIP地址:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
<property>
<name>giraph.zkList</name> <!--配置giraph的zookeeper关联,若后面不装giraph,可以不加此配置-->
<value>masterIP地址:2181</value>
</property>
</configuration>
maperd-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>masterIP地址:9001</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>masterIP地址:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>masterIP地址:19888</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://masterIP地址:19888/jobhistory/logs</value>
</property>
<property>
<name>mapreduce.job.counters.limit</name>
<value>200000</value>
</property>
<property>
<name>mapred.map.child.java.opts</name>
<value>-Xmx8192m</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>8192</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master Host名称</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>masterIP地址:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>masterIP地址:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>masterIP地址:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>masterIP地址:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>masterIP地址:8088</value>
</property>
<property>
<name>yarn.nm.liveness-monitor.expiry-interval-ms</name>
<value>3000</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>false</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://masterIP地址:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>10240</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>24</value>
</pr