干货 | Spark SQL 元数据双主高可用方案揭秘

点击上方“中兴开发者社区”,关注我们

每天读一篇一线开发者原创好文

来源 | 中兴大数据


 

开源的Spark SQL并不支持高可用,但实际应用中高可用对于用户意义重大。中兴大数据平台DAP在对应的ZDH中实现了Spark SQL的高可用。


Spark SQL的高可用,是两个Spark SQL服务上线的时候向SQL进行注册,用户连接的JDBC URL指定为Zookeeper的列表,连接的时候会通过Zookeeper集群获取Spark SQL节点信息,然后连接到Spark SQL服务节点。

Spark SQL元数据双主主要是用MySQL实现,MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的索引以跟踪日志循环。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。

在实际项目中,两台分布于异地的主机上安装有MySQL数据库,两台服务器互为主备,当其中一台机器出现故障时,另外一台能够接管服务器上的应用,这就需要两台数据库的数据要实时保持一致,在这里使用MySQL的同步功能实现双机的同步复制。


实现方案


目前SparkSQL节点访问双主的元数据库主要考虑两种方案:

  • SparkSQL节点直接连接MySQL节点:

下图中SparkSQL节点分别连接单个MySQL节点,不同SparkSQL节点对元数据库的更改会在MySQL节点之间进行同步。

  • SparkSQL节点通过MetaStore节点连接元数据库:

下图中SparkSQL节点分别连接多个MetaStore节点,每个MetaStore节点连接对应的MySQL节点,不同SparkSQL节点对元数据库的更改会在MySQL节点之间进行同步。

上面两种SparkSQL节点访问双主的元数据库方案下,客户端获取SparkSQL服务的方式是相同的,主要通过如下方式:

  1. Beeline连接

  2. 程序通过JDBC端口访问

Beeline方式首先通过Zookeeper集群获取SparkSQL节点信息,然后连接到SparkSQL服务节点。当连接的SparkSQL节点异常时,可以通过重试几次获取SparkSQL服务。

程序通过JDBC端口连接到对应的SparkSQL节点的方式下,如果正在连接的SparkSQL节点出现异常,可以通过在代码中进行异常捕获的方式重新获取SparkSQL服务。

下面主要对两种方案的功能可行性以及异常情况进行验证。


测试环境


MySQL:10.43.183.121和10.43.183.122两台主机

SparkSQL: 10.43.183.121和10.43.183.122两台主机

Hive MetaStoreServer: 10.43.183.121和10.43.183.122两台主机


测试场景


  • 场景一:SparkSQL节点直接连接MySQL高可用验证

每个SparkSQL节点直接连接一个MySQL节点。验证元数据能否成功同步以及MySQL节点失效能否自动切换。

测试步骤如下:

1. 修改配置

SparkSQL配置修改如下:

10.43.183.121对应的JDBC连接配置为10.43.183.121上的MySQL

10.43.183.122对应的JDBC连接配置为10.43.183.122上的MySQL

2. Beeline连接10.43.183.121节点的SparkSQL。

3. 创建表test,分别查找两个MySQL的hiveomm数据库的tbls表,可以看到test记录。表明元数据同步成功。

4. 将SparkSQL当前连接的MySQL停掉。

5. Beeline 界面执行“show tables”命令,查询异常。

6. 断开Beeline连接并多次重新连接10.43.183.121节点的SparkSQL,连接异常。

7. 用SQL URL连接SparkSQL服务!connectjdbc:hive2://10.43.183.121:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkThriftServer重试若干次可以连接上SparkSQL服务,通过“show tables”命令可以查到test表。

8. 启动MySQL节点,Beeline重新连接10.43.183.121节点,可以连接到SparkSQL节点。执行“show tables”命令,可以查询到test表信息。

测试结论:

  1. MySQL之间的元数据可以同步。

  2. MySQL节点挂掉会导致Beeline无法查询。

  3. Beeline重新连接无法连接到对应的SparkSQL节点。

  4. Beeline通过SQL URL连接SparkSQL服务,可以在尝试一定次数之后连接到可用的SparkSQL节点。

  • 场景二: SparkSQL节点通过HiveMetaStoreServer节点连接MySQL高可用验证

MetaStoreServer节点主要用于MySQL节点失效时的容错,每个MetaStoreServer节点对应一个MySQL节点,每个SparkSQL节点配置多个MetaStoreServer节点。验证元数据能否成功同步以及MySQL节点失效能否自动切换。

测试步骤如下:

1. 修改配置

MetaStoreServer节点配置修改如下:

10.43.183.121节点的MetaStoreServer配置10.43.183.121节点上的MySQL

10.43.183.122节点的MetaStoreServer配置10.43.183.122节点上的MySQL

SparkSQL添加对应配置:

2. Beeline连接10.43.183.121节点的SparkSQL。

