Hadoop构建数据仓库实践
上QQ阅读APP看书,第一时间看更新

4.2 安装Apache Hadoop

4.2.1 安装环境

这里只是演示手工安装ApacheHadoop的过程,不作为生产环境使用,因此建立四台VirtualBox上的Linux虚机,每台硬盘20GB,内存768MB(Hadoop建议操作系统的最小内存是2GB)。IP与主机名如下:

● 192.168.56.101 master

● 192.168.56.102 slave1

● 192.168.56.103 slave2

● 192.168.56.104 slave3

主机规划:192.168.56.101做master,运行NameNode和ResourceManager进程。其他三台主机做slave,运行DataNode和NodeManager进程。

操作系统:CentOS release 6.4(Final)。

Java版本:jdk1.7.0_75(2.7及其以后版本的Hadoop需要Java 7)。

Hadoop版本:hadoop-2.7.2。

4.2.2 安装前准备

第1、2步使用root用户执行,3、4步使用grid用户执行。

1.分别在四台机器上建立grid用户

    # 新建用户grid,主目录为/home/grid,如果该目录不存在则建立
    useradd -d /home/grid -m grid
    # 将grid用户加到root组
    usermod -a -G root

2.分别在四台机器上的/etc/hosts文件中添加如下内容,用作域名解析

    192.168.56.101 master
    192.168.56.102 slave1
    192.168.56.103 slave2
    192.168.56.104 slave3

3.分别在四台机器上安装java(安装包已经下载到grid用户主目录)

    # 进入grid用户的主目录
    cd ~
    # 解压缩
    tar -zxvf jdk-7u75-linux-x64.tar.gz

4.配置ssh免密码

Hadoop集群中的各个节点主机需要相互通信,因此DataNode与NameNode之间要能免密码ssh,这里配置了任意两台机器都免密码。

(1)分别在四台机器上生成密钥对

    # 进入grid用户的主目录
    cd ~
    # 生成密钥对
    ssh-keygen -t rsa

然后一路按回车键。

(2)在master上执行

    # 进入.ssh
    cd ~/.ssh/
    # 把本机的公钥追加到自身的~/.ssh/authorized_keys文件里
    ssh-copy-id 192.168.56.101
    # 将authorized_keys文件复制到第二台主机
    scp /home/grid/.ssh/authorized_keys 192.168.56.102:/home/grid/.ssh/

(3)在slave1上执行

    cd ~/.ssh/
    ssh-copy-id 192.168.56.102
    scp /home/grid/.ssh/authorized_keys 192.168.56.103:/home/grid/.ssh/

(4)在slave2上执行

    cd ~/.ssh/
    ssh-copy-id 192.168.56.103
    scp /home/grid/.ssh/authorized_keys 192.168.56.104:/home/grid/.ssh/

(5)在slave3上执行

    cd ~/.ssh/
    ssh-copy-id 192.168.56.104
    # 此时authorized_keys文件中已经包含所有四台主机的公钥,将它复制到每台主机
    scp /home/grid/.ssh/authorized_keys 192.168.56.101:/home/grid/.ssh/
    scp /home/grid/.ssh/authorized_keys 192.168.56.102:/home/grid/.ssh/
    scp /home/grid/.ssh/authorized_keys 192.168.56.103:/home/grid/.ssh/

至此,免密码ssh配置完成。

4.2.3 安装配置Hadoop

以下的操作均使用grid用户在master主机上执行。

1.安装hadoop(安装包已经下载到grid用户主目录)

    cd ~
    tar -zxvf hadoop-2.7.2.tar.gz

2.建立目录

    cd ~/hadoop-2.7.2
    mkdir tmp
    mkdir hdfs
    mkdir hdfs/data
    mkdir hdfs/name

3.修改配置文件

编辑~/hadoop-2.7.2/etc/hadoop/core-site.xml文件,添加如下内容。

    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://192.168.56.101:9000</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/home/grid/hadoop-2.7.2/tmp</value>
    </property>
    <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
    </property>
    </configuration>

