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 -目录认证/
第二个,我不推荐,是untested,hacky,并且有以下先决条件:
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。