kgi*_*vi3 6 odbc r snowflake-cloud-data-platform apple-silicon apple-m1
我在让 Snowflake 的 ODBC 驱动程序在运行 Big Sur 的 M1 Apple Silicon Mac 上运行时遇到问题。
成功遵循Snowflake 网站上的说明后,我使用 DSN 从命令行(使用 iodbctest)测试驱动程序,结果出现以下错误:
1: SQLDriverConnect = [iODBC][Driver Manager]dlopen(/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib, 6): no suitable image found. Did find:
/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib: no matching architecture in universal wrapper
/opt/snowfl (0) SQLSTATE=00000
2: SQLDriverConnect = [iODBC][Driver Manager]Specified driver could not be loaded (0) SQLSTATE=IM003
Run Code Online (Sandbox Code Playgroud)
我的 Snowflake 驱动程序安装到/opt/snowflake/snowflakeodbc,所以这是正确的 - 我怀疑这具体是一个 M1 问题。我使用的是 2.24.1 版本的驱动程序,可从此处的下载镜像获取,驱动程序的路径为/etc/odbcinst.ini(/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib该路径存在,并且从我的所有研究看来,它应该是正确的)。
当我在 R 中通过 DBI 运行连接时,出现完全不同的错误:
Error: nanodbc/nanodbc.cpp:1021: 00000:
[Snowflake][ODBC] (11560) Unable to locate SQLGetPrivateProfileString function.
Run Code Online (Sandbox Code Playgroud)
在其他 StackOverflow 帖子中,人们引用了上述错误,这意味着缺少某种库(IODBC 未正确配置?),但我尝试了很多方法都无济于事。任何指导都会很棒。
对此进行了更多修改,并意识到它是 .dmgs 和 .dmg 中预设路径的安装路径的产物simba.snowflake.ini。
您需要将 Snowflake 驱动程序指向 iODBC dylib(根据文档中的sidewiping 语句)——该驱动程序最初配置为在路径上的文件夹中查找 ODBC dylib(不是 iODBC)。
当您安装 iODBC 驱动程序时,请验证它是否安装到/usr/local/iODBC(这是我的 Silicon Mac 安装它的位置)——并且它/usr/local/iODBC/lib已包含libiodbc.dylib在其中。如果是这样,请导航到已安装的 Snowflake 驱动程序目录(应该是/etc/snowflake)并更改simba.snowflake.ini文件 ( /etc/snowflake/snowflake/snowflakeodbc/universal/simba.snowflake.ini)。您想要取消注释并将最后一行更改为取消注释并指向 iODBC dylib 的完整路径(而不是默认的 ODBC dylib)。
# Darwin specific ODBCInstLib
# iODBC
ODBCInstLib=/usr/local/iODBC/lib/libiodbcinst.dylib
Run Code Online (Sandbox Code Playgroud)
确保注释掉任何其他 ODBCInstLib 行,以便仅配置一个。这应该使您能够建立与 Snowflake 的连接并在 M1 Mac 上运行。
其他解决方案都不适合我,但 @kiran-kumawat 的答案让我走上了一条有效的道路。
问题的核心似乎是 odbc 代码正在寻找 arm64 架构驱动程序,但 Snowflake 在 x86_64 架构中提供它。通过安装 x86_64 版本的 odbc,我们可以让它成功地与驱动程序通信。
首先我卸载了R和Rstudio。(也许可以在幕后进行模拟链接或更改,以使其与现有安装一起使用,但我不确定)。
然后安装rosetta(用于在架构之间进行转换的苹果软件)和用它构建的自制版本。我将自制程序的主要版本保留在原处。
softwareupdate --install-rosetta
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Run Code Online (Sandbox Code Playgroud)
然后使用该版本的 homebrew 安装 odbc、R 和 Rstudio。
arch -x86_64 /usr/local/Homebrew/bin/brew install unixodbc
arch -x86_64 /usr/local/Homebrew/bin/brew install --cask rstudio
arch -x86_64 /usr/local/Homebrew/bin/brew install --cask r
Run Code Online (Sandbox Code Playgroud)
然后我们需要安装雪花驱动程序:https://sfc-repo.snowflakecomputing.com/odbc/mac64/latest/index.html
单击所有安装提示。
修改你的文件
/usr/local/etc/odbcinst.ini:
[Snowflake Driver]
Driver = /opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib
Run Code Online (Sandbox Code Playgroud)
/usr/local/etc/odbc.ini
[Snowflake]
Driver = Snowflake Driver
uid = <uid>
server = <server>
role = <role>
warehouse = <warehouse>
authenticator = externalbrowser
Run Code Online (Sandbox Code Playgroud)
我们还需要修改 simba.snowflake.ini 文件。
它有点被锁定,所以运行:
sudo chmod 646 /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini
Run Code Online (Sandbox Code Playgroud)
然后
vim /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini
Run Code Online (Sandbox Code Playgroud)
并找到未注释的 ODBCInstLib 行并将其更改为:
ODBCInstLib=/usr/local/Cellar/unixodbc/2.3.9_1/lib/libodbcinst.dylib
Run Code Online (Sandbox Code Playgroud)
设置完成后,我能够成功使用此连接:
install.packages("DBI")
install.packages("odbc")
con <- DBI::dbConnect(odbc::odbc(), "Snowflake")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6115 次 |
| 最近记录: |