hadoop安装指南, 本文讲解 hadoop2.8.5(非HA)安装详细步骤。
如果想看HA版本的hadoop安装步骤见 HADOOP HA + HBASE HA + YARN HA 搭。
找一台机器按照编译hadoop源码支持hadoop native lib 方法编译源代码。然后把编译的结果用来安装(你也可以直接在hadoop官网上下载编译好的二进制安装文件。但是这些现成的二进制安装文件的native lib可能确实。)
序号 | 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 |
文件描述符ulimit -n
用户最大进程 nproc (hbase需要 hbse book)
关闭swap分区
设置合理的预读取缓冲区
Linux的内核的IO调度器
Linux 网络 backlog 大小调整(默认128,可以调大)
$ 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安装。
centos6/centos7/alios6/alios7可以用
hostname master (可以立即生效,但是重启后失效)
/etc/sysconfig/network (重启后生效)
HOSTNAME=spark-1 # 重启后生效
/etc/hosts 删除 之前老的 hostname的映射
修改 四台机器的/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
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 (重启后生效)
运行如下命令
getenforce
四台机器都切换到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
如果使用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外可见 |
安装jdk1.8 见我之前写的jdk1.8安装教程 配置环境变量, 尽量配置在 ~/.bashrc 或者 /etc/profile中
JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
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
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"
确认 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文件目录
#创建 /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/
<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
首先 创建 /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>
<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>
<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>
vi hadoop-2.8.5/etc/hadoop/slaves
slaver-1
slaver-2
slaver-3
cat etc/hadoop/slaves | xargs -i -t scp etc/hadoop/* admin@{}:/opt/app/hadoop-2.8.5/etc/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
hdfs dfsadmin -printTopology
192.168.0.2 /dc1/rack1
192.168.0.3 /dc1/rack1
192.168.0.4 /dc1/rack
分别在 $HADOOP_HOME的logs目录看日志
master机器应该有的进程
3714 ResourceManager
24722 JobHistoryServer
3539 SecondaryNameNode
3268 NameNode
slaver应该有的进程
18896 NodeManager
18769 DataNode
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安装。
#hadoop管理界面
http://master:50070/explorer.html#/
#yarn管理界面
http://master:10105/cluster/scheduler
#mr history界面
http://master:10104/jobhistory/about
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
执行 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目录。
hadoop2.8.5 官方文档地址, 下面介绍如何查看这个文档。 该文档左边导航栏分为: