首页 文章 精选 留言 我的

精选列表

搜索[日活数],共10000篇文章
优秀的个人博客,低调大师

深入理解大数据数仓工具 Apache Hive 底层原理

作者:幻好 概述 通过学习 Apache Hive 基础知识和 HIve SQL 后,能够了解到 Hive 是将 SQL 语句通过底层转换生成 MR 程序进行工作,为了能对 Hive 能有一个更加深入的认识,还需要深入理解 Hive SQL 的执行原理。 本文将通过对于 Hive 底层执行原理的深入解读,帮助读者对于 Hive 的作用有更深入的理解。 Hive 底层原理 在使用 Hive 进行日常需求开发使用后,能够大概了解 Hive 是将 SQL 语句通过底层转换生成 MR 程序进行工作,为了能对 Hive 能有一个更加深入的认识,还需要深入理解 Hive SQL 的执行原理。 Hive 执行架构 Hive 是基于 Hadoop 进行交互工作的,所以根据 Hive 的整个工作的流程可以有以下架构图: 核心组件 根据上图,可知 Hive 工作执行中包含以下5个组件: UI(用户界面):可看作我们提交 SQL 语句的命令行界面。 DRIVER(驱动程序):接收查询的组件。该组件实现了会话句柄的概念。 COMPILER(编译器):负责将 SQL 转化为平台可执行的执行计划。对不同的查询块和查询表达式进行语义分析,并最终借助表和从 META STORE 查找的分区元数据来生成执行计划。 META STORE(元数据库):存储 Hive 中各种表和分区的所有结构信息。 EXECUTION ENGINE(执行引擎):负责提交 COMPILER 阶段编译好的执行计划到不同的平台上。 工作流程 结合上图,Hive 的正常工作流程分为以下步骤: Step 1:用户通过 UI 界面编写 SQL 提交会调用 DRIVER 的接口; Step 2:DRIVER 接收查询任务后,会为查询创建会话句柄,并将查询发送到 COMPILER 生成执行计划; Step3:编译器从 META STORE 中获取本次查询所需要的元数据; Step 4:查询到对应的元数据,会用于对查询树中的表达式进行类型检查,以及基于查询谓词修建分区; Step 5:编译器生成的执行计划是分阶段的 DAG(有向无环图),其中的阶段可能是 map/reduce 作业,也可能是一个元数据或在 HDFS 上的操作。最后将生成的计划发给 DRIVER,如果是 map/reduce 作业,该计划包括 map operator trees 和一个 reduce operator tree,执行引擎将会把这些作业发送给 MapReduce; Step 6:执行引擎将这些阶段提交给适当的组件。在每个 task(mapper/reducer) 中,从 HDFS 文件中读取与表或中间输出相关联的数据,并通过相关算子树传递这些数据。最终这些数据通过序列化器写入到一个临时 HDFS 文件中(如果不需要 reduce 阶段,则在 map 中操作)。临时文件用于向计划中后面的 map/reduce 阶段提供数据。 Step 7:最终的临时文件将移动到相关表的位置,确保不读取脏数据(文件重命名在 HDFS 中是原子操作)。 Step 8:对于用户的查询,临时文件的内容由执行引擎直接从 HDFS 读取,然后通过 Driver 发送到 UI。 Hive SQL编译原理 Hive 最重要的工作就是将 SQL 语句编译成 MapReduce 的过程,而编译 SQL 的过程是在 COMPILER(编译器)中完成的。编译转换的过程主要分为以下几个阶段: 语法解析:通过语言识别工具 Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象语法树 AST Tree; 语义解析:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock; 生成逻辑执行计划:遍历 QueryBlock,翻译为执行操作树 OperatorTree; 优化逻辑执行计划:逻辑层优化器进行 OperatorTree 变换,合并 Operator,达到减少 MapReduce Job,减少数据传输及 shuffle 数据量; 生成物理执行计划:遍历 OperatorTree,翻译为 MapReduce 任务; 优化物理执行计划:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。 编译案例分析 Hive SQL 编译转换为 MR 程序的过程从概念上理解起来比较抽象,为了更好的理解直接结合一个简单的查询案例进行分析: select * from hivedb.sys_user where id = '1001'; 第一阶段:语法解析 通过 Antlr 定义的 sql 语法规则,将相关 sql 进行词法、语法解析,转化为抽象语法树 AST Tree: ABSTRACT SYNTAX TREE: TOK_QUERY TOK_FROM TOK_TABREF TOK_TABNAME hivedb sys_user TOK_INSERT TOK_DESTINATION TOK_DIR TOK_TMP_FILE TOK_SELECT TOK_SELEXPR TOK_ALLCOLREF TOK_WHERE = TOK_TABLE_OR_COL id '1001' -第二阶段:**语义解析 ** 遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock: AST Tree 生成后由于其复杂度依旧较高,不便于翻译为 mapreduce 程序,需要进行进一步抽象和结构化,形成 QueryBlock。 QueryBlock 是一条 SQL 最基本的组成单元,包括三个部分:输入源,计算过程,输出。简单来讲一个 QueryBlock 就是一个子查询。 QueryBlock 的生成过程为一个递归过程,先序遍历 AST Tree ,遇到不同的 Token 节点(理解为特殊标记),保存到相应的属性中。 -第三阶段:**生成逻辑执行计划 ** 遍历 QueryBlock,翻译为执行操作树 OperatorTree: Hive 最终生成的 MapReduce 任务,Map 阶段和 Reduce 阶段均由 OperatorTree 组成。 基本的操作符包括: TableScanOperator SelectOperator FilterOperator JoinOperator GroupByOperator ReduceSinkOperator Operator 在 Map Reduce 阶段之间的数据传递都是一个流式的过程。每一个 Operator 对一行数据完成操作后之后将数据传递给 childOperator 计算。 由于 Join/GroupBy/OrderBy 均需要在 Reduce 阶段完成,所以在生成相应操作的 Operator 之前都会先生成一个 ReduceSinkOperator,将字段组合并序列化为 Reduce Key/value, Partition Key。 -第四阶段:优化逻辑执行计划 Hive 中的逻辑查询优化可以大致分为以下几类: 投影修剪 推导传递谓词 谓词下推 将 Select-Select,Filter-Filter 合并为单个操作 多路 Join 查询重写以适应某些列值的 Join 倾斜 -第五阶段:**生成物理执行计划 ** 生成物理执行计划即是将逻辑执行计划生成的 OperatorTree 转化为 MapReduce Job 的过程,主要分为下面几个阶段: 对输出表生成 MoveTask 从 OperatorTree 的其中一个根节点向下深度优先遍历 ReduceSinkOperator 标示 Map/Reduce 的界限,多个 Job 间的界限 遍历其他根节点,遇过碰到 JoinOperator 合并 MapReduceTask 生成 StatTask 更新元数据 剪断 Map 与 Reduce 间的 Operator 的关系 -第六阶段:优化物理执行计划 Hive 中的物理优化可以大致分为以下几类: 分区修剪(Partition Pruning) 基于分区和桶的扫描修剪(Scan pruning) 如果查询基于抽样,则扫描修剪 在某些情况下,在 map 端应用 Group By 在 mapper 上执行 Join 优化 Union,使 Union 只在 map 端执行 在多路 Join 中,根据用户提示决定最后流哪个表 删除不必要的 ReduceSinkOperators 对于带有 Limit 子句的查询,减少需要为该表扫描的文件数 对于带有 Limit 子句的查询,通过限制 ReduceSinkOperator 生成的内容来限制来自 mapper 的输出 减少用户提交的 SQL 查询所需的 Tez 作业数量 如果是简单的提取查询,避免使用 MapReduce 作业 对于带有聚合的简单获取查询,执行不带 MapReduce 任务的聚合 重写 Group By 查询使用索引表代替原来的表 当表扫描之上的谓词是相等谓词且谓词中的列具有索引时,使用索引扫描 通过以上6个阶段,SQL 就被解析映射成了集群上的 MapReduce 任务。 总结 本文主要介绍 Apache Hive 工作的底层原理,通过对于 Hive SQL 执行的工作流程到底层执行过程的解析能够帮助读者更深入的理解 Hive 的作用。

