hadoop+zookeeper+hive+HA集群部署笔记

Posted 进击的大杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop+zookeeper+hive+HA集群部署笔记相关的知识,希望对你有一定的参考价值。

hadoop+zookeeper+hive+HA集群部署笔记


说明一下:这个架构支持namenode多节点,保证了namenode的高可用,因此更大可能的保持了元数据的完整。(- -  namenodehadoop的心脏)

 

环境: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

在这里可以理解zookeeperHA,主要是用于namenode高可用,因此可以理解成有主从的leaderflower关系。为什么要这样?因为hadoop集成环境中最重要的就是nematodenematode挂了,这个集群也就挂了。

当然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分别为12,当然,你在这里直接写IP也可以,不过主机名比较直观,这就是为什么一开始要搞主机名的原因,下面还有很多配置都需要用到主机名。

好了,那么问题来了,假如73 namenodem74 namenodes zookeeper配置都一样,那么他们怎么互相区别呢?

设置myid,创建文件/home/hadoop/zookeeper/data/myid 里面写上你zoo.cfg配置文件里面的server id,即731742

配置完了,要启动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-rr– 1 hadoop hadoopgrp 37269 Sep 21 08:03 zookeeper.out

执行脚本 ./zkServer.sh start  即启动,必须7374都启动,要不没用。zookeeper.out是日志,zookeeper目录下没有自带logs这个目录记录日志的,日志都统一记录在bin下的zookeeper.out

启动我们可以用status参数查看机器信息。


这台是fllower,那另外一台肯定就是leader了。好了,zookeeper做到这步就算完成了,下面开始进入重点,搞hadoop了。

七,安装Hadoop,并使用用zkfc实现namenodeHA

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集群和ZKFailoverControllerZKFC),后者是一个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,然后成为activeNN节点。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 namenodemhadoop就配置完成了,然后需要将hadoop打包好分发到另外三台机器,直接scp -r

做完上述的步骤,那么恭喜你,hadoop基础环境差不多完成了。

5.初始化namenodem

执行命令 ./hdfs namenode -format (执行前先确定journalnode是否已经启动,启动方式hadoop-daemon.sh start journalnode

第一次启动格式化HDFS 格式化HDFS的过程中,HAjournalnode通讯,所以需要先把namenodemnamenodes这两个节点的journalnode启动。

没有任何报错,就代表成功,假如存在报错,请看错误提示修改完再初始化,我就因为主机名的问题遇到报错,也曾因为部分目录不存在或者权限有问题产生报错,总之,跟着输出走就对了,报错关键字都狠明显。

下面这个报错最耗费我时间,原来是hadoopclasspath错了,执行命令./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了,在hadoopsbin目录下执行start-dfs.sh 启动。无报错即成功。

7.验证hadoop是否安装成功。首先没有错误的输出,其次到每台机器的hadoop/logs目录下看具体需要启动的进程日志看看是否存在报错,INFO级别表示正常,输出ERROR就需要注意了,看清楚错误提示再修改,然后重启。日志确定正常后,然后每台机器用hadoop用户执行jps命令看看对应的服务有没有起来。

namenode 正常节点记录


datanode正常节点记录


然后重点来了,访问web看看hadoop是否起来有记录了。

在浏览器中输入 http://10.20.122.73:50070/dfshealth.html 进入页面表示成功(这里可以看出namenodeHA起作用了,状态为active,那122.74就是standby的状态了)

题外话,虽然做了HA会自动切换,当然也少不了手动切换的命令,一般很少使用./hdfs haadmin -transitionToActive namenodem


在浏览器中输入 http://10.20.122:73:8088/cluster 进入页面表示yarn安装成功

假如在8088那个页面点nodes看不到datanode的机器,可能是hadoopyarn服务没起或者有问题导致。请自行查看log分析。

yarn这个服务很重要,贯穿hadoop集群中的每一台机器,在namenode中角色为:ResourceManager  datanode中角色为:NodeManager  


八,安装数据仓库hive

hive可以理解为mysql的数据仓库,上面可以执行sql的语句,而tezmapreduce大家应该都知道,他是hadoop的计算框架,而tez的出现是要取代mapreduce的,而tezmapreduce可以自由配置切换。这样有利于提高效率。

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的基于端口3306mysql中的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  如果想修改路径请配置confhive-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

spark(HA)集群安装,算子,及与hive交互

大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集

Hadoop分布式集群实战

hadoop全家桶系列1-zookeeper

Hadoop HA + HBase环境搭建————zookeeper和hadoop环境搭建