Giraph入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Giraph入门相关的知识,希望对你有一定的参考价值。

概要

这是一个Giraph的入门教程,主要用来运行少量输入的Giraph程序,并不能用于生产环境。 

在这个教程中,我们将会在一个物理机器行部署一个单节点,伪分布的Hadoop集群。这个节点既是master,又是slave。那即是,它将会运行NameNode,SecondaryNameNode,JobTracker,DataNode和TaskTracker java进程,我们也将会部署Giraph到这个机器上,部署使用下面的软件和配置。

Ubuntu Server 14.04 LTS

 Hardware: 

 Admin account:

 IP address:  12.1.62.152

 Network mask: 255.255.255.0

Apache Hadoop 0.20.203.0-RC1

Apache Giraph 1.2.0-SNAPSHOT

部署Hadoop

我们将会部署一个单节点,伪分布的Hadooper集群,首先,需要安装Java 1.6或者更高的版本,并且验证安装:

sudo apt-get install openjdk-7-jdk
java -version

你应该能够看到你的Java版本信息,完整的Java被安装在/usr/lib/jvm/java-7-openjdk-amd64,在这个目录中,你可以发现Java的bin和lib目录。

做完这些之后,创建一个专用的hadoop组和一个新的用户hduser,然后添加这个用户hduser到hadoop组。

[email protected]:~$ sudo addgroup hadoop
正在添加组"hadoop" (GID 1004)...
完成。
[email protected]:~$ sudo adduser --ingroup hadoop hduser
正在添加用户"hduser"...
正在添加新用户"hduser" (1003) 到组"hadoop"...
创建主目录"/home/hduser"...
正在从"/etc/skel"复制文件...
输入新的 UNIX 密码: 
重新输入新的 UNIX 密码: 
passwd:已成功更新密码
正在改变 hduser 的用户信息
请输入新值,或直接敲回车键以使用默认值
    全名 []: 
    房间号码 []: 
    工作电话 []: 
    家庭电话 []: 
    其它 []: 
这些信息是否正确? [Y/n] y

现在应该下载和提取hadoop-0.20.203.0rc1从Apache archives(这是在Giraph中默认的hadoop版本)

su - XXX
cd /usr/local
sudo wget http://archive.apache.org/dist/hadoop/core/hadoop-0.20.203.0/hadoop-0.20.203.0rc1.tar.gz
sudo tar xzf hadoop-0.20.203.0rc1.tar.gz
sudo mv hadoop-0.20.203.0 hadoop
sudo chown -R hduser:hadoop hadoop

 

当安装完之后,切换到用户hduser,用下面的内容编辑用户的$HOME/.bashrc

export HADOOP_HOME=/usr/local/hadoop
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

 

这主要用来设置Hadoop/Java相关的环境变量,当设置完之后,用下面的内容编辑$HADOOP_HOME/conf/hadoop-env.sh文件:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true

第二行主要强制Hadoop使用IPv4,尽管IPv6在该机器上配置啦。因为Hadoop需要在计算的时候存储临时文件,所以你需要用下面的命令创建一个临时目录,这个临时目录是为FS和HDFS文件而创建的。

su – XXX
sudo mkdir -p /app/hadoop/tmp
sudo chown hduser:hadoop /app/hadoop/tmp
sudo chmod 750 /app/hadoop/tmp

确保/etc/hosts文件有下面的两行(如果不存在的话,就添加或者修改他们)

127.0.0.1       localhost
xxx.xxx.xxx.xxx   hdnode01

尽管我们可以在这个单节点的集群中使用localhost用于连接,但是使用hostname通常是个更好的选择(例如,你可能会添加一个新的节点,转换你的单节点,伪分布的集群到多节点,分布式的集群)

现在编辑Hadoop配置文件core-site.xml,mapred-site.xml和hdfs-site.xml,这些文件在$HADOOP_HOME/conf目录下。在<configuration></configuration>之间添加下面的内容。

编辑core-site.xml:

<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop/tmp</value>
</property>

<property> 
<name>fs.default.name</name> 
<value>hdfs://hdnode01:54310</value> 
</property>

编辑mapred-site.xml:

<property>
<name>mapred.job.tracker</name> 
<value>hdnode01: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>

