最近在给实验室的存储引擎写 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感觉就调试得挺舒服了。