优秀的个人博客,低调大师

3 天扩扩扩扩扩扩扩容数 10 倍?

2亿学生在线上课。 疫情的肆虐,原本该回归各大校园的师生们涌入线上,突如其来的流量洪峰给在线教育行业带来了极大挑战。 长期服务教育企业的百家云也不例外。作为一家致力于为教育机构提供一站式云课堂解决方案的企业,疫情期间,百家云接到来自多家教育机构搭建在线云课堂的需求。同时,原来以线下为主的教育机构,流量瞬间转到了线上。 为了响应教育部门停课不停学的号召,帮助学生老师们开学,百家云全体员工缩短了假期,从大年初二开始在家办公,初七开始全员办公。 短时间内爆发式的需求,对于每一家教育企业而都是始料未及的。据百家云CEO李钢江透露,百家云的业务量短时间内增长了数十倍。如此迅速的扩容需要,还要在客户无感知的情况下完成,比交付一个新系统难度更大。 不幸中的万幸是,百家云团队对敏捷架构的探索让他们在如此高并发场景上早有准备。这场战役之前,百家云已在阿里云团队的帮助下,优化自身容器集群架构与规划,通过以阿里云容器服务ACK、弹性裸金属(神龙)实例的核心方案,从容实现动态扩容与高效管控。 探索容器化改造,具备应对洪峰敏捷能力 百家云非常幸运,在这轮爆发之前完成了容器化改造。其他没有使用容器的在线教育企业,面对暴涨的用户,只能成倍堆积机器,导致部署时间拉长,业务成本剧烈升高。 故事要从百家云的业务发展开始说起。 百家云从2017年诞生之初就是在做直播大班课产品,是行业内拥有最纯正的教育基因的云视频公司。在2018年已经实现了过亿营收,服务了超过1000多家教育企业。 业务高速增长也在促使百家云技术团队探索自身技术架构的优化。到了2019年,百家云逐步推出小班课产品,该产品的处理方式与大班课不同,需要通过音视频抓屏的方式,将课程录制下来回放。 此过程中,还需要将音频与视频进行隔离。用虚拟机级别的隔离成本太高;若跑在统一虚拟机里,各个进程则会互相干扰。百家云团队于是关注到了容器这种更为轻量级的虚拟化技术。 在2019年上半年,百家云内部就开始尝试小规模对业务进行容器化改造,完成了基本流程的跑通。 然而,随着百家云容器规模的扩大,调度与管理成为了新的问题。阿里云的容器管理平台(ACK, Alibaba Cloud Container Service for Kubernetes),大大减少百家云的工作。百家的技术团队表示,容器减少了运维和测试的工作量;方便了对应用运行环境实现版本控制;且相比虚拟机有着更小计算开销,降低了IT成本。 彼时基于容器的云原生大潮已然席卷,基于容器技术的云原生架构,为百家云可能出现的业务峰值做了敏捷弹性的技术储备。 只是,这还是第一步。 瞬间来临的洪峰,还是给百家云带来了考验。 借助阿里云“容器+神龙” 三天内实现数十倍扩容 潮水袭来,百家云的问题很直接:扩容。 疫情是全国共同的敌人。业务持续稳定增长的百家云,未曾料想到新禧之年将面临这样一场“战役”,原来容器集群的许多配置没有按大规模集群去规划,导致单个集群可容纳的节点受限,原来使用的小规格实例也限制了单个节点的容量。 针对百家云的扩容问题,阿里云团队建议客户选用大规格的弹性裸金属服务器(神龙)。根据百家云的应用负载特点,结合容器服务管控合适规格的弹性裸金属实例来优化成本、避免浪费,提升弹性供给保障。 首先,阿里云弹性裸金属服务器(神龙)服务器的规格较高,可以帮助百家云显著提升了单个节点的容量。 更重要的是,百家云的K8s集群对性能要求极高。神龙服务器的性能优势明显, “容器+弹性裸金属(神龙)”的解决方案非常契合百家云大流量、高并发的场景。 基于容器化构建方式,可以满足业务快速发放和弹性的要求。神龙服务器完全消除了虚拟化损耗,提升了8%的计算性能,其类物理机特性,可进行二次虚拟化。 第二,神龙的性能,加上容器的弹性,形成了天作之合。数据显示,容器运行在云上神龙反而比非云物理机的性能要好10%-15%。主要是因为虚拟化开销已经offload到MOC卡上,神龙的CPU/Mem是无虚拟化开销的,而上云后运行在神龙上的每个容器都独享ENI弹性网卡,能提升13%的网络吞吐量。 第三,神龙服务器的存储带宽和计算带宽分离,能满足百家云业务场景的大量读写需求。使用神龙服务器之后,计算能力大增,但是同时也遇到了存储I/O性能瓶颈的问题。百家云通过使用阿里云的高性能NAS服务,并通过水平扩展为4个集群,解决了I/O的瓶颈。 基于以上方案,借助自身的大规模集群管理能力,在短短几天之内,阿里云团队帮助百家云团队有效升级了原有的架构方案,实现了数十倍的扩容,大幅提升了其性能与稳定性,并拥有了应对爆发性规模的能力。 优化架构与集群规划,显著降低运维成本 面对突增流量压力,如何迅速动态弹性扩容以及高效管控运维成为迫切问题。 改变了原来虚拟化嵌套的形式,百家云利用神龙实现了容器的高密度部署。配合容器的敏捷管理能力,起码节省了25%的成本,降低了80%的运维工作量。同时,合理规划K8s集群,优化整体架构如网络、存储方案、扩容原则,确保后续运维的稳定性并降低使用成本。 此外,百家云还使用了阿里云高效运维管理的工具,显著降低了运维工作量。 由于百家云业务上容器的时间非常紧迫,根本没有多少时间可以花在运维监控上。通过使用ARMS Prometheus,仅仅半小时百家云就实现了容器节点环境的监控。相比开源 Prometheus 监控,ARMS Prometheus的数据量无上限且与阿里云容器服务ACK无缝对接,让百家云在容器里高效快速定位问题,了解如何改善自己的产品。 阿里云容器平台的日志服务(SLS)Kubernetes事件中心,详细展示了集群的状态变更和组件异常等事件,帮助百家云把节点里面日志的异常信息汇总到控制面板,及时告警。 百家云CEO李钢江总结,阿里云带给百家云的价值主要是以下三点: 第一,提供了弹性计算的空间与敏捷安全的扩容能力 阿里云对应用镜像进行了镜像预热等手段,在扩容时可第一时间拉起容器。基于容器镜像服务ACR 安全托管大规模容器镜像资产,通过细粒度的镜像授权管控,安全快速地对应用镜像进行全生命周期管理。 第二,提供了相对稳定的服务与优异性能 基于阿里云自研的神龙软硬一体架构,弹性裸金属服务器(神龙)有着物理机的性能和虚拟机的使用体验。通过利用神龙,百家云实现更好地调度K8s集群,加上高性能NAS服务,解决了I/O瓶颈问题。 第三,技术支持团队响应及时,帮助百家云优化架构 百家云之所以后来面临扩容问题,部分源于其原来业务架构规划未做好管理大规模集群的准备,阿里云帮助了百家云在短时间内优化了业务架构,优化集群的管理能力。 阿里云作为全国第一、世界顶尖的云服务商,在IaaS和PaaS层能力强大;百家云在教育SaaS层的积累,可以与阿里云互补,一同以完整的在线教育方案去覆盖市场。 双方正在逐步深化合作,百家云将很快上线阿里云云市场——阿里云SaaS加速器的商业平台,即“软件天猫”,后续用户可直接在云市场选购百家云的服务。 编辑:Anlin

