drill 查询源码

1 接收查询请求

UserServerRequestHandler

handle方法

2 提交任务

UserWorker

submitWork提交作业

初始化Foreman

线程池执行Foreman

3 执行任务

Foreman是一个线程。

  • 修改线程名
  • 调用runSQL方法

3.1获取物理计划

DrillSqlWorker.getPlan(QueryContext context, String sql, Pointer textPlan)

3.1.1 根据查询上下文获取sql转换器

SqlConverter:负责管理sql语句的解析、验证和toRel转换。
实例化SqlConverter:

  • 保存查询上下文
  • 获取内置函数
  • 解析SQL的config
  • JavaTypeFactoryImpl
  • 默认的SchemaPlus
  • root SchemaPlus
  • UserSession
  • DrillConfig
  • DrillCalciteCatalogReader
  • SqlOperatorTable
  • RelOptCostFactory
  • DrillValidator

3.1.2获取SQL解析树

SqlNode是一个SQL解析树。

3.1.3 根据SqlNode的类型构造AbstractSqlHandler

new DefaultSqlHandler(config, textPlan);

3.1.3.1 DefaultSqlHandler.getPlan(SqlNode sqlNode)
3.1.3.1.1 DefaultSqlHandler.validateAndConvert(SqlNode sqlNode)
3.1.3.1.1.1 重写语法树
3.1.3.1.1.2 DefaultSqlHandler.validateNode(SqlNode sqlNode)

返回Pair<SqlNode, RelDataType>

  1. SqlConverter.validate(final SqlNode parsedNode)
    1.1 SqlValidatorImpl.validate(SqlNode topNode)
    EmptyScope是什么
    1.1.1 SqlValidatorImpl.validateScopedExpression( SqlNode topNode, SqlValidatorScope scope)
    1.1.1.1 SqlSelect.validate(SqlValidator validator, SqlValidatorScope scope)
    1.1.1.1.1 SqlValidatorImpl.validateQuery(SqlNode node, SqlValidatorScope scope,RelDataType targetRowType)
    SqlValidatorNamespace是什么?
    SelectNamespace.validateImpl(RelDataType targetRowType):返回RelDataType
    SqlValidatorImpl.validateSelect(SqlSelect select, RelDataType targetRowType):返回void
    SqlConverter.DrillValidator.validateFrom(SqlNode node,RelDataType targetRowType,SqlValidatorScope scope)
    SqlConverter.DrillCalciteCatalogReader.getTable(List names):返回Prepare.PreparingTable
    CalciteCatalogReader.getTable(final List names):返回Prepare.PreparingTable
    SqlValidatorUtil.getTableEntry(SqlValidatorCatalogReader catalogReader, List names)
    SqlValidatorUtil.getSchema(CalciteSchema rootSchema,Iterable schemaPath, SqlNameMatcher nameMatcher)
    CalciteSchema.getSubSchema (String schemaName,boolean caseSensitive)
    DynamicRootSchema.getImplicitSubSchema(String schemaName, boolean caseSensitive)第二次运行的时候获取subSchemaMap时是否为空
    DynamicRootSchema.loadSchemaFactory(String schemaName, boolean caseSensitive)
    StoragePluginRegistryImpl.getPlugin(String name)
    HBaseStoragePlugin.registerSchemas(SchemaConfig schemaConfig, SchemaPlus parent)
    SqlValidatorUtil.getTableEntryFrom(CalciteSchema schema, String name, boolean caseSensitive)
    SimpleCalciteSchema.getImplicitTable(String tableName, boolean caseSensitive)
    HBaseSchemaFactory.HBaseSchema.getTable(String name)
    AbstractHBaseDrillTable. setTableDesc(Connection connection, String tableName)
3.1.3.1.1.3 DefaultSqlHandler.convertToRel(SqlNode node)
3.1.3.1.2 DefaultSqlHandler.convertToDrel(RelNode relNode)

返回DrillRel

3.1.3.1.3 DefaultSqlHandler.convertToPrel(RelNode drel, RelDataType validatedRowType)

应用物理规则和某些转换将drill关系节点转换为物理节点。
返回Prel

3.1.3.1.4 DefaultSqlHandler.convertToPop(Prel prel)

返回PhysicalOperator

3.1.3.1.5 DefaultSqlHandler.convertToPlan(PhysicalOperator op)

返回PhysicalPlan

3.2 执行物理计划

Foreman.runPhysicalPlanf(inal PhysicalPlan plan, Pointer textPlan)

查询hbase

RecordReader.setup(OperatorContext context, OutputMutator output)
HBaseRecordReader.getOrCreateFamilyVector(String familyName, boolean allocateOnCreate)
HBaseRecordReader.next()
DrillCursor.getNext()

核心代码

DeultSqlHandler.validateAndConvert(SqlNode sqlNode)

SqlValidatorImpl.alidateScopedExpression()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值