hadoop优化1 TODO

本文深入探讨了将HiveSQL视为MapReduce程序进行优化的方法,强调了理解Hadoop核心能力对于Hive性能提升的重要性。文章详细阐述了通过在集群中不断调整参数来发挥集群最大威力的过程,以及避免数据倾斜以提高任务效率的策略。通过一个公司同事用一年时间优化CDH参数的真实案例,展示了持续调优的重要性。

 

0 一些想说的说说:

 

a) 优化时, 把hive sql当成map reduce程序来读,会有意想不到的惊喜

b) 理解Hadoop的核心能力是优化hive的根本

c) 根据具体跑的数据在集群中不断调节参数 最终发挥集群最大威力,这是一个长期过程,

    公司一个同事断断续续用1年时间不断调节cdh参数。

c) 任务不怕数据量多,怕的是数据倾斜,在mr hive hbase中都要尽量避免倾斜,使用集群也是不断调节集群各子生态参数和优化数据分布避免倾斜的两个过程。

 

 

public class WatermarkOutOfOrdernessDemo { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // env.setParallelism(1); /** * 演示watermark多并行度下的传递 * 1、接收到上游多个,取最小 * 2、往下游多个发送, 广播 */ env.setParallelism(2); SingleOutputStreamOperator<WaterSensor> sensorDS = env .socketTextStream("hadoop102", 7777) .map(new WaterSensorMapFunction()); // TODO 1.定义Watermark策略 WatermarkStrategy<WaterSensor> watermarkStrategy = WatermarkStrategy // 1.1 指定watermark生成:乱序的,等待3s .<WaterSensor>forBoundedOutOfOrderness(Duration.ofSeconds(3)) // 1.2 指定 时间戳分配器,从数据中提取 .withTimestampAssigner( (element, recordTimestamp) -> { // 返回的时间戳,要 毫秒 System.out.println("数据=" + element + ",recordTs=" + recordTimestamp); return element.getTs() * 1000L; }); // TODO 2. 指定 watermark策略 SingleOutputStreamOperator<WaterSensor> sensorDSwithWatermark = sensorDS.assignTimestampsAndWatermarks(watermarkStrategy); sensorDSwithWatermark.keyBy(sensor -> sensor.getId()) // TODO 3.使用 事件时间语义 的窗口 .window(TumblingEventTimeWindows.of(Time.seconds(10))) .process( new ProcessWindowFunction<WaterSensor, String, String, TimeWindow>() { @Override public void process(String s, Context context, Iterable<WaterSensor> elements, Collector<String> out) throws Exception { long startTs = context.window().getStart(); long endTs = context.window().getEnd(); String windowStart = DateFormatUtils.format(startTs, "yyyy-MM-dd HH:mm:ss.SSS"); String windowEnd = DateFormatUtils.format(endTs, "yyyy-MM-dd HH:mm:ss.SSS"); long count = elements.spliterator().estimateSize(); out.collect("key=" + s + "的窗口[" + windowStart + "," + windowEnd + ")包含" + count + "条数据===>" + elements.toString()); } } ) .print(); env.execute(); } } 上述代码的水位线(Watermark)是全局推进的,而不是针对每个key单独推进的;请优化水位线生成策略,动态生成水位线为不同key单独生成水位线,请给详细代码实现与设计思路
最新发布
11-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值