如何在 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 系列
安装最新的雪花驱动
使用 cmd 卸载基于 m1 的自制软件
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"
安装基于英特尔的自制软件 - 完成后重启终端
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Re-install unixodbc
arch -x86_64 brew install unixodbc
测试
isql -v Pattern
在您的 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")
我在让 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 系列
安装最新的雪花驱动
使用 cmd 卸载基于 m1 的自制软件
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"
安装基于英特尔的自制软件 - 完成后重启终端
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Re-install unixodbc
arch -x86_64 brew install unixodbc
测试
isql -v Pattern
在您的 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")