默认下,Hadoop允许2个mappers同时运行,但是Giraph相信我们可以同时运行4个mappers。对于这个单节点,伪分布的部署,我们需要添加后两个properties在mapred-site.xml文件,是为了满足这个需要,否则的话,Giraph的一些单元测试将会失败。

编辑hdfs-site.xml文件:

<property>
<name>dfs.replication</name> 
<value>1</value> 
</property>

这里你仅仅设置存储HDFS文件的拷贝为一份,这是因为你仅仅只有一个data nodes,默认值是3个,如果你没有改变这个值,你将会收到运行时异常。

下一步,是为hduser用户设置SSH,以至于每次SSH连接被开启时,你不需要输入密码。

su – hduser
ssh-keygen -t rsa -P ""
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

然后使用SSH连接到hduser用户下的hdnode01(这里必须使用hdnode01,因为我们在Hadoop的配置文件中使用这个节点的hostname),你将会被提示输入密码,当你第一次使用该用户连接该节点时。当被提醒密码时,实际会存储public RSA key到$HOME/.ssh/known_hosts中,以后你使用ssh连接时,将不需要输入密码。

现在编辑$HADOOP_HOME/conf/masters:

hdnode01

类似的,使用下面的内容编辑$HADOOP_HOME/conf/slaves:

hdnode01

这些编辑是设置一个单节点,伪分布的Hadoop集群,包括一个master和一个slave,他们在同一台物理机上。如果你想要部署一个多节点,分布式的Hadoop集群,你应该添加其他的data nodes(例如,hdnode02, hdnode03)在$HADOOP_HOME/conf/slaves文件中,当你在每个节点上完成上面的步骤后。

为了初始化HDFS,格式化它,需要执行下面的命令:

$HADOOP_HOME/bin/hadoop namenode -format

 

然后开启HDFS和map/reduce进程,使用下面的执行顺序:

$HADOOP_HOME/bin/start-dfs.sh
$HADOOP_HOME/bin/start-mapred.sh

确保所有的Java进程都在运行,执行下面的命令:

jps

它将会输出下面的结果:

9079 NameNode
9560 JobTracker
9263 DataNode
9453 SecondaryNameNode
16316 Jps
9745 TaskTracker

为了停止进程,以开启的相反顺序关闭进程($HADOOP_HOME/bin/stop-*.sh脚本)。这是很重要的,以至于你将不会丢失你的数据,现在已经完成了一个单节点,伪分布的Hadoop集群。

 

运行一个map/reduce任务

既然我们已经有一个运行的Hadoop集群,现在我们可以运行map/reduce任务。我们将会使用WordCount的例子,它会读取文本文件,然后计算每个单词出现的次数。输入是一个文本文件,输出也是一个文本文件,输出每一行包含一个单词和这个单词出现的次数,以Tab分隔。这个例子压缩在$HADOOP_HOME/hadoop-examples-0.20.203.0.jar。现在让我们开始吧,下载一个比较大的UTF-8的文件到临时目录中,拷贝它到HDFS。然后确保它被拷贝成功。

cd /tmp/
wget http://www.gutenberg.org/cache/epub/132/pg132.txt
$HADOOP_HOME/bin/hadoop dfs -copyFromLocal /tmp/pg132.txt /user/hduser/input/pg132.txt
$HADOOP_HOME/bin/hadoop dfs -ls /user/hduser/input

完成之后,你可以运行wordcount例子,为了启动一个map/reduce任务,你可以使用$HADOOP_HOME/bin/hadoop jar命令:

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-examples-0.20.203.0.jar wordcount /user/hduser/input/pg132.txt /user/hduser/output/wordcount

你可以监控你的任务的进度,使用Web UI:

NameNode daemon: http://hdnode01:50070

JobTracker daemon: http://hdnode01.50030

TaskTracker daemon: http://hdnode01.50060

只要任务完成,你可以检测输出用下面的命令:

$HADOOP_HOME/bin/hadoop dfs -cat /user/hduser/output/wordcount/p* | less

 部署Giraph

我们将会部署Giraph,为了从repository构建Giraph。你需要首先安装Git和Maven3,通过运行下面的命令:

su - hdadmin
sudo apt-get install git
sudo apt-get install maven
mvn -version

确保你安装Maven3或者更高的版本,Giraph使用Munge插件,这个插件需要Maven3,为了支持hadoop的多个版本,web site插件也需要Maven3,你可以clone Giraph从Github:

