Flink RockDB的ColumnFamily來自哪裡?

  • 2019 年 11 月 3 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/jsjsjs1789/article/details/102845109

結論: ColumnFamily Name==ColumnFamilyDescirptor Name == StateDescriptor Name

解釋:

 kuduErrorDescriptor = new ListStateDescriptor<>("test", TypeInformation.of(new TypeHint<Object>() {  				}));  kuduErrorDescriptor.enableTimeToLive(ttlConfig);  listState = getRuntimeContext().getListState(kuduErrorDescriptor);

用過 Flink KeyedState的小夥伴,相信很熟悉上面的程式碼。 程式碼中的"test"就是StateDescriptor Name。但是ColumnFamily Name==ColumnFamilyDescirptor Name == StateDescriptor Name為什麼會成立呢? 我們以ListState為例: getRuntimeContext().getListState(kuduErrorDescriptor);一路跟程式碼我們可以看到 RocksDBKeyedStateBackend 中 tryRegisterKvStateInformation方法

......  //第一次獲取state  //將stateDesc.getName()賦值給newMetaInfo name  newMetaInfo = new RegisteredKeyValueStateBackendMetaInfo<>(  				stateDesc.getType(),  				stateDesc.getName(),  				namespaceSerializer,  				stateSerializer,  				StateSnapshotTransformFactory.noTransform());  newRocksStateInfo = RocksDBOperationUtils.createStateInfo(  				newMetaInfo, db, columnFamilyOptionsFactory, ttlCompactFiltersManager);  ......

追蹤createStateInfo

//將metaInfoBase name賦值給 columnFamilyDescriptor name  ColumnFamilyDescriptor columnFamilyDescriptor = createColumnFamilyDescriptor(  			metaInfoBase, columnFamilyOptionsFactory, ttlCompactFiltersManager);    return new RocksDBKeyedStateBackend.RocksDbKvStateInfo(createColumnFamily(columnFamilyDescriptor, db), metaInfoBase);

追蹤createColumnFamily到 RocksDB 的createColumnFamily

public ColumnFamilyHandle createColumnFamily(        final ColumnFamilyDescriptor columnFamilyDescriptor)        throws RocksDBException {      return new ColumnFamilyHandle(this, createColumnFamily(nativeHandle_,  //傳入columnFamilyDescriptor name ,          columnFamilyDescriptor.columnFamilyName(),         columnFamilyDescriptor.columnFamilyOptions().nativeHandle_));    }

繼續發現其調用本地方法

//利用columnFamilyDescriptor name 創建 columnFamily    private native long createColumnFamily(final long handle,        final byte[] columnFamilyName, final long columnFamilyOptions)        throws RocksDBException;

補充: rockdb families之間可以共享 write-ahead log 不共享 memtables 和 table files