hadoop2.8.5安装采坑指南(非HA)

hadoop安装指南, 本文讲解 hadoop2.8.5(非HA)安装详细步骤。
如果想看HA版本的hadoop安装步骤见 HADOOP HA + HBASE HA + YARN HA 搭

1. hadoop2.8.5 安装前准备

找一台机器按照编译hadoop源码支持hadoop native lib 方法编译源代码。然后把编译的结果用来安装(你也可以直接在hadoop官网上下载编译好的二进制安装文件。但是这些现成的二进制安装文件的native lib可能确实。)

1.1 准备四台机器

序号 ip hostname 配置
1 192.168.0.1 master 磁盘40GB, 8C32GB,存储可以小,但是内存尽量打
2 192.168.0.2 slaver-1 8C16GB,20TB
3 192.168.0.3 slaver-2 8C16GB,20TB
4 192.168.0.4 slaver-3 8C16GB,20TB



其中master后面要运行的进程如下:

进程名字 进程描述 备注
NameNode hadoop的namenode节点
SecondaryNameNode hadoop的SecondaryNameNode节点 生产环境 second和namenode必须分开
ResourceManager yarn的 资源管理manager节点
JobHistoryServer MR job history页面
HQuorumPeer hbase依赖的zk
HMaster Hbase的master节点



其中slaver后面要运行的进程如下:

进程名字 进程描述 备注
NodeManager yarn的 资源管理nodeManager节点
DataNode hadoopde DateNode
HRegionServer hbase的 region server
HQuorumPeer hbase依赖的zk

1.1 linux 内核参数调整


文件描述符ulimit -n 

用户最大进程 nproc (hbase需要 hbse book) 

关闭swap分区 

设置合理的预读取缓冲区 

Linux的内核的IO调度器

Linux 网络 backlog 大小调整(默认128,可以调大)

1.2 机器磁盘挂载和安装用户

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1              40G   0G   40G  0% /
/dev/vdb1             2TB  7.6G  2TB   0% /data

机器目录分配:
hadoop,hbase, spark安装在 /opt/app 下面, 所有的数据放在 /data中
最好单独创建一个用户来安装hadoop,hbase,spark。 不要使用root。比如创建用户hadoop用户。本文使用admin安装。

1.3 hostname配置

centos6/centos7/alios6/alios7可以用


hostname master  (可以立即生效,但是重启后失效)

/etc/sysconfig/network (重启后生效)
HOSTNAME=spark-1    # 重启后生效

/etc/hosts 删除 之前老的 hostname的映射

1.4 配置hosts

修改 四台机器的/etc/hosts

127.0.0.1     localhost
::1     localhost  
192.168.0.1     master
192.168.0.2     slaver-1
192.168.0.3     slaver-2
192.168.0.4     slaver-3

1.5 禁掉防火墙

centos7/alios7

hostname namesudo systemctl disable firewalld
sudo systemctl stop firewalld

centos6/alios6

service iptables stop (临时关闭)

chkconfig iptables off (重启后生效)

setenforce 0 (临时生效)

修改/etc/selinux/config 下的 SELINUX=disabled (重启后生效)

1.6 关闭selinux

运行如下命令

getenforce
  • 如果结果是 Permissive 或者 Disabled那么selinux本身就是关闭的,可以跳过该步骤,继续后面配置;
  • 如果结果是 enforcing 那么继续3。
  • 打开/etc/selinux/config(有些linux在/etc/sysconfig/selinux),改变 SELINUX=enforcing 为 SELINUX=permissive 然后保存;
  • reboot系统,然后运行 setenforce 0。

1.7 SSH免密

四台机器都切换到admin用户。
ssh免密只要master能够免密登录cluster商任何机器就好。 至于slaver没必要免密登录其他机器。

ssh-keygen -t rsa -P ''

然后在master机器上执行

ssh-copy-id    admin@slaver-1
ssh-copy-id    admin@slaver-2
ssh-copy-id    admin@slaver-3

1.8 端口

如果使用AWS(Security Group)或者阿里云(安全组),那么要注意有

配置文件 配置key 配置值 端口介绍 VPC内可见?
core-size.xml fs.defaultFS hdfs://MASTER:PORT 外部访问hdfs端口 VPC外可见
hdfs-site.xml dfs.namenode.secondary.http-address HOSTNAME:PORT second name node http web portal VPC外可见
hdfs-site.xml dfs.http.address HOSTNAME:PORT hadoop 管理界面默认50010 VPC外可见
mapred-site.xml mapreduce.jobhistory.webapp.address HOSTNAME:PORT MR job history web VPC外可见
hbase-site.xml hbase.master.info.port PORT hbase web VPC外可见
hbase-site.xml hbase.regionserver.info.port PORT hbase regionserver web VPC外可见
hbase-site.xml hbase.master.port PORT api访问hbase接口 VPC外可见

