Hadoop集群安装
1.配置服务器
配置hosts
打开主节点的hosts文件,要将文件的前两行注释掉 (注释当前主机的信息)并在文件中添加所有hadoop集群的主机信息
在你选择的主节点上执行:
[root@localhost ~]# vi /etc/hosts
前两行注释掉:
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.18.110 master
192.168.18.111 slaver1
192.168.18.112 slaver2
保存之后,将主节点的hosts分别拷贝到其他两个子节点,在主节点上执行
[root@localhost ~]# scp /etc/hosts root@192.168.18.111:/etc/
[root@localhost ~]# scp /etc/hosts root@192.168.18.112:/etc/
2. 安装jdk
卸载默认jdk(三台机器上都要卸载)
查看系统已经装的jdk:
[root@localhost ~]# rpm -qa|grep jdk
java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
卸载jdk:
[root@localhost ~]# rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
[root@localhost ~]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
其他两个节点操作上边相同动作
安装JDK(三台机器都要安装)
安装在同一位置/opt/java/jdk1.7.0_76
下载JDK
解压JDK :
[root@localhost ~]# mkdir -p /opt/java/ 创建好目录后将jdk包传到这个目录下
[root@localhost ~]# tar -zxvf /opt/java/jdk-7u76-linux-x64.tar.gz -C /opt/java/
其他两个节点操作上边相同动作
配置环境变量, 编辑profile文件:
[root@localhost ~]# vi /etc/profile
在profile文件末尾添加以下代码:
export JAVA_HOME=/opt/java/jdk1.7.0_76
export JAVA_BIN=/opt/java/jdk1.7.0_76/bin
export PATH=$PATH:$JAVA_HOME/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
拷贝profile到子节点
在你选择的主节点上执行:(192.168.18.111和192.168.18.112 IP是你选择的另外两个从节点机器)
[root@localhost ~]# scp /etc/profile root@192.168.18.111:/etc/
[root@localhost ~]# scp /etc/profile root@192.168.18.112:/etc/
三台都重启:
[root@localhost ~]# reboot
3. 配置ssh无密码访问
生成公钥私钥对
在每个节点上分别执行:
[root@master ~]# ssh-keygen -t rsa
[root@slaver1 ~]# ssh-keygen -t rsa
[root@slaver2 ~]# ssh-keygen -t rsa
一直按回车直到生成结束
执行结束之后每个节点上的/root/.ssh/目录下生成了两个文件 id_rsa 和 id_rsa.pub
其中前者为私钥,后者为公钥
在主节点上执行:
[root@master ~]# cd /root/.ssh/
[root@master .ssh]# cp id_rsa.pub authorized_keys
将子节点的公钥拷贝到主节点并添加进authorized_keys
将两个子节点的公钥拷贝到主节点上,分别在两个子节点上执行:
[root@slaver1 ~]# scp /root/.ssh/id_rsa.pub root@master:/root/.ssh/id_rsa_slaver1.pub
[root@slaver2 ~]# scp /root/.ssh/id_rsa.pub root@master:/root/.ssh/id_rsa_slaver2.pub
然后在主节点上,将拷贝过来的两个公钥合并到authorized_keys文件中去
主节点上执行:
[root@master ~]# cd /root/.ssh/
[root@master .ssh]# cat id_rsa_slaver1.pub>>authorized_keys
[root@master .ssh]# cat id_rsa_slaver2.pub>>authorized_keys
最后测试是否配置成功
在主节点上分别执行
[root@master ~]# ssh slaver1
[root@master ~]# ssh slaver2
能正确跳转到两台子节点的操作界面即可,同样在每个子节点通过相同的方式登录主节点和其他子节点也能无密码正常登录就表示配置成功。
这里的配置方式可以有多种操作步骤,最终目的是每个节点上的/root/.ssh/authorized_keys文件中都包含所有的节点生成的公钥内容。
将主节点的authorized_keys文件分别替换子节点的authorized_keys文件
主节点上执行用scp命令将authorized_keys文件拷贝到子节点的相应位置
[root@master ~]# cd /root/.ssh
[root@master .ssh]# scp authorized_keys root@slaver1:/root/.ssh/
[root@master .ssh]# scp authorized_keys root@slaver2:/root/.ssh/
上面配置SSH切换服务器较繁琐,稍不小心就会出错,可以用下面的
安装ssh 证书
[root@master~]$ ssh-keygen -t rsa
[root@slaver1~]$ ssh-keygen -t rsa
[root@slaver2~]$ ssh-keygen -t rsa
[root@master~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@master~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@master~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
[root@slaver1~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@slaver1~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@slaver1~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
[root@slaver2~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub master
[root@slaver2~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver1
[root@slaver2~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub slaver2
以下只在你选择主节点上操作
4.安装hadoop
首先将hadoop-2.6.4.tar.gz放到三台机器的/usr目录下
在master主机上安装hadoop
安装位置自定,例如安装在/usr目录下面
下载hadoop包,放在/usr目录下,解压hadoop
[root@master ~]# tar -zxvf /usr/hadoop-2.6.4.tar.gz -C /usr/
在usr下面生成hadoop-2.6.4目录
配置环境变量:
[root@master ~]# vi .bash_profile
PATH=$PATH:$HOME/bin:/usr/hadoop-2.6.4/sbin
export PATH
export JAVA_HOME=/opt/java/jdk1.7.0_76
export JAVA_BIN=/opt/java/jdk1.7.0_76/bin
export PATH=$PATH:$JAVA_HOME/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
HADOOP_HOME=/usr/hadoop-2.6.4
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_HOME HADOOP_CONF_DIR PATH
[root@master ~]# source .bash_profile
5.配置hadoop
配置hadoop配置文件
需要配置的文件的位置为/hadoop-2.6.4/etc/hadoop,需要修改的有以下几个
hadoop-env.sh
yarn-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
slaves
其中
hadoop-env.sh和yarn-env.sh里面都要添加jdk的环境变量:
hadoop-env.sh中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi hadoop-env.sh
# The java implementation to use.
# The jsvc implementation to use. Jsvc isrequired to run secure datanodes
# that bind to privileged ports to provideauthentication of data transfer
# protocol. Jsvc is not required if SASL is configured for authentication of
# data transfer protocol usingnon-privileged ports.
#export JSVC_HOME=${JSVC_HOME}
exportJAVA_HOME=/opt/java/jdk1.7.0_76
#(红色为新添加的内容,其他的代码是文件中原有的)
yarn-env.sh中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi yarn-env.sh
# User for YARN daemons
exportHADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}
# resolve links - $0 may be a softlink
exportYARN_CONF_DIR="${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}"
# some Java parameters
exportJAVA_HOME=/opt/java/jdk1.7.0_76
#(红色为新添加的内容,其他的代码是文件中原有的)
[root@master ~]# mkdir -p /usr/temp
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/data
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/namesecondary
[root@master ~]# mkdir -p /usr/hadoop-2.6.4/dfs/name
注:下边配置参数时蓝色汉字为注释,不能拷贝进配置文件中
core-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
<description>NameNode URI.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>Size ofread/write buffer used inSequenceFiles.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:///usr/temp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
hdfs-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
<description>The secondary namenode http server addressandport.</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/hadoop-2.6.4/dfs/name</value>
<description>Path on the local filesystem where the NameNodestoresthe namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/hadoop-2.6.4/dfs/data</value>
<description>Comma separated list of paths on the local filesystemofa DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///usr/hadoop-2.6.4/dfs/namesecondary</value>
<description>Determines where on the local filesystem theDFSsecondary name node should store the temporary images to merge. If this isacomma-delimited list of directories then the image is replicated in all ofthedirectories for redundancy.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.web.ugi</name>
<value>supergroup</value>
</property>
</configuration>
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml
mapred-site.xml中
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>Theruntime framework for executing MapReduce jobs.Can be one of local, classic oryarn.</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
<description>MapReduce JobHistoryServer IPChost:port</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
<description>MapReduceJobHistoryServer Web UI host:port</description>
</property>
<property>
<name>mapred.remote.os</name>
<value>Linux</value>
</property>
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
/usr/hadoop-2.6.4/etc/hadoop,
/usr/hadoop-2.6.4/share/hadoop/common/*,
/usr/hadoop-2.6.4/share/hadoop/common/lib/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/lib/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/lib/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
yarn-site.xml中
[root@master ~]# cd /usr/hadoop-2.6.4/etc/hadoop
[root@master hadoop]# vi yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
<description>The hostnameof theRM.</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>Shuffle service that needs to be set for MapReduceapplications.</description>
</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>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>
/usr/hadoop-2.6.4/etc/hadoop,
/usr/hadoop-2.6.4/share/hadoop/common/*,
/usr/hadoop-2.6.4/share/hadoop/common/lib/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/*,
/usr/hadoop-2.6.4/share/hadoop/hdfs/lib/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/*,
/usr/hadoop-2.6.4/share/hadoop/mapreduce/lib/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/*,
/usr/hadoop-2.6.4/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
slaves中
[root@master hadoop]# vi slaves
slaver1
slaver2
拷贝hadoop安装文件到子节点
主节点上执行:
[root@master hadoop]# scp -r /usr/hadoop-2.6.4/ root@slaver1:/usr/
[root@master hadoop]# scp -r /usr/hadoop-2.6.4/ root@slaver2:/usr/
格式化主节点的namenode
主节点上进入hadoop目录
然后执行:
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]# ./bin/hadoop namenode -format
新版本用下面的语句不用hadoop命令了
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]# ./bin/hdfs namenode -format
启动hadoop
主节点上在hadoop-2.6.4目录下执行:
[root@master ~]# cd /usr/hadoop-2.6.4
[root@master hadoop-2.6.4]#./sbin/start-all.sh
主节点上jps进程有:
[root@master hadoop-2.6.4]# jps
NameNode
SecondaryNameNode
ResourceManager
Jps
在两个子节点上执行:
每个子节点上的jps进程有:
[root@slaver1 hadoop-2.6.4]# jps
DataNode
NodeManager
Jps
[root@slaver1 hadoop-2.6.4]# jps
DataNode
NodeManager
jps
如果这样表示hadoop集群配置成功
查找指定文件的块位置:
[root@master ~]# hadoop fsck /user/root/aa.txt -files -blocks -racks -locations
DEPRECATED: Use of this script to executehdfs command is deprecated.
Instead use the hdfs command for it.
16/12/14 21:05:12 WARNutil.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using builtin-java classes where applicable
Connecting to namenode viahttp://master:50070
FSCK started by root (auth:SIMPLE) from/192.168.18.110 for path /user/root/aa.txt at Wed Dec 14 21:05:15 CST 2016
/user/root/aa.txt 248305251 bytes, 2block(s): OK
0.BP-1810680398-192.168.18.110-1481303633970:blk_1073742062_1238len=134217728 repl=2 [/default-rack/192.168.18.111:50010, /default-rack/192.168.18.112:50010]
1.BP-1810680398-192.168.18.110-1481303633970:blk_1073742063_1239len=114087523 repl=2 [/default-rack/192.168.18.111:50010,/default-rack/192.168.18.112:50010]
Status: HEALTHY
Total size: 248305251 B
Total dirs: 0
Totalfiles: 1
Total symlinks: 0
Total blocks (validated): 2 (avg. block size 124152625 B)
Minimally replicated blocks: 2 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 2
Average block replication: 2.0
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: 2
Number of racks: 1
FSCK ended at Wed Dec 14 21:05:15 CST 2016in 14 milliseconds
The filesystem under path'/user/root/aa.txt' is HEALTHY
[root@slaver1 ~]# find /usr/hadoop-2.6.4/dfs/data -name blk_1073742062_1238.meta
/usr/hadoop-2.6.4/dfs/data/current/BP-1810680398-192.168.18.110-1481303633970/current/finalized/subdir0/subdir0/blk_1073742062_1238.meta
关于检查点的一些问题:
1、问题的描述
需要在原来已经部署了集群上重新部署,之后,启动集群,由于Cloudera Manager 会默认设置dfs.namenode.checkpoint.period和dfs.namenode.checkpoint.txns分别是1个小时和1000000。只要达到这两个条件之一,secondarynamenode会执行checkpoint操作,此时会出现如下的问题:
ERROR:The health testresult for NAME_NODE_HA_CHECKPOINT_AGE has become bad: The filesystem checkpoint is 4 hour(s) old. This is401.25% of the configured checkpoint period of 1 hour(s). Critical threshold:400.00%. 2,793 transactions have occurred since the last filesystem checkpoint.This is 0.28% of the configured checkpoint transaction target of 1,000,000.
经过初步分析,是由于secondarynamenode没有执行checkpoint的原因所导致,于是就查看了一下secondarynamenode的日志,发现真正的错误是:
ERROR: Exception in doCheckpointjava.io.IOException: Inconsistent checkpoint field
此时,说明查看个角色运行的日志很重要的,能够很精确的定位错误所在。
这两个问题的联系主要是secondarynamenode没有执行检查点的操作,导致会产生上面的错误,说明你一直没有执行检查点的操作,下面的错误说明的是执行检查点操作失败,不执行。
2、问题的解决前的知识储备
在解决问题之前首先需要介绍一下检查点的作用及重要性。
(1)检查点
何为检查点:检查点是给secondarynamenode设置的,通过设置hdfs-site.xml中参数dfs.namenode.checkpoint.period和dfs.namenode.checkpoint.txns来触发,只要达到这两个条件之一就可以出发secondarynamenode执行检查点的操作。
(2)检查点的的内容:
secondarynamenode执行检查点的内容是首先从namenode中读取Fsimage,并执行namenode中editslog文件中的操作,并最终生成一个新的FSimage文件,并将这个文件上传给Namenode。注意:在这个过程中,如果editlog没有任何的记录的话,达到了检查点的条件后,也由于没有发生任何改变,因此不执行检查点操作。
(3)检查点的作用:
secondarynamenode执行这个检查点的操作,可以减少namenode的启动时间。
3、问题的解决方法
通过真正的错误的描述,发现主要是版本不匹配,说明在重新安装的时候,保留了以前版本的的数据,导致不一致的版本问题,所以导致secondarynamenode不执行检查点的操作。那么解决办法就是删除之前的数据,所以通过删除secondarynamenode执行检查点是的目录,即hdfs-site.xml中参数fs.checkpoint.dir,dfs.namenode.checkpoint.dir的值的路径
删除之后,重新启动集群即可。
配置参数网址:
http://cloudtech.iteye.com/blog/1620089
任务在mapreduce.Job: Running job 卡住不动
可能是因为调度执行了很多次在web 页面 All Applications 上看到很多进程都是UNASSIGNED
在机器上面执行
[root@master ~]# yarn application -list
显示有很多任务在,虽然添加任务的脚本已经kill掉了但是任务队列还是在yarn上
在hadoop下执行
[root@master ~]# yarn application -list| awk '{print " yarn application-kill " $1}'| sh
历史服务器:
Hadoop自带一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息
默认情况下,Hadoop历史服务器是没有启动的,我们可以通过下面的命令来启动Hadoop历史服务器
$ sbin/mr-jobhistory-daemon.sh
starthistoryserver
这样我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面,可以查看已经运行完的作业情况,历史服务器可以单独在一台机器上启动,主要是通过以下的参数配置:
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
上面的参数是在mapred-site.xml文件中进行配置,mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address默认的值分别是master:10020和master:19888,根据自己的情况进行相应的配置,参数的格式是host:port,配置完上述的参数之后,重新启动Hadoop jobhistory,这样我们就可以在mapreduce.jobhistory.webapp.address参数配置的主机上对Hadoop历史作业情况经行查看。
这些历史数据是存放在HDFS中,我们可以通过下面的配置来设置在HDFS的什么目录下存放历史作业记录:
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}
/history/done_intermediate</value>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp/hadoop-yarn/staging</value>
</property>
上面的配置都默认的值,我们可以在mapred-site.xml文件中进行修改,其中,mapreduce.jobhistory.done-dir参数的意思是在什么目录下存放已经运行完的Hadoop作业记录;mapreduce.jobhistory.intermediate-done-dir的意思是正在运行的Hadoop作业记录。
我们可以到mapreduce.jobhistory.done-dir参数配置的目录下看看里面存放的是什么东西:
[wyp@master /home/wyp/hadoop]# bin/hadoop fs -ls /jobs/done/