3. 创建表test,分别查找两个MySQL的hiveomm数据库的tbls表,可以看到test记录,表明元数据同步成功。

4. 将SparkSQL当前连接的MetaStoreServer(通过日志看到)对应的MySQL停掉。

5. Beeline 界面执行“show tables”命令,查询异常。

6. 断开Beeline连接并多次重新连接10.43.183.121节点的SparkSQL,连接出现异常。

7. 用SQL url连接SparkSQL服务!connectjdbc:hive2://10.43.183.121:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkThriftServer始终无法连接上SparkSQL服务,通过“show tables”命令可以查到test表。

8. 重新启动MySQL节点,Beeline重新连接10.43.183.121节点,可以连接到SparkSQL节点。执行“show tables”命令,可以查询到test表信息。

测试结论:

  1. MySQL之间的元数据可以同步。

  2. MySQL节点挂掉会导致Beeline无法查询。

  3. MySQL节点挂掉的情况下,Beeline重新连接SparkSQL节点,无法连接到对应的SparkSQL节点。

  4. MySQL节点挂掉的情况下,Beeline通过SQL URL连接SparkSQL服务无法连接到对应的SparkSQL服务。

  •  场景三: 代码的JDBC接口连接到SparkSQL服务

服务配置同场景一中的方式,通过JDBC连接到SparkSQL节点,示例代码如下:


