Giraph 1.0集群环境配置

环境说明
以下配置过程在实验室集群,深圳集群,腾讯云集群上均测试成功,系统包括CentOS,Ubuntu
Hadoop-1.0.2
Giraph-1.0.0
Jdk1.7

下面详细叙述一下在实验室集群上面配置的细节

系统环境
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial

安装的是Ubuntu Server的版本,系统是64位的

相关参数


三台小服务器的IP地址
这是我本地的hosts, master也就是hadoop集群的master的机器

192.168.1.100 lab-master
192.168.1.103 lab-slave1
192.168.1.104 lab-slave2

三台机器对应的hostname 分别为
user-wjl
user-wjl1
user-wjl2

三台机器上分别都建立了对应的用户

也就是说如果想要测试Giraph的代码,可以将自己的电脑连如局域网(可能需要你自己去给服务器开机,平时我应该会关掉),然后可以用ssh的方式在你的电脑上进行操作,注意需要连如局域网

输入passwd 即可


配置流程

注意
以下叙述可能过于繁琐,默认阅读者之前一点也不了解相关信息,所以可以有选择的看,但是尽可能对照一下每一处细节,一点小的不同可能导致很多问题( 别问我是怎么知道的 TAT)

1. JDK的安装
注意, 千万不要OpenJDK

在终端输入

java -version

会显示你的JDK相应的版本,以下版本是经过测试可以使用的

java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

注意JDK 1.7是可以跑的,JDK 1.8忘记是不是可以的,JDK1.6也是可以跑的, 但最好和上述版本一致,并且一定要是SE的

特别地,该JDK可以在上网提到的网盘的工具包中得到,名字为 jdk-7u79-linux-x86-1126.tar.gz


安装好JDK后,还要配置环境变量,可以自行Google,下文也会提到,到时候和Hadoop的环境变量一起说明
简单的提一句
首先对于每个用户,配置在该用户下的JDK的环境变量,有的大服务器上可能会有多个用户,支持每个用户用不同版本的JDK,这样可以只更改本用户的JDK版本,而协调JDK版本可能会比较复杂,这里不再赘述,在实验室小集群上面,JDK版本是一致的,那么需要改两个地方的环境变量

本用户下要改
vim ~/.bashrc
export JAVA_HOME=/usr/local/jdk1.7

然后source ~/.bashrc 让其立即生效

更改所有用户的JDK
需要在 /etc/profile中添加环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.7


注意这里的JAVA_HOME后面的路径是你自己存放JDK的路径


2. 设置专用账户
hadoop会利用用户名来配置目录结构,为了配置方便最好保证每台机子上都有一个给hadoop使用的账户,且名字相同(如果每台机子账户不同,需要做很多多余的配置)。

3. 添加用户与用户组
sudo addgroup hd #添加用户组的操作
sudo adduser --ingroup hd hadoop #添加用户到某用户组的操作

4. 添加 sudo 权限
通过
$ sudo visudo
打开etc/sudoers为新添加的用户添加sudo权限。

找到
# User privilege specificationroot ALL=(ALL:ALL) ALL

在下面加上
user-wjl ALL=(ALL:ALL) ALL
就能让user-wjl这个用户拥有sudo的权限。其他用户名类推。
注意这个文件只能用visudo打开,且绝对不能修改其权限。

5. 切换用户
用户权限问题在Hadoop权限配置中算是一个比较麻烦的问题,所以最好都在一个用户下面进行,而不是像官方教程一样
su user-wjl
表示切换到user-wjl该用户

6. 配置 host 与打通连接

修改 /etc/hostname
首先注意这一步不是必须的
只是如果想看自己的hostname可以用
$ hostname
可以通过命令
$ hostname user-wjl1
来更改自己的hostname
默认的hostname是机器的名字 ubuntu

修改 /etc/hosts
注意!!!!这里很重要,之前调试了很久的bug就是这里的问题
$ sudo vim /etc/hosts
第一行如果是
127.0.0.1 localhost
最好保留。如果这里的127.0.0.1后跟着的是其他东西,最好改成localhost

