概要

这是一个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 1.2.1

Apache Giraph 1.2.0-SNAPSHOT

部署Hadoop

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

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

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

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

XXX@XXX-ThinkPad-Edge-E431:~$ sudo addgroup hadoop
正在添加组"hadoop" (GID )...
完成。
XXX@XXX-ThinkPad-Edge-E431:~$ sudo adduser --ingroup hadoop hduser
正在添加用户"hduser"...
正在添加新用户"hduser" () 到组"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-1.2.1/hadoop-1.2.1.tar.gz
sudo tar xzf hadoop-1.2.1.tar.gz
sudo mv hadoop-1.2.1 hadoop
sudo chown -R hduser:hadoop hadoop

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

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

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

export JAVA_HOME=/usr/lib/jvm/java--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 /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:</value>
</property> <property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value></value>
</property> <property>
<name>mapred.map.tasks</name>
<value></value>
</property>

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

编辑hdfs-site.xml文件:

<property>
<name>dfs.replication</name>
<value></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

它将会输出下面的结果:

 NameNode
JobTracker
DataNode
SecondaryNameNode
Jps
TaskTracker

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

运行一个map/reduce任务

既然我们已经有一个运行的Hadoop集群,现在我们可以运行map/reduce任务。我们将会使用WordCount的例子,它会读取文本文件,然后计算每个单词出现的次数。输入是一个文本文件,输出也是一个文本文件,输出每一行包含一个单词和这个单词出现的次数,以Tab分隔。这个例子压缩在$HADOOP_HOME/hadoop-examples-1.2.1.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-1.2.1.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-1.2.1-jar-with-dependencies.jar,Giraph的例子JAR文件,它的位置是$GIRAPH_HOME/giraph-examples/target/giraph-examples-1.1.0-SNAPSHOT-for-hadoop-1.2.1-jar-with-dependencies.jar,现在你已经完成部署Giraph。

运行一个Giraph任务

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

[, , [[, ], [, ]]]
[, , [[, ], [, ], [, ]]]
[, , [[, ], [, ]]]
[, , [, ], [, ], [, ]]]
[, , [[, ], [, ]]]

保存和关闭文件,每一行是下面的格式[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.-SNAPSHOT-for-hadoop-1.2.1-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 

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

$HADOOP_HOME/bin/hadoop jar $GIRAPH_HOME/giraph-examples/target/giraph-examples-1.2.-SNAPSHOT-for-hadoop-1.2.1-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入门的更多相关文章

  1. 大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍

    Technorati 标记: hadoop,生态圈,ecosystem,yarn,spark,入门 1. hadoop 生态概况 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用 ...

  2. Spark入门实战系列--9.Spark图计算GraphX介绍及实例

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ...

  3. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  4. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  5. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  6. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  7. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  8. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  9. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

随机推荐

  1. poj2528 Mayor's posters(线段树区间覆盖)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 50888   Accepted: 14737 ...

  2. SQLite高级:一库建多表,封装类

    package eoe.database; import android.content.Context; import android.database.sqlite.SQLiteDatabase; ...

  3. Java序列化与反序列化,文件操作

    参考两篇博客: http://blog.csdn.net/moreevan/article/details/6697777 http://blog.csdn.net/moreevan/article/ ...

  4. asp.net实现断点续传

    C# 断点续传原理与实现 在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是 一种基于tcp的简单协议,分为请求和回复两种.请求协议是由 客户机(浏览器)向服务器(WEB ...

  5. bzoj3932

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1326  Solved: 480[Submit][Sta ...

  6. Mysql 多列形成主键(复合主键 )

    什么是数据表的复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成 比如 create table test (    name varchar(19),    id number,    ...

  7. input 框上传多个文件

    在input标签中加入 multiple 属性,可以在一个输入框中选择多个文件进行上传 <input type="file" name="img" mul ...

  8. ios自定义UIButton内部空间Rect

  9. 勘误《iOS网络高级编程:iPhone和iPad的企业应用开发》

    VII页 , 倒数第二行, “其他” 应为 “其它” X页, 源代码有错误,说是有19章,实际一共13章 XI页,勘误表的链接也是错误的  .是该书的<Beginning ASP.NET 4.5 ...

  10. 2.1. 托管对象模型是什么(Core Data 应用程序实践指南)

    托管对象模型是一种数据结构.在这里,数据结构.纲要.对象图.数据模型.托管对象模型这些术语是一个意思.它们是对同一个东西不同场景的描述.比如,对Core Data 而言是托管对象模型,对设计器来说是对 ...