如何在 M1 Apple Silicon Mac 上成功安装 Snowflake 的 ODBC 驱动程序?

How do I install the ODBC driver for Snowflake successfully on an M1 Apple Silicon Mac?

我在让 Snowflake 的 ODBC 驱动程序在 M1 Apple Silicon Mac 运行ning Big Sur 上工作时遇到问题。

成功地遵循 the instructions on Snowflake's website 使我到达使用 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

我的 Snowflake 驱动程序安装到 /opt/snowflake/snowflakeodbc,所以这是正确的——我怀疑这是一个 M1 问题。我正在使用 the download mirror here 提供的驱动程序的 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. 

在其他 Whosebug 帖子中,人们提到了上述错误,这意味着缺少某种库(IODBC 配置不正确?),但我尝试了很多方法都无济于事。任何指导都会很棒。

Big Sur 是 macOS v11.n

Snowflake 支持 macOS 10.14 和 10.15 Supported OSs

因此,您尝试执行的操作不受支持且不太可能工作

对此进行了更多修改,发现它是 .dmgs 安装路径和 simba.snowflake.ini 中预设路径的产物。

您需要将 Snowflake 驱动程序指向 iODBC dylib(根据文档中的 sideswiping statement)——该驱动程序最初配置为在一个文件夹中查找 ODBC dylib(不是 iODBC)在路上。

当您安装 iODBC 驱动程序时,确认它已安装到 /usr/local/iODBC(这是我的 Silicon Mac 安装它的位置)——并且 /usr/local/iODBC/lib 具有 libiodbc.dylib 在里面。如果是这样,导航到您安装的雪花驱动程序目录(应该是 /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

确保注释掉任何其他 ODBCInstLib 行,以便只配置一个。这应该能让你在 M1 Mac.

上连接到 snowflake up 和 运行

有没有人让这个工作?我使用 excel w odbc 来刷新雪花文件,并尝试了多种方法来移动驱动程序等,并遵循了雪花指令,但从未奏效。我确实得到了并行工作 运行 windows 手臂,但更愿意在 Mac OS

中这样做

我们的一位团队成员建议了以下步骤,它对我们适用于 Apple M1 系列

  1. 安装最新的雪花驱动

  2. 使用 cmd 卸载基于 m1 的自制软件 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"

  3. 安装基于英特尔的自制软件 - 完成后重启终端 arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

  4. Re-install unixodbc arch -x86_64 brew install unixodbc

  5. 测试 isql -v Pattern

  6. 在您的 database.yml 文件中用于连接雪花进行以下更改- 将“dsn: ”替换为以下内容 conn_str: "Driver={PATH};Locale=en-US;uid={USER_NAME};pwd= {PASSWORD};server=<yours>.snowflakecomputing.com;role=<ROLE>;charset=UTF-8;warehouse=<WAREHOUSE>;database=<DATABASE>;schema=<SCHEMA>;"

我也有一个 M1(版本 Monterey 12.0),我 运行 在测试驱动程序时遇到了类似的问题。然而,当我尝试“真正的联系”时,它就像一个魅力。因此,也许您最好去测试“真实连接”以避免浪费时间进行此类测试。希望你觉得这很有用。

None 其他解决方案对我有用,但@kiran-kumawat 的回答让我走上了一条可行的道路。

问题的核心似乎是 odbc 代码正在寻找 arm64 架构驱动程序,但 Snowflake 在 x86_64 架构中提供它。通过安装 x86_64 版本的 odbc,我们能够成功地与驱动程序对话。

首先我卸载了 R 和 Rstudio。 (可能 sim-link 或在幕后进行一些更改以使其与现有安装一起使用,但我不确定)。

然后安装 rosetta(用于在体系结构之间进行转换的苹果软件)和使用它构建的自制软件版本。我将保留我的主要版本的自制软件。

softwareupdate --install-rosetta
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

然后使用该版本的自制软件安装 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

然后我们需要安装雪花驱动: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

/usr/local/etc/odbc.ini

[Snowflake]
Driver             = Snowflake Driver
uid                = <uid>
server             = <server>
role               = <role>
warehouse          = <warehouse>
authenticator      = externalbrowser

我们还需要修改simba.snowflake.ini文件。

它有点锁定所以 运行:

sudo chmod 646 /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini

然后

vim /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini

并找到未注释的 ODBCInstLib 行并将其更改为:

ODBCInstLib=/usr/local/Cellar/unixodbc/2.3.9_1/lib/libodbcinst.dylib

设置完成后,我可以成功使用此连接:

install.packages("DBI")
install.packages("odbc")
con <- DBI::dbConnect(odbc::odbc(), "Snowflake")