hadoop+zookeeper+hive+HA集群部署笔记
Posted 进击的大杂烩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop+zookeeper+hive+HA集群部署笔记相关的知识,希望对你有一定的参考价值。
hadoop+zookeeper+hive+HA集群部署笔记
说明一下:这个架构支持namenode多节点,保证了namenode的高可用,因此更大可能的保持了元数据的完整。(- -! namenode是hadoop的心脏)
环境:Ubuntu 14.04.3 LTS \n \l 64bits
服务器说明:
10.20.122.73 namenodem zookeeper
10.20.122.74 namenodes zookeeper mysql tez hive
10.20.122.76 datanode76
10.20.122.77 datanode77
对应的软件版本如下:(软件版本比较新,兼容问题已经测试通过)
hadoop 2.7.1
hive-1.2.1
zookeeper-3.4.6
apache-tez-0.7.0
java 1.8.0_45
maven 3.3.3 : 安装tez编译时需要使用
一,关闭防火墙
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
二,修改主机名
在每个主机上做同样的操作
在root用户下
分别执行如下两条命令:
1.修改主机名:
vi /etc/hostname
2.把其中原来的ubuntu名修改为网络规划中指定的主机名
vi /etc/hosts
在文件中添加如下数据
10.20.122.73 namenodem
10.20.122.74 namenodes
10.20.122.76 datanode76
10.20.122.77 datanode77
重启生效
三,创建用户
在每个主机上做同样的操作
用root用户登录,在所有节点上创建用户,用户名为hadoop ,密码:hadoop (这是用我的名字创建的,当然是可以修改的)
1、创建用户组:groupadd hadoopgrp
2、执行如下命令: useradd hadoop -g hadoopgrp -d /home/hadoop
3、用户建立好,在设置密码
执行如下命令: passwd hadoop
在提示输入密码处输入:hadoop
在提示确认密码处输入:hadoop
四,创建密钥,并且建立互信关系
所有的主机上都执行同样测操作
1、切换用户到hadoop
sudo su hadoop
2、创建.ssh 文件夹
在/home/hadoop目录下
mkdir .ssh
设置 .ssh 文件夹权限为
chmod 700 .ssh
3、创建密钥
执行如下命令:ssh-keygen -t rsa
持续回车确认,完成后在 .ssh目录下会产生如下两个文件 :id_rsa(私钥文件) id_rsa.pub(公钥文件)
4.然后在本地建立文件authorized_keys,把公钥写进去,然后赋予600的权限。然后批量分发到所有服务器。
五,安装jdk,这里使用1.8版本
安装方法:
1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html上下载,拷贝到namenodem的/tmp位置
2.在namenodem,使用root用户身份
tar zxvf jdk-8u60-linux-x64.tar.gz -C /
mv /jdk1.8.0_60 /jdk
3.修改/etc/bashrc加入
export JAVA_HOME=/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
4.执行source命令使其生效
source /etc/bashrc
使其当即生效,否则需要重新进入Terminal。
5.将jdk信息拷贝到其他服务器。
scp -r /jdk namenodes:/
scp -r /jdk datanode76:/
scp -r /jdk datanode77:/
6.如何判定是否成功安装?
在服务器上执行命令java -version查看
如上图即正常。
六,安装zookeeper
在这里可以理解zookeeper是HA,主要是用于namenode高可用,因此可以理解成有主从的leader和flower关系。为什么要这样?因为hadoop集成环境中最重要的就是nematode,nematode挂了,这个集群也就挂了。
当然zookeeper的安装非常简单。
1.从http://mirrors.cnnic.cn/apache/zookeeper/ 下载
2.本地解压到hadoop目录下,tar zxvf XXXXXX 这个不用多说,很简单。
3.修改配置文件。
解压后在conf目录下,有个zoo_sample.cfg的文件,这个就是zookeeper的配置文件,便于管理,我们先将它改名,改成zoo.cfg。命令用mv。
配置文件按照如下修改:
dataDir=/home/hadoop/zookeeper/data
server.1=namenodem:2888:3888
server.2=namenodes:2888:3888
这三行是重点,主要添加和修改的内容,目的是要告诉zookeeper,我有两台服务器,Server-ID分别为1和2,当然,你在这里直接写IP也可以,不过主机名比较直观,这就是为什么一开始要搞主机名的原因,下面还有很多配置都需要用到主机名。
好了,那么问题来了,假如73 namenodem和74 namenodes 的zookeeper配置都一样,那么他们怎么互相区别呢?
设置myid,创建文件/home/hadoop/zookeeper/data/myid 里面写上你zoo.cfg配置文件里面的server id,即73为1,74为2。
配置完了,要启动zookeeper
启动方法 /home/hadoop/zookeeper/bin下
hadoop@namenodem:~/zookeeper/bin$ ls -al
total 88
drwxr-xr-x 2 hadoop hadoopgrp 4096 Sep 18 08:27 .
drwxr-xr-x 11 hadoop hadoopgrp 4096 Sep 18 08:19 ..
-rwxr-xr-x 1 hadoop hadoopgrp 238 Feb 20 2014 README.txt
-rwxr-xr-x 1 hadoop hadoopgrp 1937 Feb 20 2014 zkCleanup.sh
-rwxr-xr-x 1 hadoop hadoopgrp 1049 Feb 20 2014 zkCli.cmd
-rwxr-xr-x 1 hadoop hadoopgrp 1534 Feb 20 2014 zkCli.sh
-rwxr-xr-x 1 hadoop hadoopgrp 1333 Feb 20 2014 zkEnv.cmd
-rwxr-xr-x 1 hadoop hadoopgrp 2696 Feb 20 2014 zkEnv.sh
-rwxr-xr-x 1 hadoop hadoopgrp 1084 Feb 20 2014 zkServer.cmd
-rwxr-xr-x 1 hadoop hadoopgrp 5742 Feb 20 2014 zkServer.sh
-rw-r–r– 1 hadoop hadoopgrp 37269 Sep 21 08:03 zookeeper.out
执行脚本 ./zkServer.sh start 即启动,必须73和74都启动,要不没用。zookeeper.out是日志,zookeeper目录下没有自带logs这个目录记录日志的,日志都统一记录在bin下的zookeeper.out
启动我们可以用status参数查看机器信息。
这台是fllower,那另外一台肯定就是leader了。好了,zookeeper做到这步就算完成了,下面开始进入重点,搞hadoop了。
七,安装Hadoop,并使用用zkfc实现namenode的HA
1.当然第一步还是下载
在/tmp,使用hadoop用户身份,wget http://apache.fayea.com/hadoop/core/hadoop-2.7.1/hadoop-2.7.1.tar.gz 。
2. tar zxvf hadoop-2.7.1.tar.gz 解压并且移动hadoop到相应位置。
mv hadoop-2.7.1 /home/hadoop/hadoop
3.修改配置文件,这步是重点哦,因为时间关系,我就不针对每个配置文件的选项一一说明了,我只贴出我的配置,有兴趣的可以在官网看文档了解具体配置的意思。
4.hadoop需要修改的配置文件如下,当然你们也可以保留原名即软件+版本号的方式,
我的环境下就是/home/hadoop/hadoop-2.7.1
/home/hadoop/hadoop/etc/hadoop/hadoop-env.sh 关于hadoop环境变量配置
/home/hadoop/hadoop/etc/hadoop/yarn-env.sh 关于yarn环境变量的配置
/home/hadoop/hadoop/etc/hadoop/slaves datanode的信息主要记录在这里
/home/hadoop/hadoop/etc/hadoop/core-site.xml hadoop核心配置文件
/home/hadoop/hadoop/etc/hadoop/hdfs-site.xml hfs配置文件
/home/hadoop/hadoop/etc/hadoop/mapred-site.xml mapreduce配置文件
/home/hadoop/hadoop/etc/hadoop/yarn-site.xml yarn配置文件
注:配置文件里面涉及部分数据存储的目录和端口,大家可以按照你们的需求定义,不一定要抄我的。我的是仅供参考。为了节省页面,我会将前面带#的和空行过滤掉。
/home/hadoop/hadoop/etc/hadoop/hadoop-env.sh
source /home/hadoop/.bashrc
export JAVA_HOME=/jdk
export HADOOP_HOME=/home/hadoop/hadoop-2.7.1
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.7.1
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-“/etc/hadoop”}
for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do
if [ “$HADOOP_CLASSPATH” ]; then
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
else
export HADOOP_CLASSPATH=$f
fi
done
export HADOOP_OPTS=”$HADOOP_OPTS -Djava.net.preferIPv4Stack=true”
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 HADOOP_SECONDARYNAMENODE_OPTS=”-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS”
export HADOOP_NFS3_OPTS=”$HADOOP_NFS3_OPTS”
export HADOOP_PORTMAP_OPTS=”-Xmx512m $HADOOP_PORTMAP_OPTS”
export HADOOP_CLIENT_OPTS=”-Xmx512m $HADOOP_CLIENT_OPTS”
export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}
export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_IDENT_STRING=$USER
/home/hadoop/hadoop/etc/hadoop/yarn-env.sh
export HADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}
export YARN_CONF_DIR=”${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}”
export JAVA_HOME=/jdk
if [ “$JAVA_HOME” != “” ]; then
#echo “run java in $JAVA_HOME”
JAVA_HOME=$JAVA_HOME
fi
if [ “$JAVA_HOME” = “” ]; then
echo “Error: JAVA_HOME is not set.”
exit 1
fi
JAVA=$JAVA_HOME/bin/java
JAVA_HEAP_MAX=-Xmx1000m
if [ “$YARN_HEAPSIZE” != “” ]; then
JAVA_HEAP_MAX=”-Xmx””$YARN_HEAPSIZE””m”
fi
IFS=
if [ “$YARN_LOG_DIR” = “” ]; then
YARN_LOG_DIR=”$HADOOP_YARN_HOME/logs”
fi
if [ “$YARN_LOGFILE” = “” ]; then
YARN_LOGFILE=’yarn.log’
fi
if [ “$YARN_POLICYFILE” = “” ]; then
YARN_POLICYFILE=”hadoop-policy.xml”
fi
unset IFS
YARN_OPTS=”$YARN_OPTS -Dhadoop.log.dir=$YARN_LOG_DIR”
YARN_OPTS=”$YARN_OPTS -Dyarn.log.dir=$YARN_LOG_DIR”
YARN_OPTS=”$YARN_OPTS -Dhadoop.log.file=$YARN_LOGFILE”
YARN_OPTS=”$YARN_OPTS -Dyarn.log.file=$YARN_LOGFILE”
YARN_OPTS=”$YARN_OPTS -Dyarn.home.dir=$YARN_COMMON_HOME”
YARN_OPTS=”$YARN_OPTS -Dyarn.id.str=$YARN_IDENT_STRING”
YARN_OPTS=”$YARN_OPTS -Dhadoop.root.logger=${YARN_ROOT_LOGGER:-INFO,console}”
YARN_OPTS=”$YARN_OPTS -Dyarn.root.logger=${YARN_ROOT_LOGGER:-INFO,console}”
if [ “x$JAVA_LIBRARY_PATH” != “x” ]; then
YARN_OPTS=”$YARN_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH”
fi
YARN_OPTS=”$YARN_OPTS -Dyarn.policy.file=$YARN_POLICYFILE”
/home/hadoop/hadoop/etc/hadoop/slaves
datanode76
datanode77
/home/hadoop/hadoop/etc/hadoop/core-site.xml
(core-site中需要使用ha.zookeeper.quorum设置ZooKeeper服务器节点。另外fs.defaultFS需要设置成HDFS的逻辑服务名(需与hdfs-site.xml中的dfs.nameservices一致)
<?xml version=”1.0″ encoding=”UTF-8″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
<!–
Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
–>
<!– Put site-specific property overrides in this file. –>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://masters</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hdfs/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>namenodem:2181,namenodes:2181</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>4320</value>
</property>
</configuration>
/home/hadoop/hadoop/etc/hadoop/hdfs-site.xml (下面红字摘录于网络,是具体的配置说明)
dfs.nameservices —– HDFS NN的逻辑名称,使用上面设置的masters
dfs.ha.namenodes.masters —– 给定服务逻辑名称masters的节点列表
dfs.journalnode.edits.dir —– JournalNode 所在节点上的一个目录,用于存放 editlog 和其他状态信息。
dfs.ha.automatic-failover.enabled —– 启动自动failover。自动failover依赖于zookeeper集群和ZKFailoverController(ZKFC),后者是一个zookeeper客户端,用来监控NN的状态信息。每个运行NN的节点必须要运行一个zkfc。
zkfs提供了下面的功能:
Health monitoring zkfc定期对本地的NN发起health-check的命令,如果NN正确返回,那么这个NN被认为是OK的。否则被认为是失效节点。
ZooKeeper session management 当本地NN是健康的时候,zkfc将会在zk中持有一个session。如果本地NN又正好是active的,那么zkfc还有持有一个”ephemeral”的节点作为锁,一旦本 地NN失效了,那么这个节点将会被自动删除。
ZooKeeper-based election 如果本地NN是健康的,并且zkfc发现没有其他的NN持有那个独占锁。那么他将试图去获取该锁,一旦成功,那么它就需要执行Failover,然后成为active的NN节点。Failover的过程是:第一步,对之前的NN执行fence,如果需要的话。第二步,将本地NN转换到active状态。
启动zkfc的方法如下:hadoop-daemon.sh start zkfc。通过start-dfs.sh会自动启动该进程,一般无需手动起停。
dfs.client.failover.proxy.provider.myhadoop —– 客户端与 active NameNode 进行交互的 Java 实现类,DFS 客户端通过该类寻找当前的active NN。
dfs.ha.fencing.methods —– 解决HA集群脑裂问题(即出现两个 master 同时对外提供服务,导致系统处于不一致状态)。在 HDFS HA中,JournalNode 只允许一个 NameNode 写数据,不会出现两个 active NameNode 的问题,
但是,当主备切换时,之前的 active NameNode 可能仍在处理客户端的 RPC 请求,为此,需要增加隔离机制(fencing)将之前的 active NameNode 杀死。常用的fence方法是sshfence,要指定ssh通讯使用的密钥dfs.ha.fencing.ssh.private-key-files和连接超时时间。
<?xml version=”1.0″ encoding=”UTF-8″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
<!–
Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
–>
<!– Put site-specific property overrides in this file. –>
<configuration>
<property>
<name>dfs.nameservices</name>
<value>masters</value>
</property>
<property>
<name>dfs.ha.namenodes.masters</name>
<value>nnmaster,nnslave</value>
</property>
<property>
<name>dfs.namenode.rpc-address.masters.nnmaster</name>
<value>namenodem:50090</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.nnmaster</name>
<value>namenodem:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.masters.nnslave</name>
<value>namenodes:50090</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.nnslave</name>
<value>namenodes:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://namenodem:8485;namenodes:8485/masters</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hdfs/journal</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data/hdfs/data</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>60</value>
<description>Determines datanode heartbeat interval in seconds.</description>
</property>
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>86400000</value>
</property>
</configuration>
/home/hadoop/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx4096m</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx4096M -XX:-UseGCOverheadLimit</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx4096M -XX:-UseGCOverheadLimit</value>
</property>
<property>
<name>mapreduce.map.cpu.vcores</name>
<value>1</value>
</property>
<property>
<name>mapreduce.reduce.cpu.vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<name>mapreduce.map.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some map tasks
may be executed in parallel.</description>
</property>
<property>
<name>mapreduce.reduce.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some reduce tasks
may be executed in parallel.</description>
</property>
<property>
<name>mapreduce.job.userlog.retain.hours</name>
<value>24</value>
<description>The maximum time, in hours, for which the user-logs are to be
retained after the job completion.
</description>
</property>
<property>
<name>mapreduce.jobtracker.handler.count</name>
<value>25</value>
<description>
The number of server threads for the JobTracker. This should be roughly
4% of the number of tasktracker nodes.
</description>
</property>
<property>
<name>mapreduce.jobtracker.heartbeats.in.second</name>
<value>100</value>
<description>Expert: Approximate number of heart-beats that could arrive
at JobTracker in a second. Assuming each RPC can be processed
in 10msec, the default value is made 100 RPCs in a second.
</description>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/mr-history/tmp</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/mr-history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>namenodem:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>namenodem:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.cleaner.interval-ms</name>
<value>86400000</value>
</property>
<property>
<name>mapreduce.jobhistory.max-age-ms</name>
<value>604800000</value>
</property>
</configuration>
/home/hadoop/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<!– Site specific YARN configuration properties –>
<!–
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>RM_HA_ID</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>namenodem</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>namenodes</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>namenodem:2181,namenodes:2181</value>
</property>
–>
<property>
<name>yarn.resourcemanager.address</name>
<value>namenodem:7080</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>namenodem:7081</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>namenodem:7082</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>64</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>49152</value>
</property>
<!–hopc.yarn.nodemanager.resource.memory-mb.start–>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>49152</value>
</property>
<!–hopc.yarn.nodemanager.resource.memory-mb.end–>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>100</value>
</property>
<!–hopc.yarn.nodemanager.resource.cpu-vcores.start–>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>10</value>
</property>
<!–hopc.yarn.nodemanager.resource.cpu-vcores.end–>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/hdfs/yarn/userlogs</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>mapred.job.history.server.embedded</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>86400</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>namenodem:7001</value>
</property>
</configuration>
配置文件就按照上面的,然后73 namenodem的hadoop就配置完成了,然后需要将hadoop打包好分发到另外三台机器,直接scp -r
做完上述的步骤,那么恭喜你,hadoop基础环境差不多完成了。
5.初始化namenodem,
执行命令 ./hdfs namenode -format (执行前先确定journalnode是否已经启动,启动方式hadoop-daemon.sh start journalnode)
第一次启动格式化HDFS。 格式化HDFS的过程中,HA会journalnode通讯,所以需要先把namenodem和namenodes这两个节点的journalnode启动。
没有任何报错,就代表成功,假如存在报错,请看错误提示修改完再初始化,我就因为主机名的问题遇到报错,也曾因为部分目录不存在或者权限有问题产生报错,总之,跟着输出走就对了,报错关键字都狠明显。
下面这个报错最耗费我时间,原来是hadoop的classpath错了,执行命令./hadoop classpath才分析出。
6. hdfs zkfc -formatZK初始化zkfc。(namenode之间的HA实现)
出现如下代码为正常:
15/09/22 07:41:19 INFO zookeeper.ClientCnxn: Opening socket connection to server namenodem/10.20.122.73:2181. Will not attempt to authenticate using SASL (unknown error)
15/09/22 07:41:19 INFO zookeeper.ClientCnxn: Socket connection established to namenodem/10.20.122.73:2181, initiating session
15/09/22 07:41:19 INFO zookeeper.ClientCnxn: Session establishment complete on server namenodem/10.20.122.73:2181, sessionid = 0x14fe4ef1f48000b, negotiated timeout = 5000
15/09/22 07:41:19 INFO ha.ActiveStandbyElector: Session connected.
15/09/22 07:41:19 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/masters in ZK.
完成后要启动hadoop了,在hadoop的sbin目录下执行start-dfs.sh 启动。无报错即成功。
7.验证hadoop是否安装成功。首先没有错误的输出,其次到每台机器的hadoop/logs目录下看具体需要启动的进程日志看看是否存在报错,INFO级别表示正常,输出ERROR就需要注意了,看清楚错误提示再修改,然后重启。日志确定正常后,然后每台机器用hadoop用户执行jps命令看看对应的服务有没有起来。
namenode 正常节点记录
datanode正常节点记录
然后重点来了,访问web看看hadoop是否起来有记录了。
在浏览器中输入 http://10.20.122.73:50070/dfshealth.html 进入页面表示成功(这里可以看出namenode的HA起作用了,状态为active,那122.74就是standby的状态了)。
题外话,虽然做了HA会自动切换,当然也少不了手动切换的命令,一般很少使用./hdfs haadmin -transitionToActive namenodem。
在浏览器中输入 http://10.20.122:73:8088/cluster 进入页面表示yarn安装成功
假如在8088那个页面点nodes看不到datanode的机器,可能是hadoop的yarn服务没起或者有问题导致。请自行查看log分析。
yarn这个服务很重要,贯穿hadoop集群中的每一台机器,在namenode中角色为:ResourceManager 在datanode中角色为:NodeManager
八,安装数据仓库hive
hive可以理解为mysql的数据仓库,上面可以执行sql的语句,而tez,mapreduce大家应该都知道,他是hadoop的计算框架,而tez的出现是要取代mapreduce的,而tez和mapreduce可以自由配置切换。这样有利于提高效率。
1.先在本地安装mysql,安装mysql的过程我就省略了。安装完后查看mysql的配置文件,把bind-address = 127.0.0.1这行注释掉,重启。(这个是经验,因为我之前没这样配置,搞到hive无法通过主机名连接mysql)
2.来到这步,mysql你应该装好了,配置好了,并且已经启动了。现在需要创建hive的数据库,
create databse hive 创建库
创建完数据库之后需要新建一个基于hive的用户并且赋予权限让他可以访问mysql,增删改查。
insert into mysql.user(Host,User,Password) values(“namenodes”,”hadoop”,password(“hadoop”));
grant all on hive.* to hive@’%’ identified by ‘hadoop';
grant all on hive.* to hive@’localhost’ identified by ‘hadoop';
flush privileges;
3.测试是否可以登录操作,mysql -hnamenodes -uhadoop -phadoop hive
出现上图即表示成功。
4.下载hive,我这里用的是1.2.1版本。并且解压到/home/hadoop目录下面。
5.添加环境变量(其实这步不加也行,那就执行命令都必须要到hive/bin下面执行)
vi .basic
写入下面的环境变量
export HIVE_HOME=/home/hadoop/hive (在这之前我做了一个连接,为了好看 ln -s hive-1.2.1 hive)
export PATH=$PATH:$HIVE_HOME/bin
最后source .bashrc使其生效
6.进入hive/conf下修改配置文件
先 cp hive-default.xml.template hive-site.xml
配置文件很长,内容很乱,但是修改点不多,我说说几个需要修改的地方。
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://namenodes:3306/hive?createDatabaseIfNotExist=true</value> //这里定义了访问mysql数据库的连接,连接主机namenodes的基于端口3306的mysql中的hive库
<description>JDBC connect string for a JDBC metastore</description>
</property><property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value> //访问的接口方式,jdbc
<description>Driver class name for a JDBC metastore</description>
</property><property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hadoop</value>// mysql用户名
<description>username to use against metastore database</description>
</property><property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hadoop</value> //mysql密码
<description>password to use against metastore database</description>
</property>
还有一些存放数据的路径使用默认就可以了,当然你也可以按照自己的需求修改,终于明白为什么修改配置文件前一定要先建用户和建数据库了把。
7.拷贝实现相关功能的jar包
拷贝mysql-connector-java-5.1.6-bin.jar 到hive 的lib下面 (这个包自行在网上下载)
mv /home/Desktop/mysql-connector-java-5.1.6-bin.jar /home/hadoop/hive/lib/
把jline-2.12.jar拷贝到hadoop相应的目录下
cp /home/hadoop/hive/lib/jline-2.12.jar /home/hadoop/hadoop-2.7.1/share/hadoop/yarn/lib/
8. 执行命令hive测试,可以执行sql语句为安装成功。如下图:
注意:MYSQL数据库的编码必须是latin才可以
温馨提醒:hive的日志路径默认是/tmp/用户名/hive.log 如果想修改路径请配置conf下hive-log4j.properties.template文件
测试输入 show database;
hive> show databases;
OK
9.hive的使用:先在hive中创建一个表,然后新建一个txt文件,然后将txt文件中的数据导入hive新建的表中。
hadoop@namenodes:~/hive$ vi 1.txt (以tab键分隔)
1 2 3
4 5 6
7 8 9
在hive中执行:
CREATE TABLE test (a int, b int, c int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t'; 创建表
LOAD DATA LOCAL INPATH ‘/home/hadoop/hive/1.txt’ OVERWRITE INTO TABLE test; 导入数据
SELECT * FROM test; 查看导入是否成功,是否存在数据
测试结果如下图:
以上是关于hadoop+zookeeper+hive+HA集群部署笔记的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop学习笔记-009-CentOS_6.5_64_HA高可用-Hadoop2.6+Zookeeper3.4.5安装Hive1.1.0