我们最原始的产品使用hive来进行数据分析和处理,由于我们的业务模型所限制,往往需要经过多轮的MR来完成任务,经过多轮的优化,虽然取得了一定的成果,但是执行速度还是不能满足产品的要求。
其实,当时考虑使用hive,是由于其基于SQL良好的扩展性为前提的,也就是说,以后我们在增加功能的时候,修改的部分很少,只需增加一些where,group by条件,就可以达成目的,hive也确实能够满足这个需求。但随着业务场景越来越复杂,其执行效率就越来越被诟病,正如shell相对于java,写起来做demo容易,但是系统越复杂,shell的效率和维护行就会被java拉开得越远。
我们也考虑过使用Tez来替换MapReduce作为底层的实现,因为这对于Hive简直就是透明的。但是tez对于性能提升得比较有限。对于分解成多轮MapReduce的任务,tez由于其DAG模型,对于性能有一定的提升,但是如果是单轮MapReduce保存中间表数据,其性能不仅没有提升反而会有些下降,而我们有的大任务就是因为数据量大,日志多,卡在了这个步骤。
此外,对于Hive,由于其需要执行一些DDL语句和SQL语句都需要有一个metastore service,不仅需要配置一个数据库,还需要在某台机器上启动一个metastore service,通过Thrift Server与后端的数据库通信,而这个service其实远算不上稳定,在运行时间长了之后经常会报DDL错误,
比如下面:
hive> show databases; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.thrift.transport.TTransportException java.net.SocketTimeoutException: Read timed out)
这就会导致产品相当地不稳定,尤其是没有保存到中间表的中间纪录,需要每过一段时间重启Metastore service。
于是乎,尝试在分析业务场景的情况下,使用标准的MapReduce程序来替换原有hive部分,经过几天的分析,最多也就需要两轮MapReduce就可以完成以前在hive中可能会启动多轮的MR任务们,Hive原来之所以做这些事情比较费劲,也是因为其在进行group by操作(一般就会执行reduce)的时候,以前的信息不会得到保存,如果想要保存,就需要中间表,但中间表过多仍然是瓶颈...
MapReduce程序的不足就是受限于业务场景,必须要采用两轮MapReduce(如果考虑用tez或更新的Spark可能会解决这个问题),当第一轮MapReduce的中间结果数据过大,会占用很多的HDFS空间,而且会有耗时非常长的序列化写以及第二轮序列化读操作(我们当前的中间结果由于是复杂的对象,暂时使用json作为中间结果保存,效率虽然不差但也不高,有优化的空间)。
MapReduce程序中由于不容易调试,使用其内置的Counter作为计数器来统计处理的记录是个非常好而且直观的方式:
context.getCounter(GroupName, CounterName).increment(1);
这样就可以在页面上的Counter列表栏中显示出对应所有的Counters。
中间结果不宜过多,如果能在第一轮Reducer端将其进行合并最好。
MapReduce中最好用的就是Map和Reduce之间的排序阶段,会根据Map输出的Key进行排序(取决于WritableComparable的compareTo方法,如果返回0则代表两者值是相同的,而不是使用equals/hashCode来判断),并在Reducer端,将key相同的合并成统一的Iterable<Value>对象做汇总。如果说我们修改后的程序为什么不能减少为一个Reducer,那么只有一个原因:在一轮MapReduce中不能享受两次这种排序过程...
在大数据处理的情况下,所有微小的耗时过程都会被放大,由于分布式的程序不容易进行性能分析,我们通过原始的手段jstack查看出几个比较耗时的执行函数(停留的几率较大):
- SimpleDateFormat.parse(String) 函数,涉及到从字符串解析成Date对象,效率非常低,解决方法是都统一成一种DateFormat,按照字符串进行比较操作(慎重);
- String.split(regex),由于可能涉及到正则表达式的匹配,String中并没有不对应正则表达式的相关切分函数。对于没有切分必要的字符串,先使用String.contains(String)方法来查看是否有必要来进行切分
- Integer.parseInt(String),Long.parseLong(String),表面上看这些函数都不会有重大问题,但放到多层循环中,就会变慢,尽量建立中间层对象来帮助率先将这些可能会耗时的操作独立到循环外面来进行。
此外,判断的逻辑顺序是否合理也非常关键,会迫使你不断重构代码改善执行顺序以及过程(可能会因此使得代码变的丑陋),因此,必要的测试用例不可少(除非你对你的代码非常有信心),毕竟一切的速度提升都是以数据正确性为前提。
总之,优化无止境,不管怎么做,总会遇到新的问题。
相关推荐
另外《Oracle优化日记:一个金牌DBA的故事》第一次详尽地披露了Oracle数据库内部存储结构,并公布了部分代码,对于有兴趣研究数据库内部存储结构或者编写dul工具的读者有一定的参考价值。《Oracle优化日记:一个金牌...
这样读取效率就比较高,因为一次读取就可能包含了两个表中的数据,因此提高了查询效率。要解决“磁盘数据组织不合理,导致磁盘的访问次数过多”这个问题,我们可以将经常读写的数据放置在不同的磁盘上,也就是将经常...
以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则...
该平台设计初衷在于解决传统企业客户信息反馈渠道不畅、数据处理效率低下等问题。通过Spring Boot框架的快速开发特性,我们实现了从前端展示到后端数据处理的全流程自动化,极大地提高了开发效率和系统的稳定性。...
微信小程序“汽车保养系统Ssm.zip”是一款基于Spring、Spring...后端采用SSM框架,确保了数据处理的效率和稳定性。这款小程序不仅优化了汽车保养服务流程,还提升了车主的保养体验,是现代汽车服务行业的理想解决方案。
同时,通过优化数据库设计和代码逻辑,确保系统在高并发场景下能够稳定运行,并具备较高的数据处理能力。 此外,我们还为该系统提供了详细的文档支持,包括用户手册、技术文档等,方便用户了解和使用系统。同时,...
直接插入排序 直接插入排序(Straight Insertion Sort)是一种...直接插入排序适用于待排序序列较小或基本有序的情况,因为它在处理小规模数据时效率较高,且在处理有序或基本有序的数据时性能优于其他一些排序算法。
本项目是一个基于SSM(Spring、SpringMVC、MyBatis)框架...5. 统计报表:系统提供丰富的统计报表功能,帮助企业分析业务数据,优化配送流程。 本系统具有良好的扩展性和可定制性,可根据企业的实际需求进行二次开发。
更新:摇一摇功能全面优化升级,支持多轮摇一摇游戏 2017.6.14 更新:现在对对碰签到完成即可参与 更新:优化手机签到页背景 更新:部分文字说明更新 更新:优化了摇一摇功能 更新:图片上传功能优化,上传速度更快,...
更新,查询,利于其信息管理,对于客户提出的要求能够及时满足,提高了中介机构的 工作效率,同时,开发这样一套管理软件对于我们即将计算机科学与技术专业毕业的学 生来说,也是一次将计算机应用于现实的一次很有...
该系统旨在通过自动化和信息化的手段,优化考试流程,提高考试工作的效率和公正性。 本项目设计的VB考试系统涵盖了考试安排、考生信息管理、试卷生成、在线考试、成绩管理等核心功能。系统能够自动化处理考试安排,...
系统性能:系统经过优化,具有良好的响应速度和处理能力,可以满足大规模并发访问的需求。 易用性:系统界面简洁明了,操作流程清晰,用户无需专业知识即可快速上手。 可扩展性:系统设计灵活,可以根据实际需求...
该系统不仅优化了药品管理流程,提升了工作效率,同时也保障了药品流通的安全性与准确性。该源码文件包包含了完整的项目文档和源代码,适合作为计算机科学与技术专业学生的毕业设计或课程设计项目。文件包含详细的...
值得一提的是,该项目具有良好的可定制性和可扩展性,用户可以根据自身需求进行二次开发,添加更多功能模块或优化现有功能。无论是学术研究还是商业应用,都是一个值得深入研究和探索的优秀项目。
C) 数据源条目、数据流条目、数据处理条目、数据文件条目 D) 数据流条目、数据文件条目、数据池条目、加工条目 9. 在需求分析阶段主要采用图形工具来描述的原因是(B C)。 A) 图形的信息量大,便于描述规模大的...
2. **学籍异动处理**:支持学生转专业、休学、复学、退学等学籍异动的申请和审批流程。 3. **成绩管理**:实现成绩的录入、修改、查询和统计分析功能,支持多种成绩计算方式。 4. **考勤管理**:自动记录学生的上课...
逐浪CMS2 x3.8系统是逐浪软件团队年度大作,也是有史以来最大的一次加构更新,我们不仅重写了全局代码、后台引擎,同时就整个底层架构进行优化,整体效率提升了三倍以上。 同时融入了新的办公系统、移动功能、H5...
4. **高效的订单处理流程**:用户可以在线提交订单,系统会自动处理并生成相应的订单报告,大大提高了订单处理的效率和准确性。 5. **完善的客户关系管理**:系统提供了客户资料管理、沟通记录和售后服务等功能,...
使客户感觉到企业的力量所在、企业的精神所在,企业在客户心中的形象在每一次与客户接触中不端的提高。 ④对业务人员 对业务人员(如:销售员、客户服务代表、现场服务工程师)来说,通过计划性地销售工作安排和...