说明:core-site.xml是Hadoop的全局配置文件,这里配置了三个参数。

● fs.defaultFS:默认文件系统的名称,URI形式,默认是本地文件系统。

● hadoop.tmp.dir:Hadoop的临时目录,其他目录会基于此路径,是本地目录。

● io.file.buffer.size:在读写文件时使用的缓存大小。这个大小应该是内存Page的倍数。

编辑~/hadoop-2.7.2/etc/hadoop/hdfs-site.xml文件,添加如下内容。

    <configuration>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/home/grid/hadoop-2.7.2/hdfs/name</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/home/grid/hadoop-2.7.2/hdfs/data</value>
    </property>
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>192.168.56.101:9001</value>
    </property>
    <property>
    <name>dfs.namenode.servicerpc-address</name>
    <value>192.168.56.101:10000</value>
    </property>
    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>
    </configuration>

说明:hdfs-site.xml是HDFS的配置文件,这里配置了6个参数。

● dfs.namenode.name.dir:本地磁盘目录,用于NamaNode存储fsimage文件。可以是按逗号分隔的目录列表,fsimage文件会存储在每个目录中,冗余安全。这里多个目录设定,最好在多个磁盘,如果其中一个磁盘故障,会跳过坏磁盘,不会导致系统停服。如果配置了HA,建议仅设置一个。如果特别在意安全,可以设置2个。

● dfs.datanode.data.dir:本地磁盘目录,HDFS数据存储数据块的地方。可以是逗号分隔的目录列表,典型的,每个目录在不同的磁盘。这些目录被轮流使用,一个块存储在这个目录,下一个块存储在下一个目录,依次循环。每个块在同一个机器上仅存储一份。不存在的目录被忽略。必须创建文件夹,否则被视为不存在。

● dfs.replication:数据块副本数。此值可以在创建文件时设定,客户端可以设定,也可以在命令行修改。不同文件可以有不同的副本数。默认值用于未指定时。

● dfs.namenode.secondary.http-address:SecondaryNameNode的http服务地址。如果端口设置为0,服务将随机选择一个空闲端口。使用了HA后,就不再使用SecondaryNameNode了。

● dfs.namenode.servicerpc-address:HDFS服务通信的RPC地址。如果设置该值,备份结点、数据结点和其他服务将会连接到指定地址。注意,该参数必须设置。

● dfs.webhdfs.enabled:指定是否在NameNode和DataNode上开启WebHDFS功能。

编辑~/hadoop-2.7.2/etc/hadoop/yarn-site.xml文件,添加如下内容。

    <configuration>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
    <name>yarn.resourcemanager.address</name>
    <value>192.168.56.101:8032</value>
    </property>
    <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>192.168.56.101:8030</value>
    </property>
    <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>192.168.56.101:8031</value>
    </property>
    <property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>192.168.56.101:8033</value>
    </property>
    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>192.168.56.101:8088</value>
    </property>
    <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>1024</value>
    </property>
    </configuration>

说明:yarn-site.xml是YARN的配置文件,这里配置了8个参数。

● yarn.nodemanager.aux-services:NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序。

● yarn.nodemanager.aux-services.mapreduce.shuffle.class:对应参考yarn.nodemanager. aux-services。

● yarn.resourcemanager.address:ResourceManager对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等。

● yarn.resourcemanager.scheduler.address:调度器地址,是ResourceManager对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等。

● yarn.resourcemanager.resource-tracker.address:ResourceManager对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。

● yarn.resourcemanager.admin.address:ResourceManager对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等。

● yarn.resourcemanager.webapp.address:ResourceManage对外WebUI地址。用户可通过该地址在浏览器中查看集群各类信息。

● yarn.nodemanager.resource.memory-mb:NodeManage总的可用物理内存,不能小于1024。注意,该参数一旦设置,整个运行过程中不可动态修改。

编辑~/hadoop-2.7.2/etc/hadoop/mapred-site.xml文件,添加如下内容。

    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.address</name>
    <value>192.168.56.101:10020</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>192.168.56.101:19888</value>
    </property>
    </configuration>

