Hadoop实验环境的搭建:standalone&pesudo cluster

这周结束前完成了Hadoop的本机配置,由于权限的原因还引发了一些小插曲。总之在最后完成了环境的安装。本机的配置为RHEL(RedHat Enterprise Linux) 6.7

  1. 添加用户/用户组

    针对hadoop应用,添加相应的用户和用户组。我们就将其命名为hadoop。

    # sudo groupadd hadoop
    # sudo groupuser -g hadoop hadoop
    

    这样就能遵守“最小权限”原则。

  2. SSH安装

    首先是ssh的安装,在root权限下执行yum update之后,自动更新到最新的软件包。在我的环境下已经安装了ssh,只需启动即可。

    $ sudo /etc/init.d/sshd start
    

    为了方便Hadoop运作,我们使用ssh-keygen设置ssh无密码登录。[1]

  3. 无密登录

    使用公钥-私钥的方式来进行避免密码输入和SSH认证。首先统一规定的hostname,按照[2]所指,修改3处hostname(注意root权限)。

    # hostname Server
    # vi /etc/sysconfig/network //直接添加 Server  
    # vi /etc/hosts //修改 127.0.0.1 的 hostname为 Server
    

    然后就是生成密钥了。使用空密码的rsa加密方法。

    $ ssh-keygen -t rsa -P ""
    # cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    $ chmod 700 ~/.ssh/
    $ chmod 600 ~/.ssh/authorized_keys
    

    cat命令——进行文件之间的拼接并且输出到标准输出。这里是将生成的公钥附加到authorized_keys文件里。

    这里一定要记得设置文件模式,不然通过如下命令检查时还是需要密码登录。

    $ ssh localhost
    
  4. 安装Java

    本机安装时是已经安装Java 1.7.0版本,这里略过。大家可以看这篇文章[3]

  5. 安装hadoop

    直接使用wget将官网上的软件包下载下来。接着解压并移动到/usr/local目录下。最后将目录所有为我们新添加的用户和用户组hadoop。

    $ wget http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
    $ tar xzf hadoop-2.7.2.tar.gz
    $ sudo mv hadoop-2.7.2 /usr/local/hadoop
    $ sudo chown -R hadoop:hadoop /usr/local/hadoop
    

    tar命令——归档文件。参数-xzf表示提取gzip,如果带上v将会解压结果打印到termimal。

    然后再配置hadoop-env.sh文件。2.7.2版本的文件在(hadoop/etc/hadoop/hadoop_env.sh)。

    export JAVA_HOME=/usr/lib/jvm/java-1.7.0-ibm-1.7.0.9.40.x86_64/jre
    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:/usr/local/hadoop/bin
    

    部署单机版Hadoop,source之后通过hadoop version查看是否正常运行。

    # source /usr/local/hadoop/etc/hadoop/hadoop-env.sh
    # hadoop version
    

    source命令——重新执行刚修改的初始化文件。

  6. example

    这里参照官方文档[4]的wordCount和PI例子。直接在/usr/local/hadoop/share/hadoop/mapreduce/可以看到例子的jar包。

    wordCount是统计文本的单词数,我们的输入文件使用hadoop的配置目录下的xml文件。然后将结果存在当前目录下的output2目录下。

    # mkdir input
    # cp etc/hadoop/*.xml input
    # bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount input output2
    

    当敲完这条命令时,Hadoop就会开始运行MapReduce计算。

    wordCount run

    执行命令 # cat output2/* ,可以看到下图所示的计算结果。

    wordCount output

    Pi程序是通过随机投掷点来估算出PI的近似值。这个程序不需要输入参数,只需要设置Map的总数和每个Map的样本数就可以计算出结果。执行完下面这条命令后,可以看到Hadoop开始分配计算任务。

    # bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar pi 1000 1000
    

    Pi run

    因为将计算进行了切分,我们可以通过监控系统资源来查看计算任务的执行过程。从下图可以看出,MapReduce主要是占用CPU资源,峰值达到80%以上。而内存相对使用比较低。

    OS resource

    结果计算出来的Pi值大致为3.141552。

    Pi output

  7. pesudo cluster

    继续跟着官方教程搭建要给单机的伪集群环境。首先我们需要新建HDFS的文件系统目录。我们就直接在Hadoop目录下创建相应的目录。这三个配置文件的详解可见这篇文章

    # mkdir tmp
    # mkdir hdfs
    # mkdir hdfs/name
    # mkdir hdfs/data
    

    然后配置相应的文件。首先是etc/hadoop/目录下的core-site.xml。

    core-site.xml文件中包含如读/写缓冲器用于Hadoop的实例的端口号的信息,分配给文件系统存储,用于存储所述数据存储器的限制和大小。

    这里我们只设置了默认的文件系统和临时文件目录。在添加如下内容即可。

    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://localhost:9000</value>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/local/hadoop/tmp</value>
        </property>
    </configuration>
    

    然后是同目录下的hdfs-site.xml文件。

    hdfs-site.xml 文件中包含如复制数据的值,NameNode路径的信息,本地文件系统的数据节点的路径。这意味着是存储Hadoop基础工具的地方。

    同样地添加下列内容。这里我们设置复本数为1,nameNode和dataNode的目录则是我们开始创建的目录。

    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
        <property>
            <name>dfs.name.dir</name>
            <value>/usr/local/hadoop/hdfs/name</value>
        </property>
        <property>
            <name>dfs.data.dir</name>
            <value>/usr/local/hadoop/hdfs/data</value>
        </property>
    </configuration>
    

    最后设置MapReduce框架。我们修改etc/hadoop/mapred-site.xml文件。这里将开启9001的端口来监控任务的执行。

    <configuration>
        <property>
            <name>mapred.job.tracker</name>
            <value>localhost:9001</value>
        </property>
    </configuration>
    

    这样基本的三个配置文件就修改好了。我们最后还会配置yarn相关内容来监控任务的完成。

    接下来的步骤就是更新配置信息,并格式化namenode。

    # source /usr/local/hadoop/etc/hadoop/hadoop-env.sh
    hadoop namenode -format
    

    这样就可以了吗?我们试着运行一下,terminal会报出一句错误。

    Error: Cannot find configuration directory: /etc/hadoop
    

    这是因为系统无法找到/etc/hadoop路径,我们在hadoop-env.sh文件中添加一条环境变量信息。

    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop/
    

    并且记得source一下。

    # source /usr/local/hadoop/etc/hadoop/hadoop-env.sh
    # sh sbin/start-all.sh
    

    cluster run

    这里我们如图上一样,检查一下java进程。然后我们访问8088和50070端口。8088端口的结果还是有,作为这个Hadoop系统的总览。

    但是50070端口无法访问,我需要关闭这个端口的防火墙。在iptables上添加一条规则。

    iptables -A INPUT -p tcp --dport 50070 -j ACCEPT
    

    这样50070就能正常访问了。

    50070

    我们的最后一步是针对这个Hadoop集群创建HDFS目录和进行一个wordCount测试例程。

    官方教程的命令有误,目录前需要添加/符号。然后我们把etc/hadoop/*.xml全部都存进HDFS。

    # bin/hdfs dfs -mkdir /input
    # bin/hdfs dfs -put etc/hadoop/*.xml /input/
    # bin/hdfs dfs -ls /input
    

    上述最后一条命令的结果可以查看HDFS的目录内文件。

    HDFS

    最后以同样的命令执行wordCount,其结果也是一样的。

    # bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output
    

    Cluster outcome

  8. SETUP YARN

    to be continue