zoukankan      html  css  js  c++  java
  • 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 1.2.1

    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组。

    XXX@XXX-ThinkPad-Edge-E431:~$ sudo addgroup hadoop
    正在添加组"hadoop" (GID 1004)...
    完成。
    XXX@XXX-ThinkPad-Edge-E431:~$ 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-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-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-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,用下面的内容:

    [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-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 1

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

    $HADOOP_HOME/bin/hadoop jar $GIRAPH_HOME/giraph-examples/target/giraph-examples-1.2.0-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
  • 相关阅读:
    币圈寒冬,过去两周内全球约60万矿商关机
    币圈人警惕!5大错误足以摧毁你的一切
    Doctype作用?标准模式与兼容模式各有什么区别?
    递归
    anguments
    fixed 和 absolute 定位的区别
    SublimeText 自带格式化代码功能
    css布局-双飞翼布局
    CSS布局-圣杯布局
    品字布局
  • 原文地址:https://www.cnblogs.com/yandufeng/p/5213685.html
Copyright © 2011-2022 走看看