ubuntu下建议将默认出现在第二行的
127.0.1.1 xxxx`
改成
实际本机ip xxxx
其中xxxx指本机的hostname,可根据上一步骤改成的hostname对应修改
更好的做法是注释掉127.0.1.1 localhost

详情可以参见下图,是成功配置的某台机器上面的hosts

注意,这里的127.0.1.1的问题很严重,详情可以参考hadoop wiki的官网,之前遇到了一个bug调试了很久
上面有对各种ConnectionRefused的各种调试方法,如果后续hadoop任务或者Giraph任务没有成功,可以参考该网站
Check that there isn't an entry for your hostname mapped to 127.0.0.1 or 127.0.1.1 in  /etc/hosts  (Ubuntu is notorious for this).

7. 检查防火墙
如果开启了防火墙,建议关闭或打开需要联通的端口。
ubuntu一般自带的是ufw防火墙,如何查看与关闭防火墙、配置特定端口请看  Ubuntu中文wiki上的文档

8. 关闭 ipv6

9. 检查联通状况
为每台机器设置好hosts文件和hostname后,在每台机器上ping其他机器即可。
如果机器比较多,可以写个脚本帮忙。同样地,hosts文件可以在一台机器上配置好后复制到其他机器上,对涉及到127.0.1.1和自己的ip的部分稍作修改即可。


10. 配置无密码 ssh
这里的叙述可能过于繁琐,可以自行google查看配置集群免密登录即可,理论上只需要master可以免密登录slave节点即可,slave节点不用互相免密登录,但是为了方便,我在这里配置的是集群的所有机器彼此之间免密登录,而且是默认机器一开始什么相应环境都没有
  1. 检查 openssh-server
ubuntu下
$ sudo apt-get install openssh-server

即可。有则提示已经是最新版,没有或版本太老则安装或更新。
2. 修改配置与生效
配置无密码SSH过程中可能会出现Host key verification failed错误。最简单的解决办法之一就是在每台机的/etc/ssh/ssh_config中设置
StrictHostKeyChecking no

如果这项已经设置过,修改之。如果没有设置过(默认应该是设置为ask且注释掉的),可以在下面添加,或取消注释并修改为no。
  • 注意这里一般是对Host *设置的StrictHostKeyChecking no,会对所有SSH key的检查都放宽要求。如果不想这么做,可以google其他解决方案。
在/etc/ssh/sshd_config中设置
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys
同样可以修改、取消注释或在下面添加。
然后
service ssh restart
令配置生效。

3.生成密钥

如果之前机子上生成过密钥可以跳过这一步,否则需要生成密钥。 使用
$ ssh-keygen -t rsa -P ''
一路回车,在~/.ssh目录下生成一对没有passphrase的密钥。

这里不设置passphrase是为了后面认证登陆的时候不用每台机子都输入,会方便一些。
接着
cat id_rsa.pub >> authorized_keys
对生成的公钥进行授权

检查权限
$ chmod 600 ~/.ssh/authorized_keys$ chmod 700 ~/.ssh

保证关键的文件和文件夹权限正确(太高或太低的权限会导致无法无密码ssh)
分发公钥
为了方便我们可以让所有机器都能互相无密码ssh。在每台salve用
$ ssh-copy-id -i id_rsa.pub master
将公钥汇总到master的authorized_key中,再让master将公钥分发到每台机器上即可。比如使用
$ scp ~/.ssh/authorized_keys user-wjl@user-wjl1:~/.ssh/authorized_keys
即可将master的authorized_keys覆盖掉slave的authorized_keys(注意这是覆盖,如果只是想追加,可以用cat+管道,具体google即可)

11. 安装 Hadoop
版本
这里有一些小问题,传承下来的Giraph的关于hadoop包相应版本是hadoop1.0.2,但是当时师姐给我的hadoop的包是hadoop1.0.0,后来我自己也试过hadoop1.0.2,发现都可以跑,
按照我自己的理解,可能的情况是hadoop1.0.2关于hadoop1.0.0的相关改动的部分在Giraph1.0的部分中没有用到
相关的hadoop的包也在上文的网盘中有,名字是 hadoop.tar.gz

获取及解压 (每台)
去到官网下载安装包,或者从我给的包中下载,安装路径随意,按照Linux的惯例可以自己看着装到/opt或者/usr/local,或者直接安装在用户文件夹。
这里将安装包解压到/home/user-wjl/workspace/hadoop,然后在/workspace目录下
chown -R user-wjl:hadoop hadoop
确保能够随意操作这个文件夹。

配置环境变量 (每台)
再配置环境变量,指明Hadoop所在路径,将路径下的bin文件夹加入PATH以使用Hadoop提供的各种脚本 编辑用户的.bashrc文件
$ vim ~/.bashrc
添加
export JAVA_HOME=/usr/local/jdk1.7
export HADOOP_HOME=/home/user-wjl/workspace/hadoop
注:$HADOOP_HOME是旧版Hadoop用的环境变量名,所以如果你用这个名字,在运行Hadoop的时候会得到
$HADOOP_HOME is deprecated
的警告。但是这里设成$HADOOP_HOME也不会有什么大碍。如果你觉得这个警告很烦不想看到,也可以用$HADOOP_PREFIX这个新版的名字。

接下来还需要配置hadoop-env.sh中的JAVA_HOME为对应jdk安装目录。
$ vi $HADOOP_HOME/conf/hadoop-env.sh
找到
export JAVA_HOME=....
这一行,将等号后的东西改成你JAVA的实际安装目录。

添加下行
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
代表HADOOP集群希望用到的是IPV4

配置 masters 及 slaves (master上)
配置conf下的masters及slaves文件为对应分配好的hostname。
$ vim /conf/masters
lab-master
$ vim /conf/slaves
lab-slave1
lab-slave2


配置 *-site.xml (每台)
配置core-site.xml。有一些配置是最好要改的,参见 [YDN] Hadoop 配置注意事项 的Important Directories一节。这里修改两个比较重要的配置, 默认dfs.name.dir、dfs.data.dir和mapred.system.dir均放在hadoop.tmp.dir下,这些文件夹存有NameNode和DataNode的数据和各种系统资料,而hadoop.tmp.dir却默认放在/tmp/hadoop-${user.name},这意味着重启之后这些东西很可能全都没了。在正式的集群中,这些子文件夹最好放在不依赖于hadoop.tmp.dir的地方。这里为了方便,我们直接先修改hadoop.tmp.dir来改变其他子文件夹,将它放在hadoop安装目录的tmp文件夹,并且显式指明默认的Namenode位置fs.default.name为master的9000端口。

core-site.xml配置如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/user-wjl/workspace/hadoop/tmp</value>
</property>

<property>
<name>fs.default.name</name>
<value>hdfs://lab-master:54310</value>
</property>
</configuration>

hdfs-site.xml配置如下
参数意义参见 http://hadoop.apache.org/docs/r1.0.4/core-default.html ,往右拖可以看到description(这令人无力的表格列宽……)
配置hdfs-site.xml,这里修改dfs.replication即备份多少副本,1的话就是不备份。注意这个值不能超过Datanode的数目。
复制代码
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property><configuration>

mapred-site.xm配置如下
配置mapred-site.xml,这里指明所有的node在找jobtracker时都要去找master的9001端口。
复制代码
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>lab-master:54311</value>
</property>

<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>4</value>
</property>

<property>
<name>mapred.map.tasks</name>
<value>4</value>
</property>
</configuration>
~
复制代码
在实际运行的时候也建议将mapred.tasktracker.reduce.tasks.maximum的值增大以增加reducer slots的数目,提高效率。一般指定mapred-site.xml为所在机子的CPU核数-1比较合理。
这里的参数设置和正常的hadoop的设置不太一样,对于一个GIRAPH任务来说
默认下,Hadoop允许2个mappers同时运行,但是Giraph相信我们可以同时运行4个mappers,我们需要添加后两个properties在mapred-site.xml文件,是为了满足这个需要,否则的话,Giraph的一些单元测试将会失败。 在实际运行的时候也建议将mapred.tasktracker.reduce.tasks.maximum的值增大以增加reducer slots的数目,提高效率。一般指定mapred-site.xml为所在机子的CPU核数-1比较合理。

添加路径
在hadoop目录下新建tmp文件夹(这里是为了配合上一步中core-site.xml中指定的hadoop.tmp.dir。如果你没有用上一步一样的路径也可以,只要确保这个文件夹存在就行)。

12. 运行 Hadoop
格式化 HDFS
先确保tmp文件夹下都是空的(否则spaceID不一致又不去手动改的话会各种报错),然后`
$ hadoop namenode -format

