当前位置: 首页 > 面试题库 >

Hadoop中的流或自定义Jar

钮承恩
2023-03-14
问题内容

我正在使用以Python编写的mapper和reducer在Hadoop中(在Amazon
EMR上)运行流作业。我想知道如果我在Java中实现相同的mapper和reducer(或使用Pig),将会获得的速度提升。

特别是,我正在寻找人们从流媒体迁移到自定义jar部署和/或Pig的经验,以及包含这些选项的基准比较的文档。我找到了这个问题,但是答案对我来说不够具体。我不是要在Java和Python之间进行比较,而是要在Hadoop中的自定义jar部署与基于Python的流之间进行比较。

我的工作是从Google图书NGgram数据集中读取NGram计数并计算汇总度量。看来计算节点上的CPU利用率接近100%。(我也想听听您对同时进行CPU约束或IO约束作业的不同意见)。

谢谢!


问题答案:

为什么考虑部署自定义jar?

  • 能够使用更强大的自定义输入格式。对于流作业,即使您使用此处提到的可插拔输入/输出,也将映射器/缩减器的键和值限制为文本/字符串。您将需要花费一些CPU周期才能转换为所需的类型。
  • Ive还听说过Hadoop在跨多个Jobs重用JVM方面很聪明,这在流式传输时是不可能的(无法确认)

什么时候使用猪?

  • Pig Latin很酷,并且是比java / python或perl更高级的数据流语言。您的Pig脚本往往比编写任何其他语言的等效任务小得多

什么时候不使用猪?

  • 尽管Pig非常擅长于自己弄清楚有多少地图/缩小以及何时生成或缩小地图以及无数这样的事情,但是如果您不确定要多少张地图/缩小,则可以进行一些非常具体的计算您需要在Map / reduce函数中进行操作,并且对性能非常特定,那么您应该考虑部署自己的jar。此链接表明,猪的性能可能落后于原生的hadoop M / R。您也可以看一下编写自己的Pig UDF,它隔离了一些计算密集型功能(甚至可能使用JNI在UDF中调用某些本机C / C ++代码

关于IO和CPU绑定作业的说明:

  • 从技术上讲,hadoop和map reduce的重点是并行化计算密集型功能,因此我假设您的map和reduce作业是计算密集型的。当数据通过网络发送时,Hadoop子系统唯一的忙于IO的时间是在映射和缩减阶段之间。另外,如果您有大量数据,并且手动配置的映射太少,并减少了溢出到磁盘的数量(尽管太多的任务将导致花费太多时间启动/停止JVM和太多的小文件)。流作业会带来启动Python / Perl VM的额外开销,并使数据在JVM和脚本VM之间来回复制。


 类似资料:
  • 我计划将 Cadence 或临时工作流用于架构,但我们计划在决定工作流时为用户提供很大的权力。在他们的用例中,节奏和时间都提到他们的SDK支持自定义DSL,但我看不到该功能。你能帮帮我吗?

  • 问题内容: 在Map / Reduce期间,有什么方法可以设置和(以后)在Hadoop中获取自定义配置对象? 例如,假定一个应用程序预处理一个大文件并动态确定与该文件有关的某些特征。此外,假定那些特征保存在自定义Java对象(例如,但不是唯一的对象,因为某些可能不是字符串)中,并且随后对于每个映射和reduce作业都是必需的。 应用程序如何“传播”此配置,以便每个映射器和化简器功能在需要时可以访问

  • 一、环境 1、hadoop 0.20.2 2、操作系统Linux 二、背景 1、最近写MR的代码,总在想统计一些错误的数据出现的次数,发现如果都写在reduce的输出里太难看了,所以想找办法专门输出一些统计数字。 2、翻看《hadoop权威指南》第8章第1节的时候发现能够自定义计数器,但都是基于0.19版本写的,好多函数都不对,改动相对较大。 3、基于上面2个理由,写个文档,记录一下。 三、实现

  • 在自定义arrayAdapter中实现自定义getFilter时遇到问题。实际上,我不知道如何实现它。尝试了各种代码,但仍然没有成功。这是我的自定义阵列适配器。 这是ListTO课程。 这是布局图。 这里的搜索关键字来自“inputSearch”编辑文本。 这是文本更改的侦听器。 谢谢

  • 是否可以为Java8并行流指定自定义线程池?我到处都找不到它。 如果我不能为不同的模块使用不同的线程池,这就意味着我不能在大多数真实世界的情况下安全地使用并行流。 请尝试以下示例。有些CPU密集型任务在单独的线程中执行。这些任务利用并行流。第一个任务被打破,因此每一步需要1秒(通过线程Hibernate模拟)。问题是其他线程会被卡住,等待中断的任务完成。这是一个虚构的示例,但假设一个servlet

  • 问题内容: 是否可以为Java 8 并行流指定自定义线程池?我在任何地方都找不到。 假设我有一个服务器应用程序,并且想使用并行流。但是应用程序很大并且是多线程的,所以我想将其划分。我不希望一个模块中的一个模块中的某个模块运行缓慢,而另一个模块中的任务却运行缓慢。 如果不能为不同的模块使用不同的线程池,则意味着在大多数实际情况下,我不能安全地使用并行流。 请尝试以下示例。在单独的线程中执行一些CPU