说明:mapred-site.xml是MapReduce的配置文件,这里配置了三个参数。

● mapreduce.framework.name:设置MapReduce的执行框架为yarn。

● mapreduce.jobhistory.address:MapReduce历史服务器的地址。

● mapreduce.jobhistory.webapp.address:MapReduce历史服务器Web UI地址。

编辑~/hadoop-2.7.2/etc/hadoop/slaves文件,添加如下内容。

    192.168.56.102
    192.168.56.103
    192.168.56.104

说明:在etc/hadoop/slaves文件中写出所有slave的主机名或者IP地址,每个一行。Hadoop辅助脚本使用etc/hadoop/slaves文件一次在多个主机上运行命令。这些脚本并不使用任何基于Java的Hadoop配置。为了正常使用,运行Hadoop的用户各在服务器之间需要ssh信任(即安装前配置的ssh免密码)。

编辑~/hadoop-2.7.2/etc/hadoop/hadoop-env.sh文件,修改如下内容。

    export JAVA_HOME=/home/grid/jdk1.7.0_75

说明:使用etc/hadoop/hadoop-env.sh脚本设置Hadoop HDFS后台进程的站点特定环境变量,至少需要指定JAVA_HOME,以保证在每一个远程节点上正确定义。

编辑~/hadoop-2.7.2/etc/hadoop/yarn-env.sh文件,修改如下内容。

    export JAVA_HOME=/home/grid/jdk1.7.0_75

说明:使用etc/hadoop/yarn-env.sh脚本设置HadoopYARN后台进程的站点特定环境变量,至少需要指定JAVA_HOME,以保证在每一个远程节点上正确定义。

4.将hadoop主目录复制到各个从服务器上

    scp -r ./hadoop-2.7.2192.168.56.102:/home/grid/
    scp -r ./hadoop-2.7.2192.168.56.103:/home/grid/
    scp -r ./hadoop-2.7.2192.168.56.104:/home/grid/

4.2.4 安装后配置

使用root用户分别在四台机器上的/etc/profile文件中添加如下环境变量。

    export JAVA_HOME=/home/grid/jdk1.7.0_75
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export HADOOP_HOME=/home/grid/hadoop-2.7.2
    export HADOOP_COMMON_HOME=$HADOOP_HOME
    export HADOOP_HDFS_HOME=$HADOOP_HOME
    export HADOOP_MAPRED_HOME=$HADOOP_HOME
    export HADOOP_YARN_HOME=$HADOOP_HOME
    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/lib
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
    export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

使环境变量生效。

    source /etc/profile

4.2.5 初始化及运行

以下的操作均使用grid用户在master主机上执行。

    # 格式化HDFS
    hdfs namenode -format

看到输出中出现“INFO common.Storage: Storage directory/home/grid/hadoop-2.7.2/hdfs/name has been successfully formatted.”信息,则表明格式化成功。

    # 启动HDFS
    start-dfs.sh
    # 启动YARN
    start-yarn.sh

执行成功后,使用jps命令查看主节点Java进程,可以看到主节点上启动了NameNode、SecondaryNameNode、ResourceManager守护进程,如下所示。

    [grid@master hadoop]$ jps
    7194 Jps
    6916 ResourceManager
    6757 SecondaryNameNode
    6546 NameNode

查看从节点Java进程,可以看到从节点上启动了DataNode、NodeManager守护进程,如下所示。

    [grid@slave1~]$ jps
    1385 DataNode
    1506 Jps
    1470 NodeManager

通过Web接口查看NameNode,如图4-1所示。

图4-1 Hadoop Web界面

至此,Apache Hadoop已经安装完成,这个安装只有HDFS、YARN、MapReduce等基本组件,不包含任何其他的Hadoop组件。如果需要使用Hive、HBase、Spark等其他工具,需要在此基础上手工安装。在4.4节安装CDH时会看到,它已经包含了大部分Hadoop生态圈提供的服务(5.7.0包含21个服务),安装时可以配置所需的服务,安装后也可以使用图形化的控制台添加或删除服务,为用户提供了极大的方便。