最近在给实验室的存储引擎写 Trino Connector(其实是增加一路数据源),记录一下开发的过程。
最开始要开发这个插件的时候,还没怎么用过Trino,大概看了一眼 Trino | Trino: The Definitive Guide ,知道了这是个什么玩意儿,应该怎么用。但是对于开发没有什么大用。
接着看Developer guide ,以及直接看示例代码,大概了解到了要实现哪些类,这些类在整个查询流程中是什么时候被调度的,以及节点间的数据交换内容和序列化方法。
之后画了一些草图,就开始糊代码。
graph TD
SplitManager -->|"getScanOperator"|so[ScanOperator]
so --> |"getInputSplits(BaseTable table)"|lis["List InputSplit "]
lis --> getScheme
lis --> gl["get layouts"]
gl --> split_index
gl --> orderdPath --> InputSplits
gl --> compactPath --> InputSplits
InputSplits --> PS2["PixelsSplits"]
so --> SplitSource
SplitSource --> P["PixelsSplit"]
PPSP --> PS2
PPSP["Pixels Page Source Provider"] --> PS
PS["PageSource"] -->|"PixelsReaderImpl"|PixelsRecordReader
PixelsRecordReader-->|"getNextPage"|Page
知道大致流程之后代码就很好糊了,主要就是缺什么接口去找人提需求。
classDiagram PixelsSplit <|-- PixelsFileSplit PixelsSplit <|-- PixelsBufferSplit PixelsBufferSplit: - RetinaSplitType type PixelsBufferSplit: - []Integer ids PixelsBufferSplit: - []byte data class PixelsFileSplit PixelsFileSplit: + []String paths PixelsFileSplit: + []Integer rgStarts PixelsFileSplit: + []Integer rgLengths PixelsFileSplit: + String tableName PixelsFileSplit: + String StorageName PixelsFileSplit: + String SchemeName PixelsPageSourceProvider ..> PixelsSplit PixelsPageSourceProvider: + ConnectorPageSource createPageSource(ConnectorSplit split, ...) ConnectorPageSource <.. PixelsPageSourceProvider ConnectorPageSource <|-- PixelsPageSource ConnectorPageSource <|-- PixelsBufferPageSource PixelsPageSource: - PixelsReader reader PixelsBufferPageSource: - PixelsBlockReader reader PixelsPageSource : +Page getNextPage() PixelsBufferPageSource : +Page getNextPage() PixelsPageSource ..> PixelsFileSplit PixelsBufferPageSource ..> PixelsBufferSplit
最后测试的时候,之前不太清楚Java代码该如何调试。只会打LOG之后重新打Jar包,再重启Trino看哪里出了问题。不过后面学会了怎么JVM远程调试,配合LOG感觉就调试得挺舒服了。