Slow engine creation - only when using FastAPI
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 25/100
调研方向
从 main.py 和 test_route.py 中的 FastAPI 复现开始,然后将其 create_engine 路径与独立的 databricks.sql 连接示例进行比较。在 requirements.txt 中固定的版本下,对 databricks/sql/thrift_api/TCLIService/ttypes.py 的导入和执行进行性能分析。当 FastAPI 独有延迟的原因已经确定,并且在不手动编辑生成文件的情况下演示了受支持的解决方法时,即表示完成。
由索引模型根据 Issue 内容生成。
描述
Hello,
I am currently working on a FastAPI application which calls Databricks using databricks-sql-connector, however the code appears to slow down massively on the engine creation stage.
I've narrowed the issue down to .venv\Lib\site-packages\databricks\sql\thrift_api\TCLIService\ttypes.py, where when running in debug mode the script is loaded incredibly slowly (around 5-10 minutes). However when the exact same code is run outside of a FastAPI function (ie, in a standalone script, notebook, etc) it runs almost instantly and the engine is created in under 1 second.
The details of my test application are:
main.py:
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
import uvicorn
from routes import test_route
app = FastAPI(
title="TestAPI",
version="1.0",
description="Test API",
)
@app.get("/", include_in_schema=False)
async def docs_redirect():
return RedirectResponse(url='/docs')
app.include_router(test_route.router)
if __name__ == '__main__':
uvicorn.run('main:app', host='0.0.0.0', port=8000)
test_route.py:
import fastapi
from fastapi import APIRouter
from sqlalchemy import create_engine
from sqlalchemy import text
router = APIRouter(tags=["Test"])
@router.post("/test_route", description="Test")
async def test():
import time
print("Connecting to engine....")
startT = time.time()
engine = create_engine(
url = f"databricks://token:<<TOKEN>>@<<HOST>>?http_path=/sql/1.0/warehouses/<<WAREHOUSE>>&catalog=<<CATALOG>>&schema=<<SCHEMA>>"
)
print("Engine Connected!")
print(f"Time taken: {time.time() - startT} seconds.")
with engine.connect() as connection:
result = connection.execute(text("SELECT * from range(10)"))
for row in result:
print(row)
print(f"Execution time: {time.time() - startT} seconds.")
pass
return "Ok."
requirements.txt:
fastapi==0.111.1
uvicorn==0.30.3
databricks-sql-connector[SQLAlchemy]==3.3.0
The same issue occurs when using:
from databricks import sql
connection = sql.connect(
server_hostname = <HOST>,
http_path = <HTTP>
access_token = <TOKEN>)
cursor = connection.cursor()
cursor.execute("SELECT * from range(10)")
print(cursor.fetchall())
cursor.close()
connection.close()
but given it all goes to create_engine under the hood I was trying to simplify my test case.
As mentioned, the call stack points to .venv\Lib\site-packages\databricks\sql\thrift_api\TCLIService\ttypes.py taking all of this extra time. This can be fixed through editing ttypes.py directly and removing all rows which begin None, #. However this directly violates the warning given at the top of ttypes.py about not editing. Removing these rows reduces the file from ~100,000 lines to ~10,000, and completely solves the time delay issue when using FastAPI.
So my main questions are:
- Why does this delay in engine creation only occur in a FastAPI app (is it something to do with it being asynchronous?).
- How can this delay be remedied?
- Can
ttypes.pybe safely edited to remove all "None" rows or is this not a viable solution?
Thanks!
- 主要语言
- Python
- 星标
- 233
- 派生
- 152
- 平均合并
- 21 小时 5 分钟
- 30 天内合并 PR
- 10
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
databricks/databricks-sql-python 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 78/100
-
难度 2/5 1-3 小时 新手友好度 76/100
-
难度 2/5 1-3 小时 新手友好度 78/100
-
难度 2/5 1-3 小时 新手友好度 72/100
-
难度 2/5 1-3 小时 新手友好度 84/100
查看 databricks/databricks-sql-python 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 74/100
-
难度 2/5 1-3 小时 新手友好度 84/100
PolicyEngine/policyengine-us#9559 ·
-
priority: p3
难度 2/5 1-3 小时 新手友好度 72/100
googleapis/librarian#7636 ·
-
from:qa priority:P2 reliability tech-debt
难度 2/5 1-3 小时 新手友好度 78/100
spec-kitty/spec-kitty#4874 ·
-
难度 2/5 1-3 小时 新手友好度 68/100