1.9 JDK和环境变量

安装jdk1.8 见我之前写的jdk1.8安装教程 配置环境变量, 尽量配置在 ~/.bashrc 或者 /etc/profile中

JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH

2. 安装过程

2.1 下载安装包(或者下载源码自己编译, 好处是可以添加native lib)

cd /opt/app

wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz

tar -zxvf hadoop-2.8.5.tar.gz

2.3 环境变量

2.3.1 操作系统环境变量配置

vi ~/.bashrc 添加如下配置

# hadoop 运行环境
export HADOOP_HOME=/opt/app/hadoop-2.8.5
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$HADOOP_HOME/bin

# hadoop lib环境
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

2.3.2 hadoop-env.sh yarn-env.sh mapred-env.sh配置

  • 确认 hadoop-2.8.5/etc/hadoop/hadoop-env.sh、hadoop-2.8.5/etc/hadoop/yarn-env.sh 、hbase-1.3.3/conf/hbase-env.sh 中 是否有 export JAVA_HOME 的配置, 如果没有那么加上

  • 配置hadoop, yarn, mapreduce的 pid文件目录

  • 配置hadoop JMX, GC日志,GC参数,程序异常退出打印stack和heap自动备份stack和heap信息等
  • 配置hadoop 日志打印目录
#创建  /data/hadoop/pid目录,用来放置hadoop的进程id, 如果不配置默认放在tmp中,会备操作系统定期删除,一旦pid文件删除,那么使用 sbin/stop-all.sh 或者 sbin/stop-dfs.sh等脚本的时候,会失败,只能一个个kill。
mkdir /data/hadoop/pid

### vi hadoop-env.sh
export HADOOP_PID_DIR=/data/hadoop/pid
export HADOOP_SECURE_DN_PID_DIR=/data/hadoop/pid
export JAVA_HOME=${JAVA_HOME}
#hadoop 日志打印目录
export HADOOP_LOG_DIR=/data/hadoop-logs/
#JMX配置
export HADOOP_JMX_OPTS="-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"

export NAMENODE_OPTS="-verbose:gc -XX:+PrintGCDetails -Xloggc:${HADOOP_LOG_DIR}/logs/hadoop-gc.log \
-XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime \
-server -Xmx12288m -Xms12288m -Xmn6144m -Xss256k  -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=15 \
-XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC  -XX:+CMSParallelRemarkEnabled \
-XX:+CMSClassUnloadingEnabled  -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseFastAccessorMethods  -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSMaxAbortablePrecleanTime=5000     \
-XX:+UseGCLogFileRotation  -XX:GCLogFileSize=20m -XX:ErrorFile=${HADOOP_LOG_DIR}/logs/hs_err.log.%p -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HADOOP_LOG_DIR}/logs/%p.hprof \
"


export DATENODE_OPTS="-verbose:gc -XX:+PrintGCDetails -Xloggc:${HADOOP_LOG_DIR}/hadoop-gc.log \
-XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime \
-server -Xmx4096m -Xms4096m -Xmn2048m -Xss256k  -XX:SurvivorRatio=4  -XX:MaxTenuringThreshold=15 \
-XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+UseCMSCompactAtFullCollection -XX:+DisableExplicitGC  -XX:+CMSParallelRemarkEnabled \
-XX:+CMSClassUnloadingEnabled  -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseFastAccessorMethods  -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSMaxAbortablePrecleanTime=5000     \
-XX:+UseGCLogFileRotation -XX:GCLogFileSize=20m -XX:ErrorFile=${HADOOP_LOG_DIR}/logs/hs_err.log.%p -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HADOOP_LOG_DIR}/logs/%p.hprof \
"

export HADOOP_NAMENODE_OPTS="$NAMENODE_OPTS $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="$DATENODE_OPTS $HADOOP_DATANODE_OPTS"




### vi yarn-env.sh
export YARN_PID_DIR=/data/hadoop/pid
export JAVA_HOME=${JAVA_HOME}
export YARN_LOG_DIR=/data/hadoop-logs/yarn-logs/

### vi mapred-env.sh 
export HADOOP_MAPRED_PID_DIR=/wzdata/hadoop/pid
export JAVA_HOME=${JAVA_HOME}
export HADOOP_MAPRED_LOG_DIR=/data/hadoop-logs/mapred-logs/

2.4 hadoop 配置文件 (生产级别HA配置)

core-site.xml, 官方配置

