Spark metrics整理

本文介绍Spark Metrics系统的架构和配置方法,包括sink和source的概念及如何配置。详细解释了不同sink的功能及其配置参数,并提供了配置样例。

链接:https://www.jianshu.com/p/e42ad9cb66a1

 

概述

spark使用metrics的包路径为:org.apache.spark.metrics,核心类:MetricsSystem。可以把Spark Metrics的信息报告到各种各样的Sink,比如HTTP、JMX以及CSV文件。

Spark的Metrics系统目前支持以下的实例:
○ master:Spark standalone模式的master进程;
○ worker:Spark standalone模式的worker进程;
○ executor:Spark executor;
○ driver:Spark driver进程;
○ applications:master进程里的一个组件,为各种应用作汇报。

metrics结构主要分为sink和source,source指数据来源,Source内属性包含name和MetricRegistry,主要有:MasterSource、WorkerSource、ApplicationSource、StreamingSource、BlockManagerSource等。

 

sink是将指标发送到哪,目前有:ConsoleSink、GangliaSink、GraphiteSink、MetricsServlet、JmxSink、CsvSink

配置

在spark的conf目录下metrics.properties文件中配置,默认使用此文件,也可以通过-Dspark.metrics.conf=xxx指定。

--conf "spark.metrics.conf=metrics.properties" \

--files "hdfs://nameservice1/user/adore.chen/app_1/metrics.properties" \

sink配置参数说明

ConsoleSink 是记录Metrics信息到Console中

名称默认值描述
classorg.apache.spark.metrics.sink.ConsoleSinkSink类
period10轮询间隔
unitseconds轮询间隔的单位

CSVSink 定期的把Metrics信息导出到CSV文件中

名称默认值描述
classorg.apache.spark.metrics.sink.CsvSinkSink类
period10轮询间隔
unitseconds轮询间隔的单位
directory/tmpCSV文件存储的位置

JmxSink 可以通过JMX方式访问Mertics信息

名称默认值描述
classorg.apache.spark.metrics.sink.JmxSinkSink类

MetricsServlet

名称默认值描述
classorg.apache.spark.metrics.sink.MetricsServletSink类
pathVARIES*Path prefix from the web server root
samplefalseWhether to show entire set of samples for histograms ('false' or 'true') |

这个在Spark中默认就开启了,我们可以在4040端口页面的URL后面加上/metrics/json查看

GraphiteSink

名称默认值描述
classorg.apache.spark.metrics.sink.GraphiteSinkSink类
hostNONEGraphite服务器主机名
portNONEGraphite服务器端口
period10轮询间隔
unitseconds轮询间隔的单位
prefixEMPTY STRINGPrefix to prepend to metric name

GangliaSink 由于Licene的限制,默认没有放到默认的build里面,如果需要使用,需要自己编译

名称默认值描述
classorg.apache.spark.metrics.sink.GangliaSinkSink类
hostNONEGanglia 服务器的主机名或multicast group
portNONEGanglia服务器的端口
period10轮询间隔
unitseconds轮询间隔的单位
ttl1TTL of messages sent by Ganglia
modemulticastGanglia网络模式('unicast' or 'multicast')

sink配置样例

语法 syntax: [instance].sink.[name].[options]=[value]

 

    *.sink.console.class=org.apache.spark.metrics.sink.ConsoleSink
    *.sink.console.period=10
    *.sink.console.unit=seconds

以上为所有实例开启ConsoleSink,包括master、worker、dirver、executor

 

    master.sink.console.class=org.apache.spark.metrics.sink.ConsoleSink
    master.sink.console.period=10
    master.sink.console.unit=seconds

以上只为master开启ConsoleSink

source配置样例

语法 syntax: [instance].source.[name].[options]=[value]

 

    master.source.jvm.class=org.apache.spark.metrics.source.JvmSource

以上为master开启JvmSource

代码流程

1.各实例master、worker、dirver、executor在启动时创建MetricsSystem实例,在start时调用registerSources()、registerSinks();
2.registerSources中在配置文件中找到对应实例的配置,获取Source的具体包名类名后,通过反射生成实例,再调用registerSource注册到registry中。各source中已定义好要记录的指标,可以继承Source采集自定义信息;
3.registerSinks中同样获取对应实例的配置,得到sink的包名类名反射生成实例,加到sinks列表中。
4.report方法中可调用所有sink的report方法(只在stop中调用)。

参考:

http://spark.apache.org/docs/latest/monitoring.html
http://hao.jobbole.com/metrics/
https://www.jianshu.com/p/e4f70ddbc287
https://www.iteblog.com/archives/1341.html


 