public static void main(String[] args)
{
    int num = 0;
    Connection conn = null;
    ResultSet rs = null;
    PreparedStatement pstat = null;
    while (num < 3)
    {
        num = num + 1;
        try
        {
            Class.forName("org.apache.hive.jdbc.HiveDriver");
            if (conn == null)
            {
                if (args.length > 0)
                    conn = DriverManager.getConnection(args[0], "mr", "mr");
                else
                    conn = DriverManager
                        .getConnection("jdbc:hive2://10.43.183.121:18000", "mr", "mr");
            }
            pstat = conn.prepareStatement("select * from test");
            rs = pstat.executeQuery();
 
            while (rs.next())
            {
                System.out.println(rs.getString("name"));
            }
            break;
        } catch (Exception e)
        {
            e.printStackTrace();
            try
            {
                conn = DriverManager
                    .getConnection("jdbc:hive2://10.43.183.122:18000", "mr", "mr");
            } catch (SQLException e1)
            {
                e1.printStackTrace();
            }
        } finally
        {
            try
            {
                rs.close();
                pstat.close();
                conn.close();
            } catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
 
    }
}


测试结论:

  1. 通过JDBC连接到SparkSQL节点可以通过异常捕获的方式实现实现MySQL节点故障之后获取SparkSQL服务。


测试结论


SparkSQL访问元数据服务的两种方案都可以正常访问元数据库并且实现元数据库的同步,而且元数据库异常的情况下,两种方案的处理是一样的。

但是SparkSQL连接MetaStore节点需要连接到Hive的MetaStore节点,对比直接连接MySQL会有多余的MetaStore进程需要维护、更加复杂的元数据库管理方式以及版本问题。

因此,建议用MySQL双主的方式实现SparkSQL的双主高可用,不同的SparkSQL节点直接连接到不同的MySQL。

访问SparkSQL服务的方式可以采用两种方式:

  1. Beeline连接SQL URL的方式,对于MySQL异常的情况,可以重新连接继续获取SparkSQL服务。

  2. 调用JDBC接口访问SparkSQL,捕获异常并对异常情况作处理,重新连接到其他SparkSQL节点。


配置方式


SparkSQL节点直接连接MySQL的配置如下:

在服务配置界面将javax.jdo.option.ConnectionURL项配置任一MySQL节点作为默认MySQL节点,如下图所示:

SparkSQL节点可以在自定义HIVE_SITE_CUSTOM_CONFIG中配置其他MySQL节点作为其对应的MySQL节点,配置格式为:


<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>${{mysql_url}}</value>

</property>


${{mysql_url}}为MySQL服务的URL。

如下图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark Streaming 和 Flink 都是流处理框架,但在一些方面有所不同。 1. 数据处理模型 Spark Streaming 基于批处理模型,将流数据分成一批批进行处理。而 Flink 则是基于流处理模型,可以实时处理数据流。 2. 窗口处理 Spark Streaming 的窗口处理是基于时间的,即将一段时间内的数据作为一个窗口进行处理。而 Flink 的窗口处理可以基于时间和数据量,可以更加灵活地进行窗口处理。 3. 状态管理 Spark Streaming 的状态管理是基于 RDD 的,需要将状态存储在内存中。而 Flink 的状态管理是基于内存和磁盘的,可以更加灵活地管理状态。 4. 容错性 Flink 的容错性比 Spark Streaming 更加强大,可以在节点故障时快速恢复,而 Spark Streaming 则需要重新计算整个批次的数据。 总的来说,Flink 在流处理方面更加强大和灵活,而 Spark Streaming 则更适合批处理和数据仓库等场景。 ### 回答2: Spark Streaming 和 Flink 都是流处理框架,它们都支持低延迟的流处理和高吞吐量的批处理。但是,它们在处理数据流的方式和性能上有许多不同之处。下面是它们的详细比较: 1. 处理模型 Spark Streaming 采用离散化流处理模型(DPM),将长周期的数据流划分为离散化的小批量,每个批次的数据被存储在 RDD 中进行处理,因此 Spark Streaming 具有较好的容错性和可靠性。而 Flink 采用连续流处理模型(CPM),能够在其流处理过程中进行事件时间处理和状态管理,因此 Flink 更适合处理需要精确时间戳和状态管理的应用场景。 2. 数据延迟 Spark Streaming 在处理数据流时会有一定的延迟,主要是由于对数据进行缓存和离散化处理的原因。而 Flink 的数据延迟比 Spark Streaming 更低,因为 Flink 的数据处理和计算过程是实时进行的,不需要缓存和离散化处理。 3. 机器资源和负载均衡 Spark Streaming 采用了 Spark 的机器资源调度和负载均衡机制,它们之间具有相同的容错和资源管理特性。而 Flink 使用 Yarn 和 Mesos 等分布式计算框架进行机器资源调度和负载均衡,因此 Flink 在大规模集群上的性能表现更好。 4. 数据窗口处理 Spark Streaming 提供了滑动、翻转和窗口操作等灵活的数据窗口处理功能,可以使用户更好地控制数据处理的逻辑。而 Flink 也提供了滚动窗口和滑动窗口处理功能,但相对于 Spark Streaming 更加灵活,可以在事件时间和处理时间上进行窗口处理,并且支持增量聚合和全量聚合两种方式。 5. 集成生态系统 Spark Streaming 作为 Apache Spark 的一部分,可以充分利用 Spark 的分布式计算和批处理生态系统,并且支持许多不同类型的数据源,包括Kafka、Flume和HDFS等。而 Flink 提供了完整的流处理生态系统,包括流SQL查询、流机器学习和流图形处理等功能,能够灵活地适应不同的业务场景。 总之,Spark Streaming 和 Flink 都是出色的流处理框架,在不同的场景下都能够发挥出很好的性能。选择哪种框架取决于实际需求和业务场景。 ### 回答3: Spark Streaming和Flink都是流处理引擎,但它们的设计和实现方式有所不同。在下面的对比中,我们将比较这两种流处理引擎的主要特点和差异。 1. 处理模型 Spark Streaming采用离散流处理模型,即将数据按时间间隔分割成一批一批数据进行处理。这种方式可以使得Spark Streaming具有高吞吐量和低延迟,但也会导致数据处理的粒度比较粗,难以应对大量实时事件的高吞吐量。 相比之下,Flink采用连续流处理模型,即数据的处理是连续的、实时的。与Spark Streaming不同,Flink的流处理引擎能够应对各种不同的实时场景。Flink的实时流处理能力更强,因此在某些特定的场景下,它的性能可能比Spark Streaming更好。 2. 窗口计算 Spark Streaming内置了许多的窗口计算支持,如滑动窗口、滚动窗口,但支持的窗口计算的灵活性较低,只适合于一些简单的窗口计算。而Flink的窗口计算支持非常灵活,可以支持任意窗口大小或滑动跨度。 3. 数据库支持 在处理大数据时,存储和读取数据是非常重要的。Spark Streaming通常使用HDFS作为其数据存储底层的系统。而Flink支持许多不同的数据存储形式,包括HDFS,以及许多其他开源和商业的数据存储,如Kafka、Cassandra和Elasticsearch等。 4. 处理性能 Spark Streaming的性能比Flink慢一些,尤其是在特定的情况下,例如在处理高吞吐量的数据时,在某些情况下可能受制于分批处理的架构。Flink通过其流处理模型和不同的调度器和优化器来支持更高效的实时数据处理。 5. 生态系统 Spark有着庞大的生态系统,具有成熟的ML库、图处理库、SQL框架等等。而Flink的生态系统相对较小,但它正在不断地发展壮大。 6. 规模性 Spark Streaming适用于规模小且不太复杂的项目。而Flink可扩展性更好,适用于更大、更复杂的项目。Flink也可以处理无限制的数据流。 综上所述,Spark Streaming和Flink都是流处理引擎,它们有各自的优缺点。在选择使用哪一个流处理引擎时,需要根据实际业务场景和需求进行选择。如果你的业务场景较为复杂,需要处理海量数据并且需要比较灵活的窗口计算支持,那么Flink可能是更好的选择;如果你只需要简单的流处理和一些通用的窗口计算,Spark Streaming是更为简单的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值