flume java介绍

简介: 近期在做shark flume开发框架的测试,该框架是一个简单高效的面向数据的pipeline框架,采用flume java的思想,实现了一套flume java on MaxCompute的library。为了更好的了解shark自己也去阅读了flume java的paper,这里做一些总结,主要

背景

近期在做shark flume开发框架的测试,该框架是一个简单高效的面向数据的pipeline框架,采用flume java的思想,实现了一套flume java on MaxCompute的library。为了更好的了解shark自己也去阅读了flume java的paper,这里做一些总结,主要针对flume java的一些基本概念和思想,由此可以了解shark相较于我们已有的MaxCompute开发框架有哪些不同。

基本概念

MapReduce介绍

flume java底层也是通过Map Reduce的方式执行任务,所以这里先简单介绍一下MapReduce框架。
MapReduce是一个分布式计算框架,主要针对批量大数据处理的场景。大家很熟悉的hadoop和MaxCompute计算都是MapReduce思想的具体实现。MapReduce框架的计算过程主要分成map-combine-shuffle-reduce几个阶段,具体每个阶段的工作可以参见下图。(引用自http://blog.jobbole.com/84089/
hadoop1

husky介绍

Husky是一个基于MaxCompute Map-reduce计算框架的工具包,内部封装了一些常用的功能模块。比如最常用的Flow模块可以完成各种不同类型任务的依赖搭建,甚至是外部任务或者是天网任务。Flow可以尽量的并行任务,提高MaxCompute集群的资源利用率。Husky除了支持Map-reduce任务外还支持sql、exec、tunnel等多种类型的任务,目前在阿里妈妈使用非常广泛。

flume java介绍

flume java的本质是一个面向数据的计算框架,这里包含了两个主要概念,数据和操作。

基本数据类型

flume java定义了两种数据集合:PCollection表示一个不可变的数据集合,PTable是PCollection的一个子类,表示一个不可变的结构的数据集合。数据集合中的数据类型是用户可以随意指定,比如MaxCompute的record,基本数据类型,pb类型等,所以这两种数据集合基本可以涵盖我们日常见到的全部类型的数据。

基本操作

flume java定义了几种针对以上数据集合的基本的数据操作。
ParallelDo(DoFn)--该操作可以类比MapReduce框架中的map或reduce阶段,通过执行DoFn,将输入数据集合PCollection转换成集合PCollection。
用户在使用该算子的时候需要自己实现DoFn方法,实际上用户在使用flume java框架时就是在编写各种处理数据集合的Fn方法,并将这些数据处理转换的过程串联成一个完整的pipeline。
GroupByKey--该操作可以类比MapReduce框架中的shuffle阶段,作用是将相同的key对应的value聚合起来,即将PCollection处理成PCollection>的过程。
combineValue--该操作可以类比MapReduce框架中的combine阶段,将PCollection>处理成PCollection。
flattens--针对所有的输入数据集合做一个合并操作,即将多个PCollection合并成PCollection。

衍生操作

基于以上几种基本操作,flume java又封装了一些常用的衍生操作。
count--将PCollection经过parallelDo变换,groupByKey聚合和combineValue操作最终变成PTable。大数据计算里最常见的wordCount在flume java中可以用这样一个算子实现。
join--将PTable和PTable经过parallelDo变换,flatten聚合和又一次的parallelDo变换转变成PTable, PCollection>>。
top--计算一个PCollection中top n的元素,该算子是parallelDo,groupByKey和combineValue几种算子的封装。

以上就是flume java中定义的数据集合和操作,任何基于flume java思想实现的library都要实现这些基础的操作算子,然后再结合实际应用总结出更多的算子,并用基础算子加以实现封装,shark框架就结合实际应用封装了更多的衍生算子,让框架使用者更方便的使用。

任务执行

flume java的执行粒度是pipeline,用户通过前面介绍的一系列算子生成了一个pipeline后,flume java并不是马上开始执行这个pipeline。因为flume java的运行采用lazy模式,用户需要显示的调用一个执行命令,才会真正开始执行任务,前期会完成创建执行计划和执行计划的优化工作,所以最终执行的是已经优化完成的pipeline。

任务优化

flume java有多种复杂的优化机制,一种是针对执行计划进行优化,另外在调度上会根据数据量大小选择本地和远程执行的模式,这种支持local模式的机制在测试场景中非常实用,测试人员的小数据量的任务无需再提交到集群上跟大任务争资源,直接本地就可以执行,这将大大缩短测试的时间。
pipeline优化的核心思想就是将可以合并在同一个map reduce job中的任务进行合并,减少总体job数量同时减少中间数据的落地输出。
这里给出paper中一个优化的例子。
原始任务pipeline:
flume5
该图中每一个节点对应一个并行的数据操作,除去writes节点共有16个操作节点。
优化后的pipeline:
flume6
最终经过优化实际只需要执行2个map reduce任务即可。
具体的优化策略这里不再介绍,大家可以参考flume java的paper了解更详细的过程。

shark的特性

前面介绍过shark实际是实现了一套flume java on MaxCompute的library,包含了丰富的join算子,比如双流join、multi join、shard join、map join;多种聚合算子,sum、avg、top等;支持二次排序和一些集合运算。同时也采用了husky中的一些功能,比如采用xml配置描述pipeline,但配置过程已经大大简化。支持断点重跑,pipeline DAG可视化等功能。

总结

paper中给出了一系列的结论用于阐明该框架的优势,比如由于该框架的易用性,越来越多的开发人员开始使用这个框架编写任务;采用优化策略使得实际的mr任务数缩减到1/5,从而执行效率也得到提升;开发人员迁移到该框架后代码量也得到缩减。
在测试shark的过程中自己也编写了一些基于该框架的任务,自己的感觉是配置文件得到了简化,无需再去了解MaxCompute或者husky的一些接口,只需要专注对数据的处理,实际执行任务时也没有了各种中间数据的输出,对于一些比较简单的任务测试起来是非常方便的。当然这种优化有时候也是一把双刃剑,一旦最终结果出现问题,往往需要追溯每个中间步骤的结果,而在这种框架下中间步骤可能已经被优化合并了,所以也曾跟开发讨论过如何支持debug模式的方案。但整体来说该框架还是能大大提高测试开发效率的。
欢迎加入MaxCompute钉钉群讨论

1

MaxCompute连接:https://www.aliyun.com/product/odps?spm=5176.100239.blogcont62435.17.zXXbop&from=yq&id=60498

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
2月前
|
Shell
Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
【2月更文挑战第17天】Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
57 2
|
2月前
|
SQL Java 程序员
Flume【问题记录 02】【java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument】【避坑指南】
【2月更文挑战第18天】Flume【问题记录 02】【java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument】【避坑指南】
16 0
|
分布式计算 Hadoop
flume报错记录:java.net.ConnectException:拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
flume报错记录:java.net.ConnectException:拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
555 0
flume报错记录:java.net.ConnectException:拒绝连接; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
|
3天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
1天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
11 3
|
1天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
10 2
|
1天前
|
Java 调度 开发者
Java中的多线程编程:基础与实践
【5月更文挑战第2天】本文将深入探讨Java中的多线程编程,从基础概念到实际应用,为读者提供全面的理解和实践指导。我们将首先介绍线程的基本概念和重要性,然后详细解析Java中实现多线程的两种主要方式:继承Thread类和实现Runnable接口。接着,我们将探讨线程同步的问题,包括synchronized关键字和Lock接口的使用。最后,我们将通过一个实际的生产者-消费者模型来演示多线程编程的实践应用。
|
1天前
|
安全 Java 程序员
Java中的多线程编程:从理论到实践
【5月更文挑战第2天】 在计算机科学中,多线程编程是一项重要的技术,它允许多个任务在同一时间段内并发执行。在Java中,多线程编程是通过创建并管理线程来实现的。本文将深入探讨Java中的多线程编程,包括线程的概念、如何创建和管理线程、以及多线程编程的一些常见问题和解决方案。
8 1
|
2天前
|
存储 安全 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第1天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细分析线程安全问题的根源,以及如何通过合理的设计和编码实践来避免常见的并发问题。同时,我们还将探讨如何在保证线程安全的前提下,提高程序的并发性能,包括使用高效的同步机制、减少锁的竞争以及利用现代硬件的并行能力等技术手段。

热门文章

最新文章