-
java web折线图_基于javaweb的图形报表折线图的实现方法
2021-02-13 01:50:52统计图在浏览器中显示时,不同的用户对图形的显示形式有不同的要求,本文是爱站技术频道介绍的基于javaweb的图形报表折线图的实现方法,相信大家都了解了,需要的朋友可以参考下文学习哦。步骤说明:1. 导入log4j.jar...统计图在浏览器中显示时,不同的用户对图形的显示形式有不同的要求,本文是爱站技术频道介绍的基于javaweb的图形报表折线图的实现方法,相信大家都了解了,需要的朋友可以参考下文学习哦。
步骤说明:
1. 导入log4j.jar,jfreechart-0.9.18.jar,jdom.jar,jcommon-0.9.3.jar四个jar包
2. 在某个包中写入Tuxin.Java类
package com.mengya.util;
import java.awt.Color;
import java.awt.Font;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardLegend;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.LineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.DefaultCategoryDataset;
public class Line
{
private DefaultCategoryDataset dataset = new DefaultCategoryDataset();
public void setValue(int sum, String line, String wfield)
{
dataset.addValue(sum, line, wfield);
}
public String generateLineChart(String title,String wfield, String hfield, HttpSession session, PrintWriter pw,int wPhoto,int hPhoto)
{
String filename = null;
try
{
final JFreeChart chart = ChartFactory.createLineChart
(
title, // 图表标题
wfield, // 横轴的显示标签
hfield, // 纵轴的显示标签
dataset, //数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例
true, // 是否生成提示工具 tooltips
false // 是否生成URL链接
);
StandardLegend legend = (StandardLegend) chart.getLegend();//生成图例
legend.setDisplaySeriesShapes(true);//显示图例形状
legend.setShapeScaleX(1.5);//设置图例X轴的大小
legend.setShapeScaleY(1.5);//设置图例Y轴的大小
legend.setDisplaySeriesLines(true);//显示图示项的横线
//设置图片的背景色
chart.setBackgroundPaint(new java.awt.Color(189,235,255));
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(new Color(239,251,255));//生成图片中墙体的背景色
plot.setRangeGridlinePaint(Color.black);//生成图片中格子线的颜色
// 没有数据时显示的消息
plot.setNoDataMessage("没有相关统计数据");
plot.setNoDataMessageFont(new Font("黑体", Font.CENTER_BASELINE, 16));
plot.setNoDataMessagePaint(Color.RED);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());//设置图中的刻度线的单位
rangeAxis.setAutoRangeIncludesZero(true);//强制在自动选择的数据范围中包含0
LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
renderer.setDrawShapes(true);//折线的数据点根据分类使用不同的形状
renderer.setItemLabelsVisible(true);//显示每个点上的数据值的提示工具,数据标签是否可见
ChartRenderingInfo info = new ChartRenderingInfo(new
StandardEntityCollection());
//500是图片长度,300是图片高度
filename = ServletUtilities.saveChartAsPNG(chart, wPhoto, hPhoto, info, session);
ChartUtilities.writeImageMap(pw, filename, info);
pw.flush();
}
catch(Exception e)
{
e.printStackTrace();
}
return filename;
}
}
3. 配置web.xml,在web.xml中添加如下内空:
DisplayChartorg.jfree.chart.servlet.DisplayChartDisplayChart/DisplayChart
4. 在要显示图片的jsp中添加内容:
折线图
以上是基于javaweb的图形报表折线图的实现方法,看完后你明白了吗?想要了解更多相关资讯的朋友还可以收藏js.aizhan.com哦。
-
java web折线图_JavaWeb图形报表折线图 | 学步园
2021-02-13 01:50:53} } 3,配置web.xml,在web.xml中添加如下内空: DisplayChart org.jfree.chart.servlet.DisplayChart DisplayChart /DisplayChart 4,在要显示图片的jsp中添加内容:折线图 Line tt = new Line(); //第一条折线 List ar...步骤说明:
1,导入log4j.jar,jfreechart-0.9.18.jar,jdom.jar,jcommon-0.9.3.jar四个jar包
2,在某个包中写入Tuxin.java类
package com.mengya.util;
import java.awt.Color;
import java.awt.Font;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardLegend;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.LineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.DefaultCategoryDataset;
public class Line
{
private DefaultCategoryDataset dataset = new DefaultCategoryDataset();
public void setValue(int sum, String line, String wfield)
{
dataset.addValue(sum, line, wfield);
}
public String generateLineChart(String title,String wfield, String hfield, HttpSession session, PrintWriter pw,int wPhoto,int hPhoto)
{
String filename = null;
try
{
final JFreeChart chart = ChartFactory.createLineChart
(
title, // 图表标题
wfield, // 横轴的显示标签
hfield, // 纵轴的显示标签
dataset, //数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例
true, // 是否生成提示工具 tooltips
false // 是否生成URL链接
);
StandardLegend legend = (StandardLegend) chart.getLegend();//生成图例
legend.setDisplaySeriesShapes(true);//显示图例形状
legend.setShapeScaleX(1.5);//设置图例X轴的大小
legend.setShapeScaleY(1.5);//设置图例Y轴的大小
legend.setDisplaySeriesLines(true);//显示图示项的横线
//设置图片的背景色
chart.setBackgroundPaint(new java.awt.Color(189,235,255));
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(new Color(239,251,255));//生成图片中墙体的背景色
plot.setRangeGridlinePaint(Color.black);//生成图片中格子线的颜色
// 没有数据时显示的消息
plot.setNoDataMessage("没有相关统计数据");
plot.setNoDataMessageFont(new Font("黑体", Font.CENTER_BASELINE, 16));
plot.setNoDataMessagePaint(Color.RED);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());//设置图中的刻度线的单位
rangeAxis.setAutoRangeIncludesZero(true);//强制在自动选择的数据范围中包含0
LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
renderer.setDrawShapes(true);//折线的数据点根据分类使用不同的形状
renderer.setItemLabelsVisible(true);//显示每个点上的数据值的提示工具,数据标签是否可见
ChartRenderingInfo info = new ChartRenderingInfo(new
StandardEntityCollection());
//500是图片长度,300是图片高度
filename = ServletUtilities.saveChartAsPNG(chart, wPhoto, hPhoto, info, session);
ChartUtilities.writeImageMap(pw, filename, info);
pw.flush();
}
catch(Exception e)
{
e.printStackTrace();
}
return filename;
}
}
3,配置web.xml,在web.xml中添加如下内空:
DisplayChart
org.jfree.chart.servlet.DisplayChart
DisplayChart
/DisplayChart
4,在要显示图片的jsp中添加内容:
折线图Line tt = new Line();
//第一条折线
List ar = (ArrayList) request.getAttribute("arr1");
for (int i = 0; i < ar.size(); i++) {
StuBean bean = (StuBean) ar.get(i);
tt.setValue((int) bean.getS_money(), "张明学个人消费比例图", bean.getS_month()+ "");
}
//条二条折线
ar = (ArrayList) request.getAttribute("arr2");
for (int i = 0; i < ar.size(); i++) {
StuBean bean = (StuBean) ar.get(i);
tt.setValue((int) bean.getS_money(), "梦娅个人消费比例图", bean.getS_month()+ "");
}
//说明:tt.setValue(int a,String b,String c)
//其中的第二个参数b是该条折线的名字,每条折线的名字最好不要一样.
String filename = tt.generateLineChart("个人消费比例图", "月 份",
"费 用", session, new PrintWriter(out), 800, 550);
String graphURL = request.getContextPath()
+ "/DisplayChart?filename=" + filename;
%>
-
web 折线图大数据量拉取展示方案_对比多种微前端方案
2020-11-29 13:03:05帮你对比多种微前端方案一、写在前面在之前的文章中,我们已经深入剖析了微前端究竟是什么,可以带来什么收益,现在让我们复习一下微前端的概念:Techniques, strategies and recipes for building a modern web app...转自原文:帮你对比多种微前端方案
一、写在前面在之前的文章中,我们已经深入剖析了微前端究竟是什么,可以带来什么收益,现在让我们复习一下微前端的概念:
Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently.
中文释义:
可以由多个团队独立开发的现代web应用程序的技术、策略和方案。
本文则是在此基础上对现有的微前端解决方案进行对比总结,废话少说,让我们开始今天的课题。
二、现有微前端解决方案
查找了大量的资料后,我总结了以下主流的能够真正实现微前端概念的解决方案,如有遗漏,欢迎小伙伴们补充~
1、iframe
众所周知,
iframe
是html
提供的标签,能加载其他web应用的内容,并且它能兼容所有的浏览器,因此,你可以用它来加载任何你想要加载的web应用。iframe最大的特性就是提供了浏览器原生的硬隔离方案,不论是样式隔离、js 隔离这类问题统统都能被完美解决。读到这时,相信小伙伴们跟我一样,觉得iframe与微前端概念中提到的
独立开发
、独立维护
、相互隔离
非常的吻合,有种直接上ifame就完事儿了的想法,但为何它到现在也不是微前端主要的实现方式呢,后来有幸拜读了qiankun技术圆桌
中一篇关于微前端Why Not Iframe的思考,总结的很到位,现复述其中的一段描述iframe虽然基本能做到微前端所要做的所有事情,但它的最大问题也在于他的隔离性无法被突破,导致应用间上下文无法被共享,随之带来开发体验、产品体验的问题。
以下是我对该文中总结部分的总结:
- 不是单页应用,会导致浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。
- 弹框类的功能无法应用到整个大应用中,只能在对应的窗口内展示。
- 由于可能应用间不是在相同的域内,主应用的 cookie 要透传到根域名都不同的子应用中才能实现免登录效果。
- 每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程,占用大量资源的同时也在极大地消耗资源。
经过以上思考,我个人也有了一些拓展总结:
- iframe的特性导致搜索引擎无法获取到其中的内容,进而无法实现应用的seo
我猜,以上原因便是
iframe
没能作为官方微前端方案的原因吧。2、Web Components
或许很多小伙伴对
Web Components
不是很了解,它是由google
推出的浏览器的原生组件,MDN
对Web Components的定义是这样的:作为开发者,我们都知道尽可能多的重用代码是一个好主意。这对于自定义标记结构来说通常不是那么容易 — 想想复杂的HTML(以及相关的样式和脚本),有时您不得不写代码来呈现自定义UI控件,并且如果您不小心的话,多次使用它们会使您的页面变得一团糟。 Web Components旨在解决这些问题 — 它由三项主要技术组成,它们可以一起使用来创建封装功能的定制元素,可以在你喜欢的任何地方重用,不必担心代码冲突。
它的三项主要技术是指:
- Custom elements(自定义元素):一组JavaScript API,允许您定义custom elements及其行为,然后可以在您的用户界面中按照需要使用它们。
- Shadow DOM(影子DOM):一组JavaScript API,用于将封装的“影子”DOM树附加到元素(与主文档DOM分开呈现)并控制其关联的功能。通过这种方式,您可以保持元素的功能私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突。
- HTML templates(HTML模板):
<template>
和<slot>
元素使您可以编写不在呈现页面中显示的标记模板。然后它们可以作为自定义元素结构的基础被多次重用。
通过以上描述,再结合微前端的概念,我们来看看
Web Components
是如何做到微前端:- 技术栈无关:
Web Components
是浏览器原生组件,那即是在任何框架中都可以使用。 - 独立开发:使用
Web Components
开发的应用无需与其他应用间产生任何关联。 - 应用间隔离:
Shadow DOM
的特性,各个引入的微应用间可以达到相互隔离的效果。
综上所述,
Web Components
是有能力以组件加载的方式将微应用整合在一起作为微前端的一种手段,但不幸的是,Web Components
是浏览器的新特性,所以它的兼容性不是很好,如果有兼容性要求的项目还是无法使用,具体请查看can i use。3、ESM
ESM
是ES Module
的缩写,是Ecma script 2015
中提出的一种前端模块化手段,那么,它又是如何做到微前端的呢?其实,微前端无外乎三大特性,无技术栈限制
、应用单独开发
,多应用整合
,只要抓住了这三个特性,那就不难理解ESM
如何做的了:- 无技术栈限制:
ESM
加载的只是js内容,无论哪个框架,最终都要编译成js,因此,无论哪种框架,ESM
都能加载。 - 应用单独开发: ESM只是js的一种规范,不会影响应用的开发模式。
- 多应用整合: 只要将微应用以
ESM
的方式暴露出来,就能正常加载。 - 远程加载模块:
ESM
能够直接请求cdn
资源,这是它与生俱来的能力。
ESM
是能做到微前端的核心思想,但是它也存在着兼容性这一大弊端,尽管ESM
已经很优秀了,但是大部分老版的浏览器仍然无法直接使用,这也是babel等编译工具出现的原因,幸运的是,他可以通过webpack
、rollup
、esbuild
、snowpack
等编译工具成为兼容性的代码。4、qiankun
在微前端界,
qiankun
算得上是最早成型且知名度最广的框架了,它是真正意义上的单页微前端框架,那么qiankun
到底有哪些特点呢,在其官网中我找到了如下概括:- 基于
single-spa
封装,提供了更加开箱即用的 API - 技术栈无关,任意技术栈的应用均可 使用/接入,不论是 React/Vue/Angular/JQuery 还是其他等框架
- HTML Entry 接入方式,让你接入微应用像使用 iframe 一样简单
- 样式隔离,确保微应用之间样式互相不干扰
- JS 沙箱,确保微应用之间 全局变量/事件 不冲突
- 资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度
- umi 插件,提供了 @umijs/plugin-qiankun 供 umi 应用一键切换成微前端架构系统
除了最后一点拓展以外,微前端想要达到的效果都已经达到。
5、EMP
EMP是由欢聚时代业务中台自主研发的最年轻的单页微前端解决方案
那么,他有哪些特性呢,下面我们一起看看:
- 基于
Webpack5
的新特性Module Federation
实现,达到第三方依赖共享,减少不必要的代码引入的目的,什么是Module Federation这里就不再赘述。 - 每个微应用独立部署运行,并通过cdn的方式引入主程序中,因此只需要部署一次,便可以提供给任何基于
Module Federation
的应用使用。并且此部分代码是远程引入,无需参与应用的打包。 - 动态更新微应用:
EMP
是通过cdn
加载微应用,因此每个微应用中的代码有变动时,无需重新打包发布新的整合应用便能加载到最新的微应用。 - 去中心化,每个微应用间都可以引入其他的微应用,无中心应用的概念。
- 跨技术栈组件式调用,提供了在主应用框架中可以调用其他框架组件的能力(目前已支持互相调用的框架及使用方式请参阅官方文档)。
- 按需加载,开发者可以选择只加载微应用中需要的部分,而不是强制只能将整个应用全部加载。
- 应用间通信,每一个应用都可以进行状态共享,就像在使用npm模块进行开发一样便捷。
- 生成对应技术栈模板,它能像
cerate-react-app
一样,也能像create-vue-app
一样,通过指令一键搭建好开发环境,减少开发者的负担。 - 远程拉取ts声明文件,
emp-cli
中内置了拉取远程应用中代码声明文件的能力,让使用ts开发的开发者不再为代码报错而烦恼。
细心的小伙伴应该发现,
EMP
除了具备微前端的能力外,还实现了跨应用状态共享、跨框架组件调用的能力,这是现有框架所不具备的优秀特性!三. 总结
又到了下课的最后五分钟时间,一起来看看今天的分享都有哪些关键的知识需要掌握:
- 现有微前端解决方案:
- iframe
- Web Components
- ESM
- qiankun
- EMP
- 各解决方案的利弊:
iframe
可以直接加载其他应用,但无法做到单页导致许多功能无法正常在主应用中展示。web Components
及ESM
是浏览器提供给开发者的能力,能在单页中实现微前端,不过后者需要做好代码隔离,并且他们都是浏览器的新特性,都存在兼容性问题,微前端方面的探索也不成熟,只能作为面向未来的微前端手段。qiankun
基本上可以称为单页版的iframe,具有沙箱隔离及资源预加载的特点,几乎无可挑剔。但可能存在以下几点不足:- 对于React 深度定制项目来说,无法做到状态管理很好的传递
- 对于非标准的AMD、UMD、SystemJS 等加载方式的库会存在依赖问题(需要针对性改造)
- 多框架实现体积过大以及存在一定的调试成本
EMP
作为最年轻微前端解决方案,也是吸收了许多web优秀特性才诞生的,它在实现微前端的基础上,扩充了跨应用状态共享、跨框架组件调用、远程拉取ts声明文件、动态更新微应用等能力。同时,细心的小伙伴应该已经发现,EMP
能做到第三方依赖的共享,使代码尽可能地重复利用,减少加载的内容。
以下表格为各解决方案的总结:
解决方案 相对特点 缺点 分享到此结束,对EMP微前端方案感兴趣的话,可以从这里学习到更多内容:
- 基础知识解析
什么是微前端
对比多种微前端方案
webpack5 module Federation原理学习
EMP的设计架构 - 快速入门
react项目如何使用和接入EMP
vue项目如何使用和接入EMP
辅助插件的使用教程 - 进阶教程
Vue和React项目如何互相远程调用
cocos2d 项目如何使用和接入EMP
教你基站搭建技巧
-
web 折线图大数据量拉取展示方案_Spark 数据倾斜解决方案
2020-11-21 19:50:564 解决方案四:使用随机key实现双重聚合 当使用了类似于groupByKey、reduceByKey这样的算子时,可以考虑使用随机key实现双重聚合,如图3-1所示: 图3-1 随机key实现双重聚合 首先,通过map算子给每个数据的key添加...Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题。
例如,reduce点一共要处理100万条数据,第一个和第二个task分别被分配到了1万条数据,计算5分钟内完成,第三个task分配到了98万数据,此时第三个task可能需要10个小时完成,这使得整个Spark作业需要10个小时才能运行完成,这就是数据倾斜所带来的后果。
注意,要区分开数据倾斜与数据量过量这两种情况,数据倾斜是指少数task被分配了绝大多数的数据,因此少数task运行缓慢;数据过量是指所有task被分配的数据量都很大,相差不多,所有task都运行缓慢。
数据倾斜的表现:
- Spark作业的大部分task都执行迅速,只有有限的几个task执行的非常慢,此时可能出现了数据倾斜,作业可以运行,但是运行得非常慢;
- Spark作业的大部分task都执行迅速,但是有的task在运行过程中会突然报出OOM,反复执行几次都在某一个task报出OOM错误,此时可能出现了数据倾斜,作业无法正常运行。
定位数据倾斜问题:
- 查阅代码中的shuffle算子,例如reduceByKey、countByKey、groupByKey、join等算子,根据代码逻辑判断此处是否会出现数据倾斜;
- 查看Spark作业的log文件,log文件对于错误的记录会精确到代码的某一行,可以根据异常定位到的代码位置来明确错误发生在第几个stage,对应的shuffle算子是哪一个(通过yarn8088登陆去查看log跳转到spark日志)
1 解决方案一:聚合原数据
- 避免shuffle过程·
绝大多数情况下,Spark作业的数据来源都是Hive表,这些Hive表基本都是经过ETL之后的昨天的数据。
为了避免数据倾斜,我们可以考虑避免shuffle过程,如果避免了shuffle过程,那么从根本上就消除了发生数据倾斜问题的可能。
如果Spark作业的数据来源于Hive表,那么可以先在Hive表中对数据进行聚合,例如按照key进行分组,将同一key对应的所有value用一种特殊的格式拼接到一个字符串里去,这样,一个key就只有一条数据了;之后,对一个key的所有value进行处理时,只需要进行map操作即可,无需再进行任何的shuffle操作。通过上述方式就避免了执行shuffle操作,也就不可能会发生任何的数据倾斜问题。
对于Hive表中数据的操作,不一定是拼接成一个字符串,也可以是直接对key的每一条数据进行累计计算。
要区分开,处理的数据量大和数据倾斜的区别。
- 缩小key粒度(增大数据倾斜可能性,降低每个task的数据量)
key的数量增加,可能使数据倾斜更严重。
- 增大key粒度(减小数据倾斜可能性,增大每个task的数据量)
如果没有办法对每个key聚合出来一条数据,在特定场景下,可以考虑扩大key的聚合粒度。
例如,目前有10万条用户数据,当前key的粒度是(省,城市,区,日期),现在我们考虑扩大粒度,将key的粒度扩大为(省,城市,日期),这样的话,key的数量会减少,key之间的数据量差异也有可能会减少,由此可以减轻数据倾斜的现象和问题。(此方法只针对特定类型的数据有效,当应用场景不适宜时,会加重数据倾斜)
2 解决方案二:过滤导致倾斜的key
如果在Spark作业中允许丢弃某些数据,那么可以考虑将可能导致数据倾斜的key进行过滤,滤除可能导致数据倾斜的key对应的数据,这样,在Spark作业中就不会发生数据倾斜了。
比如,数据中的key的值中会有null,且这样的数据很多,那么在shuffle时会将key为null的数据放到一个task中执行,那么这个task肯定会执行的很慢,会倾斜。解决方式是给值为null的key添加随机值,目的是把这样的数据打散。
3 解决方案三:提高shuffle操作中的reduce并行度
当方案一和方案二对于数据倾斜的处理没有很好的效果时,可以考虑提高shuffle过程中的reduce端并行度,reduce端并行度的提高就增加了reduce端task的数量,那么每个task分配到的数据量就会相应减少,由此缓解数据倾斜问题。
- reduce端并行度的设置
在大部分的shuffle算子中,都可以传入一个并行度的设置参数,比如reduceByKey(500),这个参数会决定shuffle过程中reduce端的并行度,在进行shuffle操作的时候,就会对应着创建指定数量的reduce task。对于Spark SQL中的shuffle类语句,比如group by、join等,需要设置一个参数,即spark.sql.shuffle.partitions,该参数代表了shuffle read task的并行度,该值默认是200,对于很多场景来说都有点过小。
增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。举例来说,如果原本有5个key,每个key对应10条数据,这5个key都是分配给一个task的,那么这个task就要处理50条数据。而增加了shuffle read task以后,每个task就分配到一个key,即每个task就处理10条数据,那么自然每个task的执行时间都会变短了。本质是达到一个task处理一个key的数据。
- reduce端并行度设置存在的缺陷
提高reduce端并行度并没有从根本上改变数据倾斜的本质和问题(方案一和方案二从根本上避免了数据倾斜的发生),只是尽可能地去缓解和减轻shuffle reduce task的数据压力,以及数据倾斜的问题,适用于有较多key对应的数据量都比较大的情况。
该方案通常无法彻底解决数据倾斜,因为如果出现一些极端情况,比如某个key对应的数据量有100万,那么无论你的task数量增加到多少,这个对应着100万数据的key肯定还是会分配到一个task中去处理,因此注定还是会发生数据倾斜的。所以这种方案只能说是在发现数据倾斜时尝试使用的第一种手段,尝试去用最简单的方法缓解数据倾斜而已,或者是和其他方案结合起来使用。
在理想情况下,reduce端并行度提升后,会在一定程度上减轻数据倾斜的问题,甚至基本消除数据倾斜;但是,在一些情况下,只会让原来由于数据倾斜而运行缓慢的task运行速度稍有提升,或者避免了某些task的OOM问题,但是,仍然运行缓慢,此时,要及时放弃方案三,开始尝试后面的方案。
4 解决方案四:使用随机key实现双重聚合
当使用了类似于groupByKey、reduceByKey这样的算子时,可以考虑使用随机key实现双重聚合,如图3-1所示:
图3-1 随机key实现双重聚合
首先,通过map算子给每个数据的key添加随机数前缀,对key进行打散,将原先一样的key变成不一样的key,然后进行第一次聚合,这样就可以让原本被一个task处理的数据分散到多个task上去做局部聚合;随后,去除掉每个key的前缀,再次进行聚合。
此方法对于由groupByKey、reduceByKey这类算子造成的数据倾斜由比较好的效果,仅仅适用于聚合类的shuffle操作,适用范围相对较窄。如果是join类的shuffle操作,还得用其他的解决方案。
此方法也是前几种方案没有比较好的效果时要尝试的解决方案。
5 解决方案五:将reduce join转换为map join
正常情况下,join操作都会执行shuffle过程,并且执行的是reduce join,也就是先将所有相同的key和对应的value汇聚到一个reduce task中,然后再进行join。普通join的过程如下图所示:
图3-2 普通join过程
普通的join是会走shuffle过程的,而一旦shuffle,就相当于会将相同key的数据拉取到一个shuffle read task中再进行join,此时就是reduce join。但是如果一个RDD是比较小的,则可以采用广播小RDD全量数据+map算子来实现与join同样的效果,也就是map join,此时就不会发生shuffle操作,也就不会发生数据倾斜。
(注意,RDD是并不能进行广播的,只能将RDD内部的数据通过collect拉取到Driver内存然后再进行广播)
- 核心思路:
不使用join算子进行连接操作,而使用Broadcast变量与map类算子实现join操作,进而完全规避掉shuffle类的操作,彻底避免数据倾斜的发生和出现。将较小RDD中的数据直接通过collect算子拉取到Driver端的内存中来,然后对其创建一个Broadcast变量;接着对另外一个RDD执行map类算子,在算子函数内,从Broadcast变量中获取较小RDD的全量数据,与当前RDD的每一条数据按照连接key进行比对,如果连接key相同的话,那么就将两个RDD的数据用你需要的方式连接起来。
根据上述思路,根本不会发生shuffle操作,从根本上杜绝了join操作可能导致的数据倾斜问题。
当join操作有数据倾斜问题并且其中一个RDD的数据量较小时,可以优先考虑这种方式,效果非常好。其实这种方式如同hive中的map join优化,即 /*+ mapjoin(table) */ 写法,所以思想很多时候都是一样的。
map join的过程如图3-3所示:
图3-3 map join过程
- 不适用场景分析:
由于Spark的广播变量是在每个Executor中保存一个副本,如果两个RDD数据量都比较大,那么如果将一个数据量比较大的 RDD做成广播变量,那么很有可能会造成内存溢出。
6 解决方案六:sample采样对倾斜key单独进行join
在Spark中,如果某个RDD只有一个key,那么在shuffle过程中会默认将此key对应的数据打散,由不同的reduce端task进行处理。
当由单个key导致数据倾斜时,可有将发生数据倾斜的key单独提取出来,组成一个RDD,然后用这个原本会导致倾斜的key组成的RDD根其他RDD单独join,此时,根据Spark的运行机制,此RDD中的数据会在shuffle阶段被分散到多个task中去进行join操作。倾斜key单独join的流程如图3-4所示:
图3-4 倾斜key单独join流程
- 适用场景分析:
对于RDD中的数据,可以将其转换为一个中间表,或者是直接使用countByKey()的方式,看一个这个RDD中各个key对应的数据量,此时如果你发现整个RDD就一个key的数据量特别多,那么就可以考虑使用这种方法。
当数据量非常大时,可以考虑使用sample采样获取10%的数据,然后分析这10%的数据中哪个key可能会导致数据倾斜,然后将这个key对应的数据单独提取出来。
- 不适用场景分析:
如果一个RDD中导致数据倾斜的key很多,那么此方案不适用。
7 解决方案七:使用随机数以及扩容进行join
如果在进行join操作时,RDD中有大量的key导致数据倾斜,那么进行分拆key也没什么意义,此时就只能使用最后一种方案来解决问题了,对于join操作,我们可以考虑对其中一个RDD数据进行扩容,另一个RDD进行稀释后再join。
我们会将原先一样的key通过附加随机前缀变成不一样的key,然后就可以将这些处理后的“不同key”分散到多个task中去处理,而不是让一个task处理大量的相同key。这一种方案是针对有大量倾斜key的情况,没法将部分key拆分出来进行单独处理,需要对整个RDD进行数据扩容,对内存资源要求很高。
- 核心思想:
选择一个RDD,使用flatMap进行扩容,对每条数据的key添加数值前缀(1~N的数值),将一条数据映射为多条数据;(扩容)
选择另外一个RDD,进行map映射操作,每条数据的key都打上一个随机数作为前缀(1~N的随机数);(稀释)
将两个处理后的RDD,进行join操作。
图3-6 使用随机数以及扩容进行join
- 局限性:
如果两个RDD都很大,那么将RDD进行N倍的扩容显然行不通;
使用扩容的方式只能缓解数据倾斜,不能彻底解决数据倾斜问题。
- 使用方案七对方案六进一步优化分析:
当RDD中有几个key导致数据倾斜时,方案六不再适用,而方案七又非常消耗资源,此时可以引入方案七的思想完善方案六:
- 对包含少数几个数据量过大的key的那个RDD,通过sample算子采样出一份样本来,然后统计一下每个key的数量,计算出来数据量最大的是哪几个key。
- 然后将这几个key对应的数据从原来的RDD中拆分出来,形成一个单独的RDD,并给每个key都打上n以内的随机数作为前缀,而不会导致倾斜的大部分key形成另外一个RDD。
- 接着将需要join的另一个RDD,也过滤出来那几个倾斜key对应的数据并形成一个单独的RDD,将每条数据膨胀成n条数据,这n条数据都按顺序附加一个0~n的前缀,不会导致倾斜的大部分key也形成另外一个RDD。
- 再将附加了随机前缀的独立RDD与另一个膨胀n倍的独立RDD进行join,此时就可以将原先相同的key打散成n份,分散到多个task中去进行join了。
- 而另外两个普通的RDD就照常join即可。
- 最后将两次join的结果使用union算子合并起来即可,就是最终的join结果。
-
web 折线图大数据量拉取展示方案_运营人必看|您还在用折线图吗?可视化数据分析已成运营必备技能...
2020-12-12 12:33:53除了传统的饼图、柱状图、折线图等常见图形,还有气泡图、面积图、省份地图、词云、瀑布图、漏斗图等酷炫图表,甚至还有GIS地图。这些种类繁多的图形能满足不同的展示和分析需求。 传统的数据分析图与可视化数据分析... -
web 折线图大数据量拉取展示方案_加载耗时优化方案(上)
2020-12-06 02:17:31图1- 常规拉取流程 图2-预拉取流程 如上图所示,预拉取的最关键的问题在于:何时触发预拉取? 用户自然希望每次拉取时,客户端都把数据拉取好,这样每次都可以体会到瞬间拉取的效果。那么最直接的方法就是:在一切... -
web 折线图大数据量拉取展示方案_7大知识点:轻松入门数据可视化
2020-12-06 03:25:27五、选择具体的可视化形式 明确了我们要借助图表传递什么信息以后我们就可以着手选择合适的图表了,这里我们借助于《数据之美》作者提出的观点,不是列举什么柱状图、折线图等具体的图表,而是介绍一些组成这些图表... -
web 折线图大数据量拉取展示方案_说几句对缓存这块学习的大实话。
2020-12-11 02:45:58后来我阅读了 Soul 网关的源码,它的本地缓存更新机制如下图所示,共支持 3 种策略: ▍zookeeper watch机制soul-admin 在启动的时候,会将数据全量写入 zookeeper,后续数据发生变更时,会增量更新 zookeeper 的... -
web 折线图大数据量拉取展示方案_分布式、服务化的企业级 ERP 系统架构设计方案...
2020-12-02 10:11:03如下图所示,仓库管理方法首先获取本地库存表的物料编码、和仓库表的仓库名称字段信息,并且分页完后最终准备返回20条数据到Web模块前,将这20条数据中的物料ID作为参数请求商品模块子系统,商品子系统返回这20个... -
web 折线图大数据量拉取展示方案_UCloud人工智能解决方案,为智能产业量身定制的云服务...
2020-12-13 05:32:26UCloud人工智能解决方案,为智能产业量身定制的云服务 - 老刘博客www.laoliublog.cn人工智能解决方案提供AI训练、AI在线服务、GPU云主机等产品和服务,实现一站式人工智能任务托管,普遍适用于图片识别、音视频处理... -
web 折线图大数据量拉取展示方案_大数据简介:从数据到大数据,数据技术&工具的演变...
2020-12-10 22:03:31最近在看大数据相关的书和资料,顺便梳理下笔记,于是有了本文本文将用4张逻辑图为主线,简单介绍一个产品从“小数据”演化为“大数据”的过程,及可能用到的工具。(以下内容主要来自书籍和网络查询资料,如有错误... -
python web.py 实时显示折线图_Pyecharts数据可视化分析—折线图
2021-01-13 18:50:051. 实验介绍本实验主要介绍折线图理论与基于Python的折线图实现。1.1. 实验目的掌握折线图基本使用场景,使用Python的pyecharts模块实现折线图。1.2. 知识点折线图理论折线图实现2. 折线图理论线图介绍:线图也叫... -
web动态折线图_PowerBI作图技巧:折线图突出标识特定数据
2020-12-12 12:33:50某种情况下,我们需要将图表中...以折线图为例,标识出周末的销售金额,以垂直阴影显示出来,下面是作图步骤.1,为日期表添加周末标记新建列,周末 = IF('日期表'[星期]>5,"Y")2,创建度量值,只显示周末数据点周... -
web 前端绘制折线_JavaWeb实现图形报表折线图的方法
2021-01-17 19:05:47本文实例讲述了JavaWeb实现图形报表折线图的方法。分享给大家供大家参考,具体如下:步骤说明:1. 导入log4j.jar,jfreechart-0.9.18.jar,jdom.jar,jcommon-0.9.3.jar四个jar包2. 在某个包中写入Tuxin.Java类package ... -
webChart使用-折线图
2013-03-26 15:49:00本篇文章将演示如何使用 WebChart 制作折线图。并通过示例介绍数据对象一些相关属性以及 ChartArea 的 Axis 的相关属性设置,并演示使用 WebChart 做交互式的设计。 注:版本ComponentOne.Studio.Enterprise.2006.... -
web 前端绘制折线_html5绘制折线图
2021-01-17 19:05:49html5绘制折线图详细代码(function (){window.addEventListener("load", function(){var data = [100,-1000,0,700];// 获取上下文var a_canvas = document.getElementById('a_canvas');var context = a_canvas.... -
【分享】asp.net WebChart 折线图、饼形图、柱状图
2019-07-25 15:36:44折线图形的数据库设计: idint namevarchar(50) dataTimedatetime 饼形图和柱状图使用同一个表的数据: id int name varchar(50) shuliang int 下面的ChartControl1、ChartControl2、ChartControl3都是... -
WebChart生成折线图,柱状图,饼状图
2012-08-09 17:22:48折线图形的数据库设计: id int name varchar(50) dataTimedatetime 饼形图和柱状图使用同一个表的数据: id int name varchar(50) shuliang int 下面的ChartControl1、... -
SpringBoot Web前端动态显示柱状图、折线图
2019-07-18 14:55:043. 需要将后台数据生成柱状图、折线图 在前台显示 问题: 如果将后台数据生成柱状图、折线图在前台显示 遇坑: 1. 使用Echart进行图片显示,后台传递数据,前台使用jquery显示 使用这种方法发现,网上... -
Web在jsp页面中生成柱状图,折线图,饼状图
2017-09-08 17:52:23一、前言 在实际开发过程中,柱状图,折线图,饼状图在一些OA,ERP中是非常常见的功能,特别是需求需求方是业务型,数据分析型公司,下面的例子简单实现了饼状图,柱状图,折线图在jsp中生成。(ps:新手上路,不喜勿... -
web动态折线图_快速生成 web app 动态展示机器学习项目
2020-12-12 12:33:52Streamlit一句话,Streamlit是一个可以用python编写web app的库,可以方便的动态展示你的机器学习的项目。优点你不需要懂html, css, js等,纯python语言编写web app包括web常用组件:文本框, 按钮,单选框,复选... -
用Jfreechar 实现基于web 的折线图
2014-11-24 11:34:32应项目的需求,要做一个折现统计图,具体的效果如下: 需求中可以在统计年度,季度,月,星期的。其中核心代码是: /** * 绘图 * @return * @throws IOException * @throws ParseException * @... -
Aspx折线图、柱状图示例(Web Chart)
2019-07-10 04:26:51Aspx折线图、柱状图示例(Web Chart) 吴剑 2007-01-22 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 这是一篇2007年的学习记录,最近在整理博客,之前在CSDN上有一个,之后在博客园上有... -
如何使用SAP UI5 web Component的React框架的柱状图和折线图
2020-02-09 14:14:44导入柱状图和折线图: import { BarChart, LineChart } from “@ui5/webcomponents-react-charts”; 在自定义的React Component里,为图标创建数据集和数据标签对应的JavaScript数组: 最后在React 自定义组件里... -
JFreechart折线图web实现
2012-07-14 12:27:24web.xml配置JFreeChart <servlet> <servlet-name>jfreechart</servlet-name> <servlet-class>org.jfree.chart.servlet.DisplayChart<... -
web 前端绘制折线_前端---HTML5如何制作一个折线图
2021-02-05 00:30:23在学习如何制作折线图,我们先学习一下canvas元素中CanvasRenderingContext2D对象提供的相关方法,通过使用坐标表换,开发者无须繁琐计算每个点的坐标,只需对坐标系整体表换即可.CanvasRenderingContext2D提供了如下的... -
asp使用webchart画图多折线图x轴坐标显示问题
2017-05-12 02:07:23asp中使用webchart画多折线图,x的坐标起始点为什么是一样的,有没有方法可以一张图画几条折线,x的值不同的吗? -
web 前端绘制折线_web前端开发之路——Android 自定义控件(天气趋势折线图)
2021-03-07 07:35:34@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (mElements == null || mElements.size() == 0) {return;}double max_up = getMaxUp();double min_down = getMinDown();... -
web 前端绘制折线_HTML5+CSS3从入门到精通 canvas绘制折线图详解
2021-01-17 19:05:47本篇教程探讨了HTML5+CSS3从入门到精通 canvas绘制折线图详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 。<遇到的问题:Retina屏上字体线条模糊问题解决方案:放大canvas的大小,然后... -
python 折线图_【python可视化】:bokeh:折线图、面积图
2020-12-07 05:26:17•本文字数:约800字•阅读时长:约3分钟•难度:1颗星Bokeh是一个专门针对Web浏览器的呈现...折线图-单线图#导入ColumnDataSource模块frombokeh.modelsimportColumnDataSourcedf=pd.DataFrame({'value':np.random.r...