欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Hive2MySQL初步架构_MySQL

程序员文章站 2024-02-13 17:40:34
...

系统简介


本系统负责将Hive处理后的数据导出到MySQL服务器上,采用 主/从 架构。zeus2将待导出的数据信息放到zookeeper上,Zookeeper将该信息发送给master。master通过JobWatcher接收待处理的表信息,将这些信息转换为任务,并分发给client处理。当client处理完成时,会更新MySQL上数据处理表,表示该部分任务已经处理完成

Hive2MySQL初步架构_MySQL

模块简介


master

  • 简介
    为服务,会一直运行。包含接收zookeeper上传来的待导出数据的元信息、任务导出、任务超时处理、任务执行完成后的元数据更新、告警等功能 Hive2MySQL初步架构_MySQL
  • 流程
    1. 启动master服务
    2. 通过JobWatcher线程获取待处理的任务,并更新到队列MasterContext.finishedTZ中
    3. MasterContext中加入一个线程,扫描队列MasterContext.finishedTZ,如果有任务,则开始解析任务并进行任务分发
    4. 任务分发的时候,将分发任务加入到executor,执行完成的时候,得到返回码,并根据返回码,进行相应的处理
    5. MasterContext中加入一个线程,用于监控超时的client,如果超时,则将该client加入到超时列表中,以后不进行分发
  • 关键点
    1. MySQL节点的选择
    • 需求
      为了后续计算的方便,需要将能存储在一个MySQL服务器上的数据全部导出到一个节点上,例如上个月站点 A 导出到 MySQL1 上,这个月,还得将站点 A 的数据导出到节点 MySQL1 上。
    • 解决方案
      导出时,为了保证每次数据都导出到一个节点上去,需要维持一张site和host间对应的关系表。而部分站点的数据非常大,会超过MySQL服务器的单表阈值,这样部分站点的数据需要分发到不同的节点上去。site和节点之间的关系不是一一对应的。而大站点只是用户中的一部分,还存在一些小站点,一个MySQL服务器可能存放数个站点的数据。为了应对这些挑战,我们将站点分为三种SITE_LEVEL:SMALL_SITE、BIG_SITE、HUG_SITE,并分别采用不同的导出策略。
      SMALL_SITE 网站的数据量较小,一个站点只存放在一个MySQL服务器上去。所有的数据都会导出到一台MYSQL服务器上去。当数据超过MYSQL服务器单表限制的时候,会将数据导出到负载最小的MySQL服务器上去。某site很长时间以来一直使用我们的服务器时,可能会出现这种情况。
      BIG_SITE 导出的策略和SMALL_SITE一样,但是获取MySQL服务器的方法和SMALL_SITE不一样,BIG_SITE按照轮询的方式将HIVE上的数据导出到MYSQL中去,即今天的数据导出到 MYSQL1 上,明天的数据可能导出到MySQL2上。而SMALL_SITE的数据均导出到一台MYSQL服务器上。
      HUG_SITE 将站点每天的访问信息分发到不同的MYSQL服务器上去
  • 注解
    1. HDFS路径
      /user/hive/warehouse/ptmind_data.db/${tableName}_${tableType}/sitetz=${timezone}/partdt=${date}/partsid=${sid}
      /user/hive/warehouse/ptmind_data.db/sum_page_visits_stats_olap_d/sitetz=E0800/partdt=2014-06-02/partsid=56fbce4e
    2. tableType
      明细表的类型为x,其他表暂时只支持天d
    private String getTabType(String tableName) {if (tableName.equals(Constant.TB_1)) { return x;}else { return d;}}

client

  • 简介
    1. 部署在MySQL服务器上
    2. 执行HDFS2MySQL的导出任务 Hive2MySQL初步架构_MySQL
  • 流程
    1. 通过clientBootstrap监控消息
    2. 当监控到任务时,执行HDFS2MySQL的导出任务
      2.1 通过shell脚本,从HDFS上下载数据
      2.2 将元数据更新到MySQL服务器中
      2.3 删除本地文件
      2.4 根据表中插入行的数目判断数据是否导出成功
      2.5 将执行情况返回给master
    3. 定时向master发送心跳信息
  • 注解
  1. 存储的本地路径: /tmp/ptbalancer/data/${tableName}_${tableType}_${date}_${当前时间戳}

节点间通信

  • 中间件 netty

    master ServerBootstrap

    client ClientBootstrap

传输数据 PB

相比XML,PB有更好的传输效率、压缩率更高、解析速度更快