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入门的主要内容,如果未能解决你的问题,请参考以下文章