优秀的个人博客,低调大师

使用模板元编程快速的得到斐波那契数。。

这是一种将运行时消耗转移到编译器消耗的方法,是c++模板的一种应用。 当你的程序运行时效率需要特别高的时候,可以考虑这样的方法。 模板实例化的时候需要常量: #include <iostream> using namespace std; template < unsigned N > struct Fib { enum { Val = Fib<N-1>::Val + Fib<N-2>::Val //递归。。 }; }; template<> //针对和的特化作为结束的条件 struct Fib<0> { enum { Val = 0 }; }; template<> struct Fib<1> { enum { Val = 1 }; }; int main() { cout<<Fib<20>::Val <<endl; return 0; } 如果你觉得Fib<20>::Val这样的调用很麻烦的话可以定义一个类似的宏使得其应用有类似于函数调用的形式: #define FibFuc( n ) (Fib<n>::Val) ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/04/02/2429818.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

数加DataWorks/MaxCompute在国网浙江电力的最佳实践

摘要:2017云栖大会dataworks专场,国网浙江电力大数据平台架构师陈振带来Dataworks/MaxCompute在国网应用的实践。本文主要从建设数据仓库的三个痛点开始谈起,引出企业级数仓架构设计,着重通过数据集成和企业级管理为大家分享了具体的应用情况,最后作了简要的展望。 以下是精彩内容整理: 背景&动机 由于长期业务系统的竖井式发展,导致业务系统中数据存储分散,当你要进行多个业务系统中数据的联合统计场景时,我们通常不得不汇总三到四个以上的业务系统数据,久而久之就会在数据中心里形成一张非常复杂的数据集成网络,由于业务系统给出的接口非常老旧,导致在数据集成网络中涉及到的技术手段又非常多,总共这三大痛点给我们数据中心管理带来非常大的困难。 所以,我们开始思考,为什么不把全部的业务数据放到统一的数据仓库中去呢?为了进行数据的

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册