启动 Hadoop
启动时分开启动,start-all是给单节点用的,或者star-all也可以用
$ start-dfs.sh$ start-mapred.sh
检查 jps
这时候可以检查守护进程是否启动。master上运行

启动成功的话可以在master节点上面看到下图
在slave节点可以看到
如果无法执行jps,可以检查一下java安装目录下的bin文件夹是否在$PATH环境变量中。如果没有,需要修改.bashrc或/etc/profile配置好环境变量。

检查 HDFS
$ hadoop dfsadmin -report
会看到整个hdfs的状态,可以检查一下datanode是否都检测到了。
如下图


检查 Web UI
可以在浏览器上访问
http://lab-master:50070/ 检查namenode,也可以查看HDFS

http://lab-master:50030/ 可以检查job的运行状态

http://lab-master:50060/ 检查task的运行状态

13. 测试 Hadoop的例子 wordcount
运用命令行跑hadoop自带的wordcount的例子
命令如下

user-wjl@user-wjl:~/workspace/hadoop$ $HADOOP_HOME/bin/hadoop jar hadoop-examples-1.0.0.jar wordcount /usr/input/tiny_graph /usr/output/word_count_out
Warning: $HADOOP_HOME is deprecated.

运行正常,显示如下结果
可以通过网页或者命令行查看输出结果
想用web ui查看HDFS上的文件可以通过
50070这个网址进去后 Browse the filesystem

