flume java介绍

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 近期在做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

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
打赏
0
0
0
0
78842
分享
相关文章
|
10月前
|
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) 类问题整理+其他类型问题总结】【避坑指南】
457 2
|
10月前
|
Flume【问题记录 02】【java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument】【避坑指南】
【2月更文挑战第18天】Flume【问题记录 02】【java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument】【避坑指南】
143 0
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
717 0
flume报错记录:java.net.ConnectException:拒绝连接; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
|
24天前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
155 60
【Java并发】【线程池】带你从0-1入门线程池
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
65 23
|
20天前
|
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
91 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
124 14
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
60 13
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等