cd /usr/local/
sudo git clone https://github.com/apache/giraph.git
sudo chown -R hduser:hadoop giraph
su - hduser

之后修改用户hduser的$HOME/.bashrc文件,用下面的内容:

export GIRAPH_HOME=/usr/local/giraph

保存和关闭文件,然后验证,编译,测试,压缩Giraph为JAR文件,通过运行下面的命令:

source $HOME/.bashrc
cd $GIRAPH_HOME
mvn package -DskipTests

参数-DskipTests将会跳过测试环节,当第一次运行的时候,需要花费一些时间,因为Maven要下载一些文件到你本地的仓库。你可能需要执行很多遍才能成功,这是因为远程的服务器可能会超时,只要packaging成功后,你将会有 一个Giraph Core JAR,它的位置是$GIRAPH_HOME/giraph-core/target/giraph-1.2.0-SNAPSHOT-for-hadoop-0.20.203.0-jar-with-dependencies.jar,Giraph的例子JAR文件,它的位置是$GIRAPH_HOME/giraph-examples/target/giraph-examples-1.1.0-SNAPSHOT-for-hadoop-0.20.203.0-jar-with-dependencies.jar,现在你已经完成部署Giraph。

运行一个Giraph任务

只要我们完成部署Giraph和Hadoop,我们就可以开始运行我们的第一个Giraph任务,我们将会使用SimpleShortestPathsComputation例子,它将会读取一个graph的输入文件,以一种支持的格式,计算从源点到其他节点的最短路径。源点在输入文件中总是第一个节点,我们将会使用JsonLongDoubleFloatDoubleVertexInputFormat输入格式。首先,创建一个例子graph,在/tmp/tiny_graph.txt,用下面的内容:

[0, 0, [[1, 1], [3, 3]]]
[1, 0, [[0, 1], [2, 2], [3, 1]]]
[2, 0, [[1, 2], [4, 4]]]
[3, 0, [0, 3], [1, 1], [4, 4]]]
[4, 0, [[3, 4], [2, 4]]]

 保存和关闭文件,每一行是下面的格式[source_id, source_value, [[dest_id, edge_value], ...]],在这个图像中,有5个节点和12个边。拷贝这个输入文件到HDFS中:

$HADOOP_HOME/bin/hadoop dfs -copyFromLocal /tmp/tiny_graph.txt /user/hduser/input/tiny_graph.txt
$HADOOP_HOME/bin/hadoop dfs -ls /user/hduser/input

我们将会使用IdWithValueTextOutputFormat的输出格式,每一行包含source_id length对于每一个节点(源点默认有0长度),你可以运行这个例子通过下面的命令:

$HADOOP_HOME/bin/hadoop jar $GIRAPH_HOME/giraph-examples/target/giraph-examples-1.2.0-SNAPSHOT-for-hadoop-0.20.203.0-jar-with-dependencies.jar org.apache.giraph.GiraphRunner org.apache.giraph.examples.SimpleShortestPathsComputation -vif org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat -vip /user/hduser/input/tiny_graph.txt -vof org.apache.giraph.io.formats.IdWithValueTextOutputFormat -op /user/hduser/output/shortestpaths -w 1

 

记住,这个任务被计算是使用单个的worker,使用参数-w来标识。为了得到更多的信息关于运行Giraph任务。你可以运行下面的命令:

$HADOOP_HOME/bin/hadoop jar $GIRAPH_HOME/giraph-examples/target/giraph-examples-1.2.0-SNAPSHOT-for-hadoop-0.20.203.0-jar-with-dependencies.jar org.apache.giraph.GiraphRunner -h

你可以监控你的Giraph任务的进度,从JobTracker Web GUI界面。只要任务执行完,你可以通过下面的命令来查看结果:

$HADOOP_HOME/bin/hadoop dfs -cat /user/hduser/output/shortestpaths/p* | less

 

以上是关于Giraph入门的主要内容,如果未能解决你的问题,请参考以下文章

Giraph源代码分析——Edge 分析

Giraph源码分析—— 添加消息统计功能

在 Apache Giraph 中创建日志的使用。

Hello Giraph

Hello Giraph

Gremlin - Giraph - GraphX ?在 TitanDb 上