高可用Hadoop平台-集成Hive HAProxy

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

1.概述

  这篇博客是接着《高可用Hadoop平台》系列讲,本篇博客是为后面用 Hive 来做数据统计做准备的,介绍如何在 Hadoop HA 平台下集成高可用的 Hive 工具,下面我打算分以下流程来赘述:

  1. 环境准备
  2. 集成并配置 Hive 工具
  3. 使用 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.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.
复制代码

3.2配置 HAProxy 

  在 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。

3.3搭建 Hive

  在 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&amp;characterEncoding=UTF-8&amp;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.11]$ ./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.结束语

  这篇博客就和大家分享到这里,若在研究的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

联系方式: 
邮箱:smartloli.org@gmail.com 
Twitter: https://twitter.com/smartloli 
QQ群(Hadoop - 交流社区1): 424769183 
温馨提示:请大家加群的时候写上加群理由(姓名+公司/学校),方便管理员审核,谢谢! 

热爱生活,享受编程,与君共勉!



本文转自哥不是小萝莉博客园博客,原文链接:http://www.cnblogs.com/smartloli/,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
SQL 分布式计算 关系型数据库
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
47 2
|
15天前
|
数据采集 DataWorks 数据管理
DataWorks不是Excel,它是一个数据集成和数据管理平台
【10月更文挑战第10天】随着大数据技术的发展,企业对数据处理的需求日益增长。阿里云推出的DataWorks是一款强大的数据集成和管理平台,提供从数据采集、清洗、加工到应用的一站式解决方案。本文通过电商平台案例,详细介绍了DataWorks的核心功能和优势,展示了如何高效处理大规模数据,帮助企业挖掘数据价值。
58 1
|
18天前
|
SQL 分布式计算 Hadoop
手把手的教你搭建hadoop、hive
手把手的教你搭建hadoop、hive
47 1
|
21天前
|
数据采集 SQL DataWorks
DataWorks不是Excel,它是一个数据集成和数据管理平台
【10月更文挑战第5天】本文通过一家电商平台的案例,详细介绍了阿里云DataWorks在数据处理全流程中的应用。从多源数据采集、清洗加工到分析可视化,DataWorks提供了强大的一站式解决方案,显著提升了数据分析效率和质量。通过具体SQL示例,展示了如何构建高效的数据处理流程,突显了DataWorks相较于传统工具如Excel的优势,为企业决策提供了有力支持。
66 3
|
25天前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
23天前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
43 3
|
23天前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
42 3
|
23天前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
38 2
|
22天前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
61 0
|
2月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。