我是新来的火花,所以我按照这个惊人的教程从sparkbyexamples.com和阅读我发现这一节:
洗牌分区大小
根据您的数据集大小,大量内核和内存PySpark洗牌可能会对您的工作有利或有害。当您处理的数据量较少时,通常应该减少无序分区,否则最终会得到许多分区文件,每个分区中的记录数较少。这会导致运行许多任务时需要处理的数据较少。
另一方面,当您有太多数据并且分区数量较少时,会导致运行时间较长的任务较少,有时您还可能会遇到内存溢出错误。
获得正确的随机分区大小总是很棘手的,并且需要多次运行不同的值才能实现优化的数量。当您在PySpark作业上遇到性能问题时,这是要寻找的关键属性之一。
有人能帮我理解你是如何决定你的工作需要多少个随机分区的吗?
正如你所说,这很棘手,但这是我的策略:
如果使用“静态分配”,意味着告诉Spark要为作业分配多少执行器,那么很容易,分区的数量可以是执行器*每个执行器的核心*系数<代码>系数=1表示每个执行器将处理1个作业,系数=2
表示每个执行器将处理2个作业,依此类推
如果您使用的是“动态分配”,那么它就更复杂了。您可以在此处阅读详细描述https://databricks.com/blog/2021/03/17/advertising-fraud-detection-at-scale-at-t-mobile.html.一般的想法是,您需要回答许多问题,如数据的大小(以GB计有多大)、数据的结构如何(有多少文件、多少文件夹、多少行等)、您将如何读取数据(从hdfs、hive或jdbc)、您有多少资源(核心、执行器、内存),…然后,您反复运行和基准测试,以找到“刚好”适合您的环境的最佳点。
更新#1:
那么一般的行业惯例是什么,公司会简单地使用第一策略并分配更多的硬件还是他们会使用动态分配?
通常,如果您有一个内部Hadoop环境,那么可以在静态(默认模式)和动态分配(高级模式)之间进行选择。此外,我经常从动态开始,因为我不知道数据及其转换有多大,所以请坚持使用动态,让我可以灵活地扩展工作,而不必过多考虑Spark配置。但如果愿意,也可以从静态开始,没有任何东西阻止您这样做。
最后,当涉及到productionize过程时,您还可以在静态(非常稳定但消耗更多资源)和动态(不太稳定,即有时由于资源分配而失败,但节省资源)之间进行选择。
最后,大多数Hadoop云解决方案(如数据库)默认带有动态分配,成本更低。
我有一个数据库单例,我想在应用程序完成时对其调用.close()。 我可以在Application类中的onCreate()中对数据库调用.open(),但在哪里调用.close()呢?
问题内容: 我们有一个Java服务器应用程序,该应用程序可以在许多计算机上运行,所有计算机都连接到Internet,其中一些位于防火墙后面。我们需要从一个中央站点远程更新JAR文件和启动脚本,而不会明显中断应用程序本身。 该过程必须无人值守且万无一失(即,由于不及时的互联网中断,我们无法中断应用程序)。 过去,我们使用各种外部脚本和实用程序来处理类似的任务,但是由于它们具有自己的依赖性,因此难
问题内容: 如何使用Math.random生成随机整数? 我的代码是: 它显示的全部是0,我该如何解决? 问题答案: 将abc转换为整数。
问题内容: 我使用Spark Web框架创建了一个Web应用程序,但是我不知道如何部署该Web应用程序。很抱歉,如果这是非常基本的内容,但我是Spark框架的新手,找不到任何指导我如何部署Spark WebApp的文档。 如何独立部署Spark WebApp 如何构建spark webapp(用于war文件或此类文件)以及如何通过Web服务器(jetty或Tomcat)进行部署。 问题答案: 首先
问题内容: 现有应用程序的类路径中有大量的JAR文件。一定要确保最初添加了所有JAR。显然没有使用某些JAR,我们已经删除了其中一些不需要的JAR,而没有引起任何问题。 如何确定正在使用哪些JAR,哪些是不需要的(除尝试和错误方法外)? 问题答案: Tattletale是一个很好的工具。它对字节码起作用,因此有可能通过反射使用某些类,而这些类不会出现在报告中。 这里( 链接不再有效 )是示例报告。