<think> 嗯,用户这次明确要求了解Hive、Spark、Flink这三个大数据框架的Shuffle优化方法和过程。从用户提供的引用材料来看,ta应该是个大数据工程师或数据平台开发者,正在处理实际生产环境中的数据倾斜问题。用户引用的内容集中在Shuffle优化和数据倾斜解决方案上,说明ta可能遇到了性能瓶颈。 注意到用户特别标注“上述引用仅供参考”,说明ta更希望获得系统性的知识梳理而非碎片化信息。而且用户连续两次询问Shuffle优化,显然对性能调优有迫切需求。上次我给的回答结构ta没有提出异议,这次可以延续类似框架,但需要更聚焦Shuffle机制本身。 先拆解三个组件的Shuffle特点:Hive本质是MR所以优化在MapReduce层;Spark的RDD和内存计算特性决定了其Shuffle多样性;Flink则是流批统一的Shuffle机制。用户提到的数据倾斜解决方案引用[1]里Spark的reduceByKey案例很典型,这个应该重点展开。 在组织回答时要注意:1)区分批处理和流处理的Shuffle差异 2)强调实际配置参数而非理论 3)补充用户没问但关键的序列化优化。比如引用[3]提到Flink是有状态计算,这点在Shuffle优化中容易被忽略但很重要。 用户引用的阿里云文档提到Hive优化方案,可以结合这点补充云原生环境的特殊优化手段。另外ta似乎混淆了“优化方法”和“过程”,回答需要明确区分:方法指技术手段(如分区算法),过程指实施步骤(如参数调整顺序)。 最后生成的问题要引导用户思考落地场景,比如问框架选型依据而非纯理论,这样能帮ta关联实际工作。特别注意避免重复上次的问题,这次应该更深入资源管理和监控层面。 </think> 以下是针对Hive、Spark、Flink的Shuffle优化方法与过程详解,结合技术原理和工程实践分层说明: --- ### 一、Hive的Shuffle优化(基于MapReduce) **核心问题**:MapReduce的Shuffle阶段需跨节点传输数据,易成性能瓶颈 **优化方法**: 1. **Combiner预聚合** - 在Map端提前合并重复Key,减少传输量 - 启用方式:`set hive.map.aggr=true;`(默认开启) - 适用场景:SUM/COUNT等可合并操作 2. **倾斜Key分离处理** ```sql -- 步骤1:分离倾斜Key单独处理 CREATE TABLE tmp_skew AS SELECT * FROM src WHERE key = 'skew_value'; -- 步骤2:非倾斜Key正常处理 CREATE TABLE tmp_normal AS SELECT key, value FROM src WHERE key <> 'skew_value' GROUP BY key; -- 步骤3:合并结果(需业务逻辑调整) INSERT INTO final_result SELECT * FROM tmp_normal UNION ALL SELECT key, SUM(value) FROM tmp_skew GROUP BY key; ``` 3. **参数调优** ```sql set mapreduce.reduce.input.buffer.percent=0.7; -- Reduce端内存缓存比例 set hive.exec.reducers.bytes.per.reducer=256000000; -- 调整Reducer数量 set mapreduce.reduce.shuffle.input.buffer.percent=0.8; -- Shuffle缓冲区占比 ``` --- ### 二、Spark的Shuffle优化 **核心机制**:通过RDD血统重新计算代替Shuffle,但Shuffle不可避免时需优化 **优化层级**: 1. **算子级优化** - 优先用`reduceByKey`替代`groupByKey`:先在Map端合并(Combiner) - 倾斜处理:`repartition(1000)`增大分区数分散热点Key 2. **Shuffle引擎选择** ```scala // 启用Tungsten Sort(Spark 2.0+默认) spark.conf.set("spark.shuffle.manager", "sort") // 或选用UnsafeShuffle(堆外内存) spark.conf.set("spark.shuffle.manager", "tungsten-sort") ``` 3. **动态资源分配** ```bash spark-submit --conf spark.dynamicAllocation.enabled=true \ --conf spark.shuffle.service.enabled=true # 需启动External Shuffle Service ``` 4. **倾斜处理技术** ```scala // Salting技巧:给倾斜Key添加随机前缀 val saltedRDD = rdd.map{ case (key, value) => if (isSkewed(key)) (s"${Random.nextInt(100)}_$key", value) else (key, value) } ``` --- ### 三、Flink的Shuffle优化 **流批统一优化**: 1. **网络栈优化** - 启用Credit-based流控:`taskmanager.network.credit-model.enabled=true`(默认开) - 缓冲超时调优:`taskmanager.network.sort-shuffle.min-buffers=64`(减少小包传输) 2. **分区策略** ```java // 避免Hash分区导致倾斜 dataStream.rebalance() // 轮询分发 .keyBy(new KeySelector<..., String>() { @Override public String getKey(Event value) { return value.getKey().substring(0,3); // 使用Key前缀分组 } }); ``` 3. **批处理专属优化** ```yaml # 启用自适应批调度 execution.batch-shuffle-mode: ALL_EXCHANGES_BLOCKING # 压缩Shuffle数据 taskmanager.network.blocking-shuffle.compression.enabled: true ``` 4. **反压机制协调** - 基于TCP的反压(v1.5前) vs. 基于Credit的反压(v1.5+) - 监控:`flink.taskmanager.network.memorySegmentsAvailable`(网络缓冲使用率) --- ### 四、跨引擎通用优化原则 1. **数据倾斜诊断** - 监控指标:单个Task处理时长 >> 其他Task - 工具:Spark UI的Shuffle Read/Write Metrics,Flink Web UI的Subtask数据分布 2. **资源动态调整** ```sql -- Hive动态分区数(基于数据量) set hive.exec.reducers.max=999; set hive.exec.reducers.bytes.per.reducer=67108864; -- 64MB ``` 3. **存储格式优化** - 列式存储(Parquet/ORC)减少I/O - 本地排序:`CREATE TABLE ... STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY", "orc.create.index"="true")` --- ### 性能对比与选型建议 | 引擎 | Shuffle特点 | 适用场景 | |-------|-----------------------------|----------------------------| | Hive | 磁盘密集型,稳定性高 | 超大规模批处理,容错要求高 | | Spark | 内存优先,灵活性好 | 迭代计算,MLlib场景 | | Flink | 流式Shuffle,低延迟 | 实时ETL,事件驱动处理 | > 选择依据:数据时效性要求(批/流)、集群内存资源、数据倾斜严重程度[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值