0

如何在不使用 Microsoft rx 函数的情况下在 SQL Server 上执行正常的 R 代码?我认为ComputeContext“RxInSqlServer”不是正确的吗?但我找不到关于其他 ComputeContext 选项的好信息。

本声明可以做到这一点吗?

rxSetComputeContext(ComputeContext)

还是我只能用它来执行 rx 功能?另一个选项可能是在 RStudio 或 VisualStudio 中设置服务器连接?

我的问题是:我想通过 SQL Server 上的 ODBC-Connection 分析来自 hadoop 的数据,所以我想使用远程 SQL Server 的性能而不是 SQL Server 中的数据。然后我想用 sparklyr 分析 hadoop 数据。

摘要:我想使用远程服务器的性能而不是 SQL Server 数据。所以 RStudio 不应该在本地运行,它应该执行和使用远程服务器的内存。

谢谢!

4

1 回答 1

2

Microsoft R Server 中计算上下文的概念是“计算将在哪里执行?”</p>

设置计算上下文时,您是在告诉 Microsoft R Server 计算将发生在本地计算机上(使用“local”或“localpar”计算上下文),或者脚本将在具有 Microsoft R Server 的远程计算机上执行安装在它上面。远程计算上下文是通过创建计算上下文对象,然后将上下文设置为该对象来定义的。

对于 SQL Server,您将创建一个 RxInSqlServer() 对象,然后对该对象调用 rxSetComputeContext()。对于 Hadoop,对象将通过 RxHadoopMR() 调用创建。

在代码中,它看起来像:

CC <- RxHadoopMR( < context defined here > )
rxSetComputeContext(CC)

要查看定义上下文的用法,请参阅文档(在 R 客户端中输入“?RxHadoopMR”,不加引号)。

此后对“rx”函数的任何调用都将在 Hadoop 集群上执行,没有数据传输到客户端;除了结果。

RxInSqlServer() 将遵循相同的模式。

注意:要执行任何远程计算,必须在该计算机上安装 Microsoft R Server。

如果您希望在远程计算上下文上运行标准 R 函数,则必须将该函数包装在对 rxExec() 的调用中。rxExec() 被设计为并行化任何开源 R 函数并允许其在远程上下文中执行的接口。请参阅文档(在 R 客户端中输入“?rxExec”,不加引号)了解用法。

有关高效并行化的信息,请参阅此博客:https ://blogs.msdn.microsoft.com/microsoftrservertigerteam/2016/11/14/performance-optimization-when-using-rxexec-to-parallelize-algorithms/

您调用了“不使用 Microsoft rx 函数”,我将其解释为“我想在 SQL Server 中的数据上使用开源 R 算法”,对于 Microsoft R Server,您必须使用 rxExec() 作为运行 Open Source R 的接口。如果您根本不想使用 rx 函数,则需要将数据查询到本地计算机,然后使用 Open Source R。要使用 Microsoft R Server 与远程上下文交互,裸机最低使用 rxExec()。

这就是您如何能够实现您的问题的第一部分,“如何在不使用 Microsoft rx-functions 的情况下在 SQL Server 上执行正常的 R 代码?我认为 ComputeContext “RxInSqlServer”不是正确的?”


对于您的第二个问题,“我的问题是:我想通过 SQL Server 上的 ODBC-Connection 分析来自 hadoop 的数据,所以我想使用远程 SQL Server 的性能而不是 SQL Server 中的数据。然后我想要用 sparklyr 分析 hadoop 数据。”

首先,我想评论一下,随着 Microsoft R Server 9.1 的发布,您可以将 sparklyr 与 MRS Spark 连接一起使用,有关示例,请参阅此博客:https://blogs.msdn.microsoft。 com/microsoftrservertigerteam/2017/04/19/new-features-in-9-1-microsoft-r-server-with-sparklyr-interoperability/

其次,你正在尝试做的事情非常复杂。我可以想到两种可能的方法。

一种是,如果你有 SQL Server PolyBase,你可以配置 SQL Server 来制作一个虚拟表来引用 Hadoop 中的数据,类似于 Hive。在 SQl Server 中引用了 Hadoop 数据后,您将在这些表上使用 RxInSqlServer() 计算上下文。这将分析 SQL Server 中的数据,并将结果返回给客户端。

这是一个详细的博客,解释了 Cloudera 和 SQL Server 上的端到端设置:https ://blogs.msdn.microsoft.com/microsoftrservertigerteam/2016/10/17/integrating-polybase-with-cloudera-using-active -目录认证/

第二个,我推荐,是untestedhacky,并且有以下先决条件:

1) 您的 Hadoop 集群必须安装和配置 OpenSSH 2) 您的 SQL Server 计算机必须能够通过 SSH 连接到您的 Hadoop 集群 3) 您必须能够将 SSH 密钥放在 SQL Server 计算机上 R Services 所在的目录中进程有能力访问

而且我需要在此处添加另一个免责声明,无法保证此功能可以正常工作,并且很可能无法正常工作。该软件并非旨在以这种方式运行。

然后,您将执行以下操作:

  • 在您的客户端计算机上,您将定义一个自定义函数,其中包含您希望执行的分析,这可以是开源 R 函数、rx 函数或混合。
  • 在此自定义函数中,在调用任何其他 R 或 rx 函数之前,您将定义一个指向您的集群的 RxHadoopMR 计算上下文对象,引用 SQL Server 计算机上目录中的 SSH 密钥,就像您在该计算机上执行一样。(如果您要从您的客户端计算机执行远程 Hadoop 操作,您将定义 RxHadoopMR 对象的方式相同)。
  • 在这个自定义函数中,在定义 RxHadoopMR() 之后,您将立即在定义的 RxHadoopMR() 对象上调用 rxSetComputeContext()
  • 仍然在这个自定义函数中,编写将对 Hadoop 中的数据进行操作的实际脚本。
  • 定义此函数后,您将在客户端计算机上定义一个 RxInSqlServer() 计算上下文对象。
  • 您可以将计算上下文设置为 RxInSqlServer()
  • 然后,您将使用自定义函数作为输入调用 rxExec()。

这将在 SQL Server 机器上执行您的自定义函数,这有望使其将其计算上下文定义为您的 Hadoop 集群,并通过 SSH 拉取数据以在 SQL Server 机器上进行分析;将结果返回给客户端。

话虽如此,这不是 Microsoft R Server 的设计用途,如果您希望优化性能,请使用选项一并配置 PolyBase。

于 2017-04-24T20:29:47.270 回答