这篇博客是接着《高可用Hadoop平台》系列讲,本篇博客是为后面用 Hive 来作数据统计作准备的,介绍如何在 Hadoop HA 平台下集成高可用的 Hive 工具,下面我打算分如下流程来赘述:html
下面开始进行环境准备。java
Hive版本:《Hive-0.14》mysql
HAProxy版本:《HAProxy-1.5.11》linux
注:前提是 Hadoop 的集群已经搭建完成,若还没用完成集群搭建,能够参考《配置高可用的Hadoop平台》redis
须要安装的工具,咱们已经准备好了,接下来给出 Hive 搭建的结构图,以下图所示:算法
这里因为集群资源有限,因此将 HAProxy1 配置在 NNA 节点,HAProxy2 配置在 NNS 节点,Hive1,Hive2,Hive3分别配置在 DN1,DN2,DN3 节点。以下表所示:sql
服务器 | 角色 |
NNA | HAProxy1 |
NNS | HAProxy2 |
DN1 | Hive1 |
DN2 | Hive2 |
DN3 | Hive3 |
咱们将下载好的 Hive 安装包和 HAProxy 安装包用 scp 命令,参考上表格分别分发到对应的节点。数据库
注:hive 指定的 HDFS 必须是相同的,不然,统计的数据源不一样,那么统计是没有意义的。apache
HAProxy 是一款提供高可用性、负载均衡以及基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,HAProxy 是彻底免费的、借助 HAProxy 能够快速而且可靠的提供基于TCP 和 HTTP 应用的代理解决方案。HAProxy 在这里的做用起一个代理功能,让 Hive Server 负载均衡;这里咱们分别在 NNA 和 NNS 节点都搭建 HAProxy ,是为了防止一个 HAProxy 代理容易引起单点问题。考虑到高可用性,这里咱们多用一个节点来承担相似于 HDFS HA 方案中的 standby 角色。后端
首先,在 NNA 和 NNS 节点搭建 HAProxy 工具,这里咱们须要先检查下系统环境,由于 HAProxy 工具包须要编译安装。这里咱们安装必要的依赖组建,命令以下所示:
# 安装 gcc 组件 [hadoop@nna]$ sudo yum -y install gcc* # 安装 SSL [hadoop@nna]$ sudo yum -y install openssl-devel pcre-devel
而后,解压并进入到 haproxy 目录文件中,命令以下:
[hadoop@nna]$ tar -zxvf haproxy-1.5.11.tar.gz && cd haproxy-1.5.11
接着,咱们开始编译安装 haproxy 组件,命令以下所示:
[hadoop@nna]$ make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 [hadoop@nna]$ make install
安装完成后,咱们输入以下命令,看是否安装成功。
[hadoop@nna]$./haproxy -vv
若现实以下信息,即表示安装成功。内容以下:
HA-Proxy version 1.5.11 2015/01/31 Copyright 2000-2015 Willy Tarreau <w@1wt.eu> Build options : TARGET = linux26 CPU = generic CC = gcc CFLAGS = -O2 -g -fno-strict-aliasing OPTIONS = Default settings : maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200 Encrypted password support via crypt(3): yes Built without zlib support (USE_ZLIB not set) Compression algorithms supported : identity Built without OpenSSL support (USE_OPENSSL not set) Built without PCRE support (using libc's regex instead) Built with transparent proxy support using: IP_TRANSPARENT IP_FREEBIND Available polling systems : epoll : pref=300, test result OK poll : pref=200, test result OK select : pref=150, test result OK Total: 3 (3 usable), will use epoll.
在 haproxy 目录下,咱们新建一个 config.cfg 的配置文件,填写以下内容:
global daemon nbproc 1 defaults mode tcp #mode { tcp|http|health },tcp 表示4层,http表示7层,health仅做为健康检查使用 retries 2 #尝试2次失败则从集群摘除 option redispatch #若是失效则强制转换其余服务器 option abortonclose #链接数过大自动关闭 maxconn 1024 #最大链接数 timeout connect 1d #链接超时时间,重要,hive查询数据能返回结果的保证 timeout client 1d #同上 timeout server 1d #同上 timeout check 2000 #健康检查时间 log 127.0.0.1 local0 err #[err warning info debug] listen admin_stats #定义管理界面 bind 0.0.0.0:1090 #管理界面访问IP和端口 mode http #管理界面所使用的协议 maxconn 10 #最大链接数 stats refresh 30s #30秒自动刷新 stats uri / #访问url stats realm Hive\ Haproxy #验证窗口提示 stats auth admin:123456 #401验证用户名密码 listen hive #hive后端定义 bind 0.0.0.0:10001 #ha做为proxy所绑定的IP和端口 mode tcp #以4层方式代理,重要 balance leastconn #调度算法 'leastconn' 最少链接数分配,或者 'roundrobin',轮询分配 maxconn 1024 #最大链接数 server hive_1 10.211.55.18:10000 check inter 180000 rise 1 fall 2 server hive_2 10.211.55.15:10000 check inter 180000 rise 1 fall 2 server hive_3 10.211.55.17:10000 check inter 180000 rise 1 fall 2 #释义:server 主机代名(你本身能看懂就行),IP:端口 每180000毫秒检查一次。也就是三分钟。 #hive每有10000端口的请求就会建立一个log,设置短了,/tmp下面会有无数个log文件,删不完。
接着,咱们在 NNS 也作相同的操做,搭建 HAProxy。
在 DN1 节点上,咱们先配置 Hive 的环境变量,配置内容以下:
export HIVE_HOME=/home/hadoop/hive-0.14.0-bin export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZK_HOME/bin:$HIVE_HOME/bin
接着,咱们配置3个重要文件。
hive-env.sh
# Set HADOOP_HOME to point to a specific hadoop install directory HADOOP_HOME=/home/hadoop/hadoop-2.6.0
hive-log4j.properties
# Define some default values that can be overridden by system properties hive.log.threshold=ALL hive.root.logger=INFO,DRFA hive.log.dir=/home/hadoop/logs/hive hive.log.file=hive.log
hive-site.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>datanucleus.fixedDatastore</name> <value>false</value> </property> <property> <name>hive.metastore.execute.setugi</name> <value>true</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/home/hive/warehouse</value> <description>location of default database for the warehouse </description> </property> <!-- metadata database connection configuration --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://10.211.55.26:3306/hive?useUnicode=true&characterEncoding=UTF-8&createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>password to use against metastore database</description> </property> </configuration>
注:因为我这里配置的 Hive 元数据仓库地址是 Mysql ,因此咱们在启动 Hive 以前,得将 Mysql 的驱动包放到 Hive 目录的 lib 文件夹下。
而后,在 DN2 和 DN3 节点作相同的操做。
这里,咱们先启动 Hive 的第三方服务,命令以下所示:
[hadoop@dn1]$hive --service hiveserver &
注:DN1,DN2 和 DN3 节点都须要启动该服务。
在 hive 的服务成功启动后,咱们在到 NNA 和 NNS 节点分别启动 HAProxy 代理服务,命令以下所示:
[hadoop@nna haproxy-1.5.11]$ ./haproxy -f config.cfg
到这里,若是没有出错,整个高可用的 Hive 工具就搭建完成了。
如果咱们在搭建的过程当中遇到异常怎么办?首先,咱们来逐个排查,咱们先启动 hive 服务,如果在启动中报错,或是一直卡在启动中,我能够到 hive 的启动日志中查看具体缘由,根据抛出的异常,咱们作对应的处理就能够了;其次,在启动 haproxy 服务时,如果出现异常,咱们根据它报错的信息,作对应的处理便可。要冷静,莫慌!
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user 'root'@'dn1' to database 'metastore'
这是由于mysql数据库用户root 的权限不足,赋予权限
grant all on metastore.* to 'root'@'dn1' identified by 'root';
flush privileges;
搭建好平台后,咱们得验证平台是否可用,下面,咱们用 Java API 来验证其 HA 是否可用。下面是写得一个测试代码,用来测试平台是否可用,代码表达的意图是:建立表,而后显示表结构。代码以下所示:
/** * */ package cn.hdfs.hive.example; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** * @author dengjie * @date 2015年3月26日 * @description 提供一个JDBC访问hive的原型,若用在实际业务中,可拓展该类。 */ public class HiveVisit { static { // 注册jdbc驱动 try { Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 设置 NNA 和 NNS 的链接信息 private static String[] url = new String[] { "jdbc:hive://10.211.55.29:10001/default", "jdbc:hive://10.211.55.26:10001/default" }; public static void main(String[] args) throws Exception { System.setProperty("hadoop.home.dir", "/Users/dengjie/HDFS/hadoop-2.5.1"); Connection conn = null; for (int i = 0; i < url.length; i++) { try { // 建立链接 conn = DriverManager.getConnection(url[i], "", ""); if (!conn.isClosed()) {// 链接成功,即返回链接对象 break; } } catch (Exception ex) { ex.printStackTrace(); } } Statement st = conn.createStatement(); String tableName = "stu"; // 删除表 st.executeQuery("drop table " + tableName); // 建立表 ResultSet rs = st.executeQuery("create table " + tableName + "(" + "id string," + "name string," + "sex string" + ")" + "row format delimited " + "fields terminated by ',' " + "stored as textfile"); // 显示全部的表 String sql = "show tables"; System.out.println("running:" + sql); rs = st.executeQuery(sql); if (rs.next()) { System.out.println(rs.getString(1)); } // 获得表信息 sql = "describe " + tableName; System.out.println("running:" + sql); rs = st.executeQuery(sql); while (rs.next()) { System.out.println(rs.getString(1) + "\t" + rs.getString(2)); } // 关闭资源 rs.close(); st.close(); conn.close(); } }
结果展现,内容以下:
running:show tables
stu
running:describe stu
id string
name string
sex string
这篇博客就和你们分享到这里,若在研究的过程中有什么问题,能够加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!