<configuration>
         <property>
        <name>fs.defaultFS</name> <!--NameNode 的URI-->
        <value>hdfs://master:10020</value>
      </property>
      <property>
        <name>hadoop.tmp.dir</name>             <!--hadoop临时文件的存放目录-->
        <value>/data/hadoop/temp</value>
      </property>
      <property>
                <name>topology.node.switch.mapping.impl</name>
               <value>org.apache.hadoop.net.ScriptBasedMapping</value>
        </property>
        <property>
            <name>net.topology.script.file.name</name>
            <value>/opt/app/hadoop-2.8.5/etc/hadoop/topology.sh</value>
        </property>
<property>
</configuration>

其中 /opt/app/hadoop-2.8.5/etc/hadoop/topology.sh 内容如下

#!/bin/bash
#mapping.sh

while [ $# -gt 0 ] ; do
  nodeArg=$1
  exec< /opt/app/hadoop-2.8.5/etc/hadoop/topology.data 
  result="" 
  while read line ; do
    ar=( $line ) 
    if [ "${ar[0]}" = "$nodeArg" ] ; then
      result="${ar[1]}"
    fi
  done 
  shift 
  if [ -z "$result" ] ; then
    echo -n "/default/rack "
  else
    echo -n "$result "
  fi
done

其中需要创建 /opt/app/hadoop-2.8.5/etc/hadoop/topology.data

192.168.0.2     /dc1/rack1
192.168.0.3     /dc1/rack1
192.168.0.4       /dc1/rack2

hdfs-site.xml, 官方配置

首先 创建 /data/hadoop/exclude 这个文件

<configuration>
          <property> <!--namenode持久存储名字空间及事务日志的本地文件系统路径-->
                  <name>dfs.namenode.name.dir</name>
                  <value>/data/hadoop/dfs/name</value>
                    <!--目录无需预先创建,会自动创建-->
                </property>
                <property>  <!--DataNode存放块数据的本地文件系统路径-->
                  <name>dfs.datanode.data.dir</name>
                  <value>/data/hadoop/dfs/data</value>
                 </property>
                <property>  <!--数据需要备份的数量,不能大于集群的机器数量,默认为3-->
                  <name>dfs.replication</name>
                  <value>1</value>
                </property>
                <property>
                  <name>dfs.namenode.secondary.http-address</name>
                  <value>master:10101</value>
                </property> 
                <property>  <!--设置为true,可以在浏览器中IP+port查看-->
                  <name>dfs.webhdfs.enabled</name>
                  <value>true</value>
                </property>
                <!-- 这个先配置着, 后续要删除datanode只用在/data/hadoop/exclude这个文件添加hostname 然后不用重启集群执行  hdfs dfsadmin -refreshNodes就可以了-->
               <property>
                         <name>dfs.hosts.exclude</name>
                         <value>/data/hadoop/exclude</value>
                         <final>true</final>
                      </property>
</configuration>

mapred-site.xml, 官方配置

<configuration>
       <property> <!--mapreduce运用了yarn框架,设置name为yarn-->
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
    </property>
    <property> <!--历史服务器,查看Mapreduce作业记录-->
      <name>mapreduce.jobhistory.address</name>
      <value>master:11103</value>
    </property>
    <property>
      <name>mapreduce.jobhistory.webapp.address</name>
      <value>master:11104</value>
    </property>
</configuration>

yarn-site.xml 官方配置

<configuration>
         <!-- Site specific YARN configuration properties -->
              <property> <!--NodeManager上运行的附属服务,用于运行mapreduce-->
             <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> <!--ResourceManager 对客户端暴露的地址-->
             <name>yarn.resourcemanager.address</name>
             <value>master:10901</value>
           </property>
           <property> <!--ResourceManager 对ApplicationMaster暴露的地址--> 
             <name>yarn.resourcemanager.scheduler.address</name>
             <value>master:10902</value>
           </property>
           <property> <!--ResourceManager 对NodeManager暴露的地址-->
             <name>yarn.resourcemanager.resource-tracker.address</name> 
             <value>master:10903</value>
           </property>
           <property> <!--ResourceManager 对管理员暴露的地址-->
             <name>yarn.resourcemanager.admin.address</name>  
             <value>master:10904</value>
           </property>
           <property> <!--ResourceManager 对外web暴露的地址,可在浏览器查看-->  
             <name>yarn.resourcemanager.webapp.address</name>
             <value>master:10105</value>
           </property>
</configuration>

2.4 hadoop-2.8.5/etc/hadoop/slaves 配置

vi hadoop-2.8.5/etc/hadoop/slaves 

slaver-1
slaver-2
slaver-3

2.5 同步master配置到所有 salver机器上

cat etc/hadoop/slaves | xargs -i -t scp etc/hadoop/* admin@{}:/opt/app/hadoop-2.8.5/etc/hadoop/

2.6 启动hadoop

格式化

#master机器上运行
bin/hdfs namenode -format

启动

下面命令都是在master上执行。

#master机器启动
sbin/start-all.sh

###单独启动namenode
sbin/start-dfs.sh 、sbin/start-yarn.sh


###单独启动 secodnnamenode
sbin/hadoop-daemon.sh start secondarynamenode

###单独启动yarn rm
sbin/hadoop-daemon.sh start ResourceManager

### 单独启动job history
sbin/mr-jobhistory-daemon.sh start historyserver

查看当前hadoop的网络拓扑

hdfs  dfsadmin  -printTopology

192.168.0.2  /dc1/rack1
192.168.0.3   /dc1/rack1
192.168.0.4    /dc1/rack

日志

分别在 $HADOOP_HOME的logs目录看日志

确认是否成功

2.7 确认hadoop启动成功

master机器应该有的进程


3714 ResourceManager
24722 JobHistoryServer
3539 SecondaryNameNode
3268 NameNode

slaver应该有的进程


18896 NodeManager
18769 DataNode

2.8 看下 hadoop的native lib 是否安装成功

hadoop checknative -a
hadoop:  true /opt/app/hadoop-2.8.5/lib/native/libhadoop.so
zlib:    true /lib64/libz.so.1
snappy:  true /usr/local/lib/libsnappy.so.1
lz4:     true revision:10301
bzip2:   true /lib64/libbz2.so.1
openssl: true /usr/local/ssl/lib/libcrypto.so

证明成功了。 否则见 hbase支持snappy, lz4, bizp2,lzo,zs 一文中有讲解如何使hadoop的native lib安装。

2.7 界面

#hadoop管理界面
http://master:50070/explorer.html#/
#yarn管理界面
http://master:10105/cluster/scheduler
#mr history界面
http://master:10104/jobhistory/about

3. 踩坑

datenode连接 namenode不成功报如下错误:
master/192.168.0.1:10102: retries get failed due to exceeded maximum allowed retries number: 10 java.net.ConnectException: Connection refused

原因是 在/etc/hosts 中 127.0.0.1 localhost master 有这么一行 ,导致

tcp        0      0 127.0.0.1:10901              0.0.0.0:*                   LISTEN      30963/java          
tcp        0      0 127.0.0.1:10101              0.0.0.0:*                   LISTEN      30793/java          
tcp        0      0 127.0.0.1:10902              0.0.0.0:*                   LISTEN      30963/java          
tcp        0      0 127.0.0.1:10102              0.0.0.0:*                   LISTEN      30578/java          
tcp        0      0 127.0.0.1:10903              0.0.0.0:*                   LISTEN      30963/java          
tcp        0      0 127.0.0.1:10904              0.0.0.0:*                   LISTEN      30963/java       
导致


端口都绑定在了 127.0.0.1上面,应该绑定在 0.0.0.0上面才对。


解决方法: 把 /etc/hosts去掉 master:改为

127.0.0.1 localhost

坑4

执行 stop-dfs.sh 提示 no namenode to stop 但是hadoop明明在运行。
原因: 没有配置hadoop的 pid文件目录,导致默认放在 /tmp中,这个目录中文件会被操作系统定期删除。一旦pid文件丢失那么 执行上面命令的时候, hadoop系统感知不到运行的namenode进程。
解决方法: 分别在对应机器的/tmp目录中把对应程序的进程号写入 文件

#注意admin是启动hadoop的用户名
echo 24210 > hadoop-admin-namenode.pid 
echo 24327 > hadoop-admin-zkfc.pid

echo 15208 > hadoop-admin-datanode.pid
echo 14672 >  hadoop-admin-journalnode.pid

然后在执行 stop-dfs.sh就好了。
记好 后续 要如 2.3.2 所示配置haodop的 pid目录。

附录:

附录-1 hadoop官方文档阅读方法

hadoop2.8.5 官方文档地址, 下面介绍如何查看这个文档。 该文档左边导航栏分为:

  • general 里面介绍了如何安装配置 single Node 和 cluster模式,如何使用 hadoop shell访问hdfs,如何使用hadoop暴露的接口访问hadoop等
  • common 介绍了一些hadoop的一些特性
  • HDFS 作为hadoop的一个核心单独列出来,介绍了架构和user guid等信息。
  • MapReduce 作为hadoop的一个核心但独立出来,介绍了MR的一些使用方法。
  • YARN 作为hadoop资源调度的核心,单独列出来介绍了以架构和一些使用技巧。
  • configuration 介绍了一些hadoop的一些核心配置。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
慷慨打赏