mapr-fs 架构_具有二级索引的MapR-DB Spark连接器

mapr-fs 架构

与大数据空间上的任何其他工具相比,MapR数据平台具有明显的优势。 MapR-DB是平台的核心组件之一,它提供了先进的功能,可以摧毁大多数NoSQL数据库。

MapR-DB的一个重要附加功能是能够通过Connector for Apache Spark来使用Apache Spark进行编写和查询 使用此连接器非常方便,因为它可以使用不同的Spark API(例如RDD,DataFrame和Streams)从Spark读取和写入MapR-DB。

使用连接器,我们可以发出如下查询。

生成的类型是一个数据Dataframe ,我们可以将其用作其他来源的任何其他数据框,就像我们通常在Spark中一样。

如果我们随后过滤掉数据集,就会开始出现问题。 例如,让我们看下面的查询。

过滤器被下推,因此MapR-DB进行过滤,并且仅发送回符合过滤器的数据,从而减少了MapR-DB和Spark之间传输的数据量。 但是,如果在名字字段上创建了索引,则该索引将被忽略,并且将对表进行完全扫描,以尝试查找符合过滤条件的行。

通过在字段上建立索引,我们希望使用该索引,以便对该字段上的查询进行优化,从而最终加快计算速度。 提供的连接器根本没有使用此功能。

必要性

我们的团队MapR Professional Services知道使用MapR-DB二级索引进行过滤对于性能而言是巨大的,并且由于我们的许多客户实际上确实尝试利用此功能(二级索引),因此我们采取了不同的方法来强制使用使用Spark时的索引数量。

下一篇文章是由一位同事撰写的, 如何在OJAI中使用Spark使用二级索引 他在其中解释了解决现有问题的一些方法。

即使可以采取一些捷径,我们也必须放弃默认连接器具有的一些不错的构造,例如.loadFromMapRDB(...)

独立连接器

过去,我以太多方式扩展了Apache Spark。 我已经编写了自己的自定义数据源 ,最近又编写了一个用于Spark结构化流自定义流源

我再次冒险尝试编写自己的Spark数据源,但是这次是针对MapR-DB,因此我们充分利用了二级索引的全部优势,同时保持了与Apache Spark当前MapR-DB连接器相同的API。

在本文的结尾,我们将能够在完全使用二级索引的同时,通过以下方式编写查询。

Spark数据源版本2

以下数据源实现使用spark 2.3.1,并使用数据源API V2。

让我们开始看我们需要的东西。

  1. ReadSupportWithSchema ,使我们可以创建一个DataSourceReader。
  2. DataSourceReader允许我们获取数据的架构,同时需要指定如何创建DataReaderFactory
  3. SupportsPushDownFilters ,使我们能够拦截查询过滤器,以便将其下推到MapR-DB。
  4. SupportsPushDownRequiredColumns ,使我们可以拦截查询投影,因此可以将其下推到MapR-DB。

让我们从实现ReadSupportWithSchema开始。

如我们所见,从MapR-DB读取数据时,我们只需获取要使用的表路径和架构。 然后,将它们传递给MapRDBDataSourceReader

MapRDBDataSourceReader

MapRDBDataSourceReader实现了DataSourceReader ,我们还将在SupportsPushDownFiltersSupportsPushDownRequiredColumns进行混合,以表明我们希望将过滤器和投影向下推到MapR-DB。

projections变量将保存我们要projections的架构(如果有)。 如果我们没有通过.select显式地投影字段,则将所有字段投影在schema变量上。

readSchemaprojectionspruneColumns结合使用。 如果在我们的Spark查询中指定一个select则所选字段将传递给pruneColumns而这是我们将从MapR-DB中获得的唯一字段。

pushFilters指示我们在Spark查询的wherefilter子句中指定的filter 。 基本上,我们必须决定要向下推送到MapR-DB的哪些,其余的将在数据存储在内存中后由Spark应用。

在上面的代码段中,我们表明我们将仅下推两种类型的过滤器,即EqualTo GreaterThan 从MapR-DB加载数据后,除这两个过滤器以外的任何其他过滤器都不会下推,并且过滤将在内存(火花内存)中进行。

我们正在努力添加更多过滤器,以匹配当前的MapR-DB连接器。

createDataReaderFactories 创建一个数据读取器列表,这些数据读取器实际上在从我们的来源MapR-DB中进行繁重的读取工作。 在本例中,我们仅创建一个数据读取器,但理想情况下,每个MapR-DB区域/分区都只有一个读取器,因此我们可以利用MapR-DB提供的并行性。

MapRDBDataReaderFactory

我们几乎完成了,但是最重要的部分即将到来。

MapRDBDataReaderFactory 是我们实际构建MapR-DB查询并再次执行MapR-DB表的地方。 请注意,我们正在传递要读取的表格,要向下推的过滤器和投影。

现在,我们需要通过打开连接并创建文档存储对象来连接到MapR-DB。

createFilterCondition生成我们要针对MapR-DB执行的查询条件。 这是我们整个实施过程中最重要的部分。

在这里,我们将合并所有过滤器。 如我们所见,我们仅针对两种数据类型实现了两个受支持的过滤器,但是我们正在努力扩展此实现,以匹配当前的MapR-DB连接器。

query创建要发送到MapR-DB的最终命令。 该任务是将查询条件和投影应用于我们的connection对象的问题。

请务必注意,由于我们使用的是OJAI ,它将自动将所有二级索引用于我们正在应用的过滤器一部分的字段。 确保在本文结尾处检查输出。

documents是基于query来自MapR-DB的数据流。

createDataReader使用我们创建的流( documents )进行实际读取,并将数据返回给Spark。

使用我们的连接器

此时,我们准备通过以下方式将自定义数据源插入spark。

这使我们能够使用自己的方式从MapR-DB进行读取,以便所应用的任何作为物理表二级索引一部分的过滤器都将用于优化读取。

句法

为了维持与默认MapR-DB连接器提供的API类似的API,我们通过以下方式向我们的库中添加了一些语法。

现在,我们可以像使用默认连接器一样使用连接器。

使用MapR-DB二级索引

当我们运行上面的代码时, OJAITRACE输出看起来类似于以下内容。

请注意,它会自动使用称为uid_idx的索引,该索引是字段uid的索引,而该字段uid是同时在火花过滤器中使用的字段。

结论

MapR-DB是功能强大的工具,可作为MapR数据平台的一部分运行。 Spark连接器提供了一种与MapR-DB交互的有趣方式,因为它允许我们在使用此NoSQL系统时大规模使用所有Spark结构。 但是,有时默认连接器不够用,因为当我们最需要它们时,它不使用MapR-DB的二级索引功能。

另一方面,我们的实现模仿了Connector API,并确保实现的Spark数据源使用MapR-DB二级索引,因为它依赖于能够直接支持二级索引的纯OJAI查询。

我们的库代码可以在这里 MapRDBConnector 找到

免责声明:这是改善查询MapR-DB的独立工作。 该库不能替代 Apache Spark 的官方 连接器 由MapR提供,作为其发行的一部分。

翻译自: https://hackernoon.com/mapr-db-spark-connector-with-secondary-indexes-df41909f28ea

mapr-fs 架构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值