我们最原始的产品使用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优化日记:一个金牌...
在大数据时代,面对海量的数据,传统的单条处理方式往往效率低下,无法满足业务需求。因此,数据的批量处理成为了一种必要的技术...了解并掌握批量处理的相关知识,对于提升数据处理效率,优化业务流程具有重要意义。
综上所述,本文详细介绍了利用Excel进行加油机原始记录数据处理的整个流程,包括工作表的建立、数据的计算、以及数据表的保护等,旨在为相关从业人员提供一个高效、可靠的数据处理解决方案。通过实际案例,展现Excel...
在大数据量处理和存储的场景中,代码优化是至关重要的,以确保系统性能和响应速度。以下是从给定内容中提取的关键知识点: ...在实际开发中,应持续监控和调整优化措施,以应对不同规模和复杂度的数据处理任务。
本主题聚焦于“批量更新历史数据每10000提交一次”的实践方法,这涉及到数据库操作优化、事务管理以及代码实现等技术细节。 首先,批量更新是为了避免频繁的小规模数据库交互,因为每次交互都会带来一定的开销,如...
【标题】基于VBA的乌鲁木齐市第二次全国污染源普查数据处理 【摘要】污染源普查是环保工作中至关重要的一环,涉及到海量数据的处理。本文介绍了如何利用VBA(Visual Basic for Applications)在Excel中实现数据的...
- **尽量避免使用游标**:数据库操作语句应以集合操作为主,如`SELECT`、`UPDATE`、`DELETE`等,这些操作能够一次性处理多条数据。使用游标逐条处理数据不仅效率低下,还可能导致系统性能下降。 - **改进查询逻辑**...
为了解决这些问题,本文提出了一套以C#为开发语言的数据处理系统,旨在优化"一步测量法"的数据处理流程,提高测量作业的效率和精度。 在介绍这套系统之前,我们需要先了解"一步测量法"的基本概念。该方法主要是指在...
例如,对于经常变动的数据,可以考虑频繁更新而不是一次性处理,以减少数据处理的延时。 总之,优化SQL是提升数据仓库ETL效率的关键。我们需要深入理解Oracle数据库的特性和索引管理机制,熟练掌握并行处理、分区...
2. 使用List存储数据,导致查重操作效率低下,且一次性批量提交大量数据,加重数据库压力。 针对上述问题,可以采取以下优化策略: 第一次改动: - 将数据结构从List转换为Set(HashSet),利用Set的特性自动去重...
在IT行业中,面对海量数据的处理与优化是一个重要的挑战。标题“海量数据的优化思路”表明我们将探讨如何高效地管理并优化大规模数据集。在这个领域,我们通常关注以下几个关键知识点: 1. 数据存储:海量数据首先...
在数据处理过程中,需要对观测数据进行多次迭代和优化,以减少系统误差和随机误差的影响,从而提高控制点坐标的精度。 接着,控制点的稳定性分析至关重要。通过对历年复测数据的对比,可以识别出控制点是否存在显著...
5. 数据处理系统的应用与优化:滕浙乾在使用三农普数据处理系统的过程中,发现了系统审核功能的缺陷。通过深入研究普查方案,她提出了改善审核公式的建议,进一步提高了数据处理的准确性。 6. 数据汇总和统计分析:...
压力变送器校准方法及数据处理的探讨 ...通过不断的研究和实践,结合相关规程和标准,不断优化校准方法和数据处理流程,可以进一步提高压力变送器的测量精度,满足工业过程控制对高精度和高稳定性的要求。
本文介绍了一种用于水准测量内外业数据处理的接口程序设计与实现,它旨在简化数据处理过程、减少人工干预,提高作业效率和成果精度。 在水准测量数据处理中,首先需要采集各种必要的测量数据。数据采集通常包括点名...
- 批处理和存储过程可以提高数据处理效率,减少网络传输次数。 #### 21. 系统配置优化 - 根据数据库的实际负载调整系统配置,包括内存分配、CPU使用率等。 #### 22. 查询优化器提示 - 使用查询优化器提示来指导...
综上所述,该文件介绍了一个利用VB和EXCEL开发的移液器数据处理系统,该系统通过优化数据采集、处理和记录流程,提高了实验室的工作效率和校准工作的准确性。系统的设计考虑了实际工作中遇到的挑战,并提供了实用的...
对于开发者而言,这是一次学习和实践编程技能的好机会,特别是针对数据处理和文件操作的技能。 总的来说,这款Excel CSV数据处理工具提供了一套强大且灵活的数据管理方案,适用于各种场景,如财务分析、市场研究、...