高可用Hadoop平台-集成Hive HAProxy
1.概述
这篇博客是接着《高可用Hadoop平台》系列讲,本篇博客是为后面用 Hive 来做数据统计做准备的,介绍如何在 Hadoop HA 平台下集成高可用的 Hive 工具,下面我打算分以下流程来赘述:
- 环境准备
- 集成并配置 Hive 工具
- 使用 Java API 开发 Hive 代码
下面开始进行环境准备。
2.环境准备
Hive版本:《Hive-0.14》
HAProxy版本:《HAProxy-1.5.11》
注:前提是 Hadoop 的集群已经搭建完成,若还没用完成集群搭建,可以参考《配置高可用的Hadoop平台》
需要安装的工具,我们已经准备好了,接下来给出 Hive 搭建的结构图,如下图所示:
这里由于集群资源有限,所以将 HAProxy1 配置在 NNA 节点,HAProxy2 配置在 NNS 节点,Hive1,Hive2,Hive3分别配置在 DN1,DN2,DN3 节点。如下表所示:
服务器 | 角色 |
NNA | HAProxy1 |
NNS | HAProxy2 |
DN1 | Hive1 |
DN2 | Hive2 |
DN3 | Hive3 |
我们将下载好的 Hive 安装包和 HAProxy 安装包用 scp 命令,参考上表格分别分发到对应的节点。
注:hive 指定的 HDFS 必须是相同的,否则,统计的数据源不同,那么统计是没有意义的。
3.集成并配置 Hive 工具
HAProxy 是一款提供高可用性、负载均衡以及基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,HAProxy 是完全免费的、借助 HAProxy 可以快速并且可靠的提供基于TCP 和 HTTP 应用的代理解决方案。HAProxy 在这里的作用起一个代理功能,让 Hive Server 负载均衡;这里我们分别在 NNA 和 NNS 节点都搭建 HAProxy ,是为了防止一个 HAProxy 代理容易引发单点问题。考虑到高可用性,这里我们多用一个节点来承担类似于 HDFS HA 方案中的 standby 角色。
3.1系统环境
首先,在 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..tar.gz && cd haproxy-1.5.
接着,我们开始编译安装 haproxy 组件,命令如下所示:
- [hadoop@nna]$ make TARGET=linux2628 USE_PCRE= USE_OPENSSL= USE_ZLIB= USE_CRYPT_H= USE_LIBCRYPT=
- [hadoop@nna]$ make install
安装完成后,我们输入如下命令,看是否安装成功。
- [hadoop@nna]$./haproxy -vv
若现实如下信息,即表示安装成功。内容如下:
- HA-Proxy version 1.5. //
- Copyright - Willy Tarreau <w@1wt.eu>
- Build options :
- TARGET = linux26
- CPU = generic
- CC = gcc
- CFLAGS = -O2 -g -fno-strict-aliasing
- OPTIONS =
- Default settings :
- maxconn = , bufsize = , maxrewrite = , maxpollevents =
- Encrypted password support via crypt(): 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=, test result OK
- poll : pref=, test result OK
- select : pref=, test result OK
- Total: ( usable), will use epoll.
3.2配置 HAProxy
在 haproxy 目录下,我们新建一个 config.cfg 的配置文件,填写如下内容:
- global
- daemon
- nbproc
- defaults
- mode tcp #mode { tcp|http|health },tcp 表示4层,http表示7层,health仅作为健康检查使用
- retries #尝试2次失败则从集群摘除
- option redispatch #如果失效则强制转换其他服务器
- option abortonclose #连接数过大自动关闭
- maxconn #最大连接数
- timeout connect 1d #连接超时时间,重要,hive查询数据能返回结果的保证
- timeout client 1d #同上
- timeout server 1d #同上
- timeout check #健康检查时间
- log 127.0.0.1 local0 err #[err warning info debug]
- listen admin_stats #定义管理界面
- bind 0.0.0.0: #管理界面访问IP和端口
- mode http #管理界面所使用的协议
- maxconn #最大连接数
- stats refresh 30s #30秒自动刷新
- stats uri / #访问url
- stats realm Hive\ Haproxy #验证窗口提示
- stats auth admin: #401验证用户名密码
- listen hive #hive后端定义
- bind 0.0.0.0: #ha作为proxy所绑定的IP和端口
- mode tcp #以4层方式代理,重要
- balance leastconn #调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询分配
- maxconn #最大连接数
- server hive_1 10.211.55.18: check inter rise fall
- server hive_2 10.211.55.15: check inter rise fall
- server hive_3 10.211.55.17: check inter rise fall
- #释义:server 主机代名(你自己能看懂就行),IP:端口 每180000毫秒检查一次。也就是三分钟。
- #hive每有10000端口的请求就会创建一个log,设置短了,/tmp下面会有无数个log文件,删不完。
接着,我们在 NNS 也做相同的操作,搭建 HAProxy。
3.3搭建 Hive
在 DN1 节点上,我们先配置 Hive 的环境变量,配置内容如下:
- export HIVE_HOME=/home/hadoop/hive-0.14.-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.
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 节点做相同的操作。
3.4启动服务
- 启动 hive 服务
这里,我们先启动 Hive 的第三方服务,命令如下所示:
- [hadoop@dn1]$hive --service hiveserver &
注:DN1,DN2 和 DN3 节点都需要启动该服务。
- 启动代理服务 haproxy
在 hive 的服务成功启动后,我们在到 NNA 和 NNS 节点分别启动 HAProxy 代理服务,命令如下所示:
- [hadoop@nna haproxy-1.5.]$ ./haproxy -f config.cfg
到这里,如果没有出错,整个高可用的 Hive 工具就搭建完成了。
3.5异常
若是我们在搭建的过程中遇到异常怎么办?首先,我们来逐个排查,我们先启动 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;
4.Java API使用
搭建好平台后,我们得验证平台是否可用,下面,我们用 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
5.总结
- 在启动 haproxy 代理服务之前,切记 hive 服务是否正常启动。
- 在启动 hive 服务是,确保 hadoop 集群运行正常。
6.结束语
这篇博客就和大家分享到这里,若在研究的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
高可用Hadoop平台-集成Hive HAProxy的更多相关文章
- 高可用Hadoop平台-实战
1.概述 今天继续<高可用的Hadoop平台>系列,今天开始进行小规模的实战下,前面的准备工作完成后,基本用于统计数据的平台都拥有了,关于导出统计结果的文章留到后面赘述.今天要和大家分享的 ...
- 高可用Hadoop平台-Hue In Hadoop
1.概述 前面一篇博客<高可用Hadoop平台-Ganglia安装部署>,为大家介绍了Ganglia在Hadoop中的集成,今天为大家介绍另一款工具——Hue,该工具功能比较丰富,下面是今 ...
- 高可用Hadoop平台-Oozie工作流之Hadoop调度
1.概述 在<高可用Hadoop平台-Oozie工作流>一篇中,给大家分享了如何去单一的集成Oozie这样一个插件.今天为大家介绍如何去使用Oozie创建相关工作流运行与Hadoop上,已 ...
- 高可用Hadoop平台-实战尾声篇
1.概述 今天这篇博客就是<高可用Hadoop平台>的尾声篇了,从搭建安装到入门运行 Hadoop 版的 HelloWorld(WordCount 可以称的上是 Hadoop 版的 Hel ...
- 高可用Hadoop平台-探索
1.概述 上篇<高可用Hadoop平台-启航>博客已经让我们初步了解了Hadoop平台:接下来,我们对Hadoop做进一步的探索,一步一步的揭开Hadoop的神秘面纱.下面,我们开始赘述今 ...
- 高可用Hadoop平台-启航
1.概述 在上篇博客中,我们搭建了<配置高可用Hadoop平台>,接下来我们就可以驾着Hadoop这艘巨轮在大数据的海洋中遨游了.工欲善其事,必先利其器.是的,没错:我们开发需要有开发工具 ...
- 高可用Hadoop平台-Flume NG实战图解篇
1.概述 今天补充一篇关于Flume的博客,前面在讲解高可用的Hadoop平台的时候遗漏了这篇,本篇博客为大家讲述以下内容: Flume NG简述 单点Flume NG搭建.运行 高可用Flume N ...
- 高可用Hadoop平台-Ganglia安装部署
1.概述 最近,有朋友私密我,Hadoop有什么好的监控工具,其实,Hadoop的监控工具还是蛮多的.今天给大家分享一个老牌监控工具Ganglia,这个在企业用的也算是比较多的,Hadoop对它的兼容 ...
- 高可用Hadoop平台-HBase集群搭建
1.概述 今天补充一篇HBase集群的搭建,这个是高可用系列遗漏的一篇博客,今天抽时间补上,今天给大家介绍的主要内容目录如下所示: 基础软件的准备 HBase介绍 HBase集群搭建 单点问题验证 截 ...
随机推荐
- Ng第十课:应用机器学习的建议(Advice for Applying Machine Learning)
10.1 决定下一步做什么 10.2 评估一个假设 10.3 模型选择和交叉验证集 10.4 诊断偏差和方差 10.5 归一化和偏差/方差 10.6 学习曲线 10.7 决定下一步做什么 ...
- java基础-day30
第07天 MySQL数据库 今日内容介绍 u 多表关系实战练习 u 多表查询 u SQL语句的练习 第1章 多表关系实战练习 1.1 多表关系--实战1--省和市 1.1.1 需求分析 在数据库 ...
- hdu 2688
这题,因为要统计之前有多少个数比当前的数小,所以我用的树状数组 基本代码就是这样,还是比较好想的,只不过我没想出来罢了 #include <iostream> #include <c ...
- 普通用户开放 sudo 权限
大家都知道 linux 每个目录都是有权限的,所以如果要想在此目录下读写,则要有这个目录的权限,或者就是有 sudo 权限,那怎么给普通用户赋予 sudo 权限呢,下面我们来看一下: 1.先用 roo ...
- 冲刺博客NO.4
今天开站立会议时,有一点分歧,原本我认为的隐私保护和其他人认为的不一样,在沟通后这部分功能达成共识. 今天做了什么:组员完成了用户输入部分,信息输入.添加了一些组件和活动完善界面. 遇到的苦难,界面 ...
- [php-cookie] cookie 请求跨域,如何共享
cookie 请求跨域的问题, 假设我有两个域名,一个 m.example.com,另一个是 www.example.com . 那么我需要如何设置 cookie 才可以在这两个域名都实现共享呢? / ...
- 1.Django入门
MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封装 v表示 ...
- delphi控制 word的几种方法--转
对几种方法的难易程度的判别 a.通过Delphi的控件TOleContainer 将Word嵌入 这是最简单的Ole嵌入,能够直接将Word文档调用,只需要使用ToleContainer.Run就可以 ...
- Delphi TStringHelper用法详解
Delphi TStringHelper用法详解 (2013-08-27 22:45:42) 转载▼ 标签: delphi_xe5 it 分类: Delphi Delphi XE4的TStringHe ...
- Asp.Net MVC记住用户登录信息 下次登录无需输入密码
有的时候做网站,就需要记住用户登录信息,下次再登录网站时,不用重复输入用户名和密码,原理是浏览器的cookie把状态给记住了! 那么具体是怎么实现的呢?下面博主将一部分代码贴出来,想要完整版的Demo ...