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

6

我在运行Big Sur操作系统的M1芯片的苹果电脑上使用Snowflake的ODBC驱动遇到了问题。

按照Snowflake网站上的说明,我已经成功安装了驱动程序,并尝试通过命令行(使用iodbctest)测试DSN。然而,结果出现以下错误:

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的问题。我正在使用从此处下载的版本为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. 

在其他 StackOverflow 帖子中,人们提到上述错误意味着缺少某种库(IODBC 配置不正确?),但我已尝试了许多东西,却没有任何效果。希望能提供一些指导。

1
暂时还不支持,但很快会支持。 - Felipe Hoffa
1
你好,你找到这个问题的解决方案了吗? - Kiran Kumawat
6个回答

7

对此进行了一些调整,发现这是由于安装路径和simba.snowflake.ini中的预设路径引起的问题。

您需要将Snowflake驱动程序指向iODBC dylib(根据文档中的侧滑语句),因为驱动程序最初配置为在路径上查找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)。您需要取消注释并修改最后一行,使其同时被取消注释并指向完整路径(而不是默认值,即ODBC dylib)。

# Darwin specific ODBCInstLib
#   iODBC
ODBCInstLib=/usr/local/iODBC/lib/libiodbcinst.dylib

确保注释掉其他ODBCInstLib行,只配置一个。这样可以使您在M1 Mac上成功建立与Snowflake的连接。


但请记住,这不是一个受支持的配置,因此实施此操作将由用户自行承担风险。 - NickW
@NickW 我认为这是配置文件中的错误,因为您只更改了simba.snowflake.ini文件以指向iODBC(令人困惑的是,该文件将文件路径注释为此,尽管它实际上指向ODBC安装)。但无论如何,这是一个好的标记。 - kgilvi3
谢谢您的回答,但是在/etc/snowflake/...下没有Snowflake驱动程序目录。根据文档,Snowflake安装在/opt/snowflake/snowflakeodbc/Library/ODBC中。 - Simon
@Simon 在这种情况下,你可以在 /opt/snowflake/snowflakeodbc/lib/universal 目录下找到 simba.snowflake.ini 文件。 - nescobar
这个完美地运行了(除了一些微小的路径不同)。只是想补充一下,为了解决一些编码错误导致odbc返回格式不正确的问题,我在安装了iODBC之后不得不重新安装odbc。请留意安装信息中是否出现了Found iodbc-config cflags and libs!以确保编译正确。 - Akhil Nair

5

其他解决方案对我都没有用,但是@kiran-kumawat的答案让我找到了解决方法。

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

首先我卸载了R和Rstudio。(可能可以通过符号链接或更改幕后的内容来使现有安装工作,但我不确定)。

然后安装Rosetta(将Apple软件翻译为不同体系结构的软件)和一个使用Rosetta构建的Homebrew版本。我保留了我的主要Homebrew版本。

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

然后使用该版本的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

我们需要安装雪花驱动程序: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")

3

Big Sur是macOS v11.n的版本。

Snowflake支持macOS 10.14和10.15操作系统(支持的操作系统)

所以您尝试的内容不受支持,也不太可能成功。


1

我们团队中的一位成员建议以下步骤,这对于苹果M1系列电脑起作用了:

  1. 安装最新的Snowflake驱动程序。

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

  3. 安装基于Intel的Homebrew - 安装完成后重新启动终端: arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

  4. 重新安装unixodbc: arch -x86_64 brew install unixodbc

  5. 测试: isql -v Pattern

  6. 在您的database.yml文件中,为连接到Snowflake进行以下更改 - 将"dsn: <DSN_NAME>"替换为以下内容: 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>;"


0
有人成功地做到了这一点吗?我使用 Excel 和 ODBC 刷新 Snowflake 文件,并尝试了多种方法来移动驱动程序等,遵循了 Snowflake 的说明,但从未成功过。我确实让 Parallels 在运行 Windows ARM 时工作了,但更喜欢在 Mac OS 中完成这项任务。

你没有检查链接吗?它仍然不受支持。 - NickW
这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - benson23

0
我也有一台M1(版本为Monterey 12.0),在测试驱动程序时遇到了类似的问题。然而,当我尝试使用“真实连接”时,它就像魔法般地工作了。因此,也许你可以去测试一下“真实连接”,以避免浪费时间使用这样的测试。希望你会觉得这很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接