14. 测试 Giraph的例子
首先是用命令行测试最简单的Giraph自带的最短路的例子
命令如下
$HADOOP_HOME/bin/hadoop jar giraph-examples-1.0.0-for-hadoop-1.0.2-jar-with-dependencies.jar org.apache.giraph.GiraphRunner org.apache.giraph.examples.SimpleShortestPathsVertex -vif org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat -vip /usr/input/tiny_graph_json -of org.apache.giraph.io.formats.IdWithValueTextOutputFormat -op /usr/output/giraph-example-out-1 -w 2

这里具体参数的定义可以稍微说明一下,
jar giraph-examples-1.0.0-for-hadoop-1.0.2-jar-with-dependencies.jar 表示尝试跑这个jar包里的某一个算法
org.apache.giraph.GiraphRunner 表示是用GiraphRunner跑的
org.apache.giraph.examples.SimpleShortestPathsVertex 表示是用这个Vertex跑的
-vif org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat 表示 VertexInputFormat的格式是什么样子的
-vip /usr/input/tiny_graph_json 表示VertexInputPath即, 输入路径
-of org.apache.giraph.io.formats.IdWithValueTextOutputFormat 表示输出格式 即 OutputFormat
op /usr/output/giraph-example-out-1 表示OutputPath 即 输出路径
-w 2 表示Worker 即设置Worker的个数


15. 导入Eclipse,测试自己所改写的代码
待续
可以参考项目测试报告等资料

16. 多图连接算法实现,存储扩展功能实现部分
待续
详情可以参考项目测试报告文档

17. 生成数据部分
可以使用数据生成工具生成最简单的图,再自己做处理,代码部分待整理,数据生成工具为R-MAT, 通过参数控制生成Random或者Powerlaw分布的图
我自己部分的代码支持的功能有
  • 处理数据格式,使得上述工具生成的数据集调整为Giraph支持的格式
  • 添加属性等等
代码待整理上传
18. Giraph源码修改部分
  • 针对Vertex的编程(属于应用必须)
  • 改写数据输入输出格式(属于应用必须)
  • 改写底层数据存储格式(改写底层都比较复杂)
  • 改写底层同步异步等形式(比较复杂,详情可以参考师姐留下来的文档)
  • 打包Giraph的Job上传到集群中运行(操作固定但是有待优化,可以选择性了解,该部分跟项目导入Eclipse的部分相关,在最初关于深圳报告的协商中,对方提出希望所有的测试都通过命令行来操作,支持这样的操作形式存在一定难度)
19. Giraph, Hadoop相关参数问题
  • 无论是Hadoop还是Giraph,都有一些参数是至关重要的,这些参数可以在程序中动态修改,也可以在配置文件中指定,对程序性能,甚至程序能否执行都至关重要,需要尽量多的了解.
  • 甚至关于JVM的相关参数在这里也只为重要,举个例子mapred.child.java.opts,详情可以参见测试报告关于存储优化部分
20. 腾讯云集群上面关于Hadoop集群配置,以及Giraph任务测试的问题
  • 腾讯云上面的环境配置由于权限受限比较特殊,详细说起来也需要大量的篇幅,这里简单的总结一下,解决大部分后,比较严重的就是公网IP和内网IP的问题
  • 经过多种尝试,公网IP和内网IP的解决方案是对于每一台机器上的Hosts,它自己对应的IP用公网的IP,其它的机器的IP用内网IP,集群即可配置成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值