FlightSql在Linux正常运行但Windows报错问题求助
问题背景
同一段FlightSQL代码在Linux(Colab)环境可正常运行,但在Windows系统执行时,会抛出FlightUnavailableError: empty address list错误,后续持续出现创建安全子通道失败的提示。
原运行正常代码
from flightsql import FlightSQLClient from urllib.parse import urlparse parsed_uri = urlparse('https://us-east-1-1.aws.cloud2.influxdata.com') bucket_name="VLBA" host_name=parsed_uri.hostname data_frame_measurement_name="UnitPrice" token = "u10r0Iyf8jnCwaHd5ktpHPZtBAoCyvZtY_8THsW84VMK73GmQ1Md2qOWs5UNaW1uRoLmD7Oqz4AW72WqQQ7cNQ==" query_client = FlightSQLClient( host = host_name, token = token, metadata={"bucket-name": bucket_name} ) query = """SELECT * FROM '{}' """.format(data_frame_measurement_name) info = query_client.execute(query)
Windows下报错信息
pyarrow._flight.FlightUnavailableError: Flight returned unavailable error, with message: empty address list:
Failed to create secure subchannel for secure name 'us-east-1-1.aws.cloud2.influxdata.com:443'; Got args: {grpc.client_channel_factory=0x23d61811d90, grpc.default_authority=us-east-1-1.aws.cloud2.influxdata.com:443, grpc.initial_reconnect_backoff_ms=100, grpc.internal.channel_credentials=0x23d62fed4f0, grpc.internal.subchannel_pool=0x23d62ff06a0, grpc.max_receive_message_length=-1, grpc.primary_user_agent=grpc-c++/1.50.1, grpc.resource_quota=0x23d62ff09d0, grpc.server_uri=dns:///us-east-1-1.aws.cloud2.influxdata.com:443, grpc.use_local_subchannel_pool=1}
解决方案
1. 显式指定端口号
Windows下gRPC对默认端口的解析可能存在异常,直接在host参数中添加443端口:
query_client = FlightSQLClient( host = f"{host_name}:443", # 显式指定HTTPS默认端口443 token = token, metadata={"bucket-name": bucket_name} )
2. 切换系统原生DNS解析
修改环境变量,强制gRPC使用系统原生DNS解析器,避免缓存或解析逻辑问题:
import os os.environ['GRPC_DNS_RESOLVER'] = 'native' # 后续代码保持原逻辑不变 from flightsql import FlightSQLClient from urllib.parse import urlparse parsed_uri = urlparse('https://us-east-1-1.aws.cloud2.influxdata.com') bucket_name="VLBA" host_name=parsed_uri.hostname data_frame_measurement_name="UnitPrice" token = "u10r0Iyf8jnCwaHd5ktpHPZtBAoCyvZtY_8THsW84VMK73GmQ1Md2qOWs5UNaW1uRoLmD7Oqz4AW72WqQQ7cNQ==" query_client = FlightSQLClient( host = host_name, token = token, metadata={"bucket-name": bucket_name} ) query = """SELECT * FROM '{}' """.format(data_frame_measurement_name) info = query_client.execute(query)
3. 升级依赖包版本
Windows下pyarrow或flightsql库的旧版本可能存在兼容性bug,执行以下命令升级:
pip install --upgrade pyarrow flightsql-dbapi
4. 手动配置gRPC通道选项
创建FlightSQLClient时,显式设置gRPC通道参数,强制指定解析规则:
from flightsql import FlightSQLClient from urllib.parse import urlparse parsed_uri = urlparse('https://us-east-1-1.aws.cloud2.influxdata.com') bucket_name="VLBA" host_name=parsed_uri.hostname data_frame_measurement_name="UnitPrice" token = "u10r0Iyf8jnCwaHd5ktpHPZtBAoCyvZtY_8THsW84VMK73GmQ1Md2qOWs5UNaW1uRoLmD7Oqz4AW72WqQQ7cNQ==" # 配置gRPC通道选项 channel_options = [ ("grpc.dns_resolver", "native"), ("grpc.enable_http_proxy", "false") ] query_client = FlightSQLClient( host = host_name, token = token, metadata={"bucket-name": bucket_name}, flight_options={"grpc_options": channel_options} ) query = """SELECT * FROM '{}' """.format(data_frame_measurement_name) info = query_client.execute(query)
内容的提问来源于stack exchange,提问作者ArunJose

