在猪中增加映射器

Posted

技术标签:

【中文标题】在猪中增加映射器【英文标题】:Increasing mapper in pig 【发布时间】:2014-05-16 13:18:50 【问题描述】:

我正在使用 pig 使用 CqlStorage 从 Cassandra 加载数据。我有 4 个数据节点,每个节点可以有 7 个映射器,Cassandra 中有大约 3000 万个数据。当我这样跑的时候

LOAD 'cql://keyspace/columnfamily' using CqlStorage 需要 27 个映射器才能运行。

但是如果我在加载函数中给出 where 子句,比如

LOAD 'cql://keyspace/columnfamily?where_clause=id%3D100' using CqlStorage 它总是需要一个映射器。

谁能帮我增加映射器

【问题讨论】:

Change File Split size in Hadoop的可能重复 这是专门针对具有 where 子句的 CqlStorage 的,虽然我尝试过更改拆分大小但仍然只有一个映射器。 注意:仅在我包含 where 子句的情况下。 【参考方案1】:

从您的 WHERE 子句看来,您的地图输入只会是一个键,这就是您只能获得一个映射器的原因。 Hadoop 将根据输入键的数量分配映射器。如果您只有一个输入键,则其他映射器将无能为力。

底线是,如果您在 where 子句中指定分区键,您将获得一个映射器(因为这是分发的方式)。根据 cmets,我认为您正在为不止一名学生进行分析,因此您没有理由指定分区键。您似乎也没有任何对二级索引有意义的列。所以我不确定你为什么还有 where 子句。

从您的数据模型看来,您必须映射所有数据才能获得学生和时间范围组合的总分。您可以更改为时间序列数据模型并在 where 子句中成功过滤,但您当前的模型不支持。

【讨论】:

可能是这样。您能否建议我可以使用哪个 API 来执行此操作,我的意思是通过在某些条件下过滤来从 cassandra 读取数据,这样我就不会给猪带来太多负担。 你能提供一些关于你想要做什么的细节吗? 感谢您的回复。我想从 Cassandra 加载数据并通过 pig 处理并将其转储到 HDFS。为此,我使用 CqlStorage。但是在这里我不想从 Cassandra 加载所有数据,我的标准就像加载 1 个月或 2 个月的数据,这样我就不会给 pig 处理繁重的负载,但是在 CqlStorage 中有过滤器(where 子句)看起来喜欢不工作issues.apache.org/jira/browse/CASSANDRA-6151。因此,我正在寻求有关任何其他替代解决方案的建议。 如果您发布您的数据模型会很有帮助。 C* 中的模式将是这样的table student( fn,ln,date,time,m1,m2,m3 PK((fn,ln,date),time))。我想在给定的日期/时间范围内汇总/提取给定学生的分数。一旦我将结果放入 hdfs,我就可以使用sqoop 将数据加载到rdbms。而我的报告会指向rdbms来显示一个学生的报告。

以上是关于在猪中增加映射器的主要内容,如果未能解决你的问题,请参考以下文章

如果映射器在中途失败并且 Hadoop 重试该映射器,自定义计数器会发生啥

MyBatis 生成器 - 生成映射器实现

根据映射器代码中的某些逻辑,将映射器中的一些数据(行)写入单独的目录

纯 Java MyBatis 映射器?

keycloak 客户端协议映射器(脚本映射器)将请求标头添加到令牌中

双层设备映射器 - 自定义 dm-crypt