草庐IT

hadoop - 具有 gzip 格式的大文本文件的 Spark 作业

coder 2024-01-06 原文

我正在运行一个 Spark 作业,它花费了很长时间来处理输入文件。输入文件为 6.8 GB Gzip 格式,包含 1.1 亿行文本。我知道它是 Gzip 格式,所以它不可拆分,并且只有一个执行程序将用于读取该文件。

作为调试过程的一部分,我决定只看看将 gzip 文件转换为 parquet 需要多长时间。我的想法是,一旦我转换为 parquet 文件,然后如果我在该文件上运行我的原始 Spark 作业,在这种情况下它将使用多个执行程序并且输入文件将被并行处理。

但即使是小工作也比我预期的要花更长的时间。这是我的代码:

val input = sqlContext.read.text("input.gz")
input.write.parquet("s3n://temp-output/")

当我在我的笔记本电脑(16 GB RAM)中提取该文件时,它只用了不到 2 分钟。当我在 Spark 集群上运行它时,我的预期是它会花费相同甚至更少的时间,因为我使用的执行程序内存是 58 GB。大约用了 20 分钟。

我在这里错过了什么?如果这听起来很业余,我很抱歉,但我是 Spark 的新手。

在 gzip 文件上运行 Spark 作业的最佳方式是什么?假设我没有选择以其他文件格式(bzip2、snappy、lzo)创建该文件。

最佳答案

在执行输入-处理-输出类型的 Spark 作业时,需要考虑三个不同的问题:

  1. 输入并行度
  2. 处理并行
  3. 输出并行度

在您的情况下,输入并行度为 1,因为在您的问题中您声称您无法更改输入格式或粒度。

您基本上也没有进行任何处理,因此您无法在那里获得任何 yield 。

但是,您可以控制输出并行度,这会给您带来两个好处:

  • 多个 CPU 将写入,从而减少写入操作的总时间。

  • 您的输出将拆分为多个文件,以便您在以后的处理中利用输入并行性。

要增加并行度,您必须增加分区的数量,这可以通过 repartition() 来实现,例如,

val numPartitions = ...
input.repartition(numPartitions).write.parquet("s3n://temp-output/")

在选择最佳分区数时,需要考虑许多不同的因素。

  • 数据大小
  • 分区偏斜
  • 集群 RAM 大小
  • 集群中的核心数
  • 您将进行的后续处理类型
  • 您将用于后续处理的集群大小(RAM 和内核)
  • 您要写入的系统

在不知道您的目标和限制的情况下,很难提出可靠的建议,但这里有一些通用的指导原则:

  • 由于您的分区不会倾斜(上述 repartition 的使用将使用纠正倾斜的散列分区器),如果您设置分区等于执行器内核的数量,假设您使用的节点具有足够的 I/O。

  • 当您处理数据时,您确实希望整个分区能够“适应”分配给单个执行程序内核的 RAM。 “适合”在这里意味着什么取决于你的处理。如果您正在执行简单的 map 转换,则可能会流式传输数据。如果您正在做一些涉及订购的事情,那么 RAM 需要大幅增长。如果您使用的是 Spark 1.6+,您将受益于更灵活的内存管理。如果您使用的是早期版本,则必须更加小心。当 Spark 必须开始“缓冲”到磁盘时,作业执行就会停止。磁盘上的大小和内存中的大小可能非常非常不同。后者根据您处理数据的方式以及 Spark 可以从谓词下推中获得多少好处(Parquet 支持)而有所不同。使用 Spark UI 查看各个作业阶段需要多少 RAM。

顺便说一句,除非您的数据具有非常特定的结构,否则不要对分区号进行硬编码,因为这样您的代码将在不同大小的集群上以次优方式运行。相反,使用以下技巧来确定集群中执行程序的数量。然后,您可以根据所使用的机器乘以每个执行程序的内核数。

// -1 is for the driver node
val numExecutors = sparkContext.getExecutorStorageStatus.length - 1

作为引用,在我们的团队中,我们使用相当复杂的数据结构,这意味着 RAM 大小 >> 磁盘大小,我们的目标是将 S3 对象保持在 50-250Mb 范围内,以便在每个节点上进行处理执行器核心具有 10-20Gb RAM。

希望这对您有所帮助。

关于hadoop - 具有 gzip 格式的大文本文件的 Spark 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37760736/

有关hadoop - 具有 gzip 格式的大文本文件的 Spark 作业的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  4. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  7. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  8. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  9. ruby-on-rails - 如何在 Rails 中设置路由的默认格式? - 2

    路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。

  10. ruby-on-rails - Rails 4 WYSIWYG Bootsy 不显示格式 - 2

    我刚刚按照thebootsygempage上的安装说明进行操作在我保存并查看帖子内容之前,一切看起来都不错。这是输出在View中的样子:HeaderSubhead:似乎没有呈现任何html格式,因为它被引号或类似的东西转义了-其他人有这个问题吗?我没有在github页面或SO上看到任何问题来指出我正确的方向。除了遵循gem安装说明之外,我还没有做任何事情,但也许我错过了什么或者只是犯了一个愚蠢的错误。如果你还有什么想知道的,请尽管问。干杯 最佳答案 你需要有这样的东西,转义html: 关

随机推荐