dremio的分布式存储简单说明

dremio 的pdfs 在系统中是一个比较重要的东西,dremio 的加速,上传,下载,查询结果,scratch 空间都是存储在这个里边的,没有配置的话,默认是在
paths.local 中, 同时官方支持多种文件存储(nas,hdfs,mapr-fs,s3,azure data lake,azure storage)而且dremio 基于s3 以及hdfs 也扩展了自己的hdfs 文件系统,扩展格式dremioS3,同时还基于dremio的fabric rpc 服务开发了pdfs文件系统,而且目前来说官方默认的就是此文件系统的配置

分布式存储配置说明

支持的配置模式不少,nas,hdfs,s3 ,pdfs。。。。s3 是一个不错的选择,可以实现多节点加速以及下载数据的共享,而且管理简单

pdfs 说明

pdfs 是基于fabric rpc 框架开发的,可以在远端查询本地文件系统的元数据,但是只能低于本地文件系统进行打开以及写入操作
参考格式

 
/
├── <dir1>
│   ├── <address1>@<file1>
│   ├── <address2>@<file1>
│   └── <address1>@<file2>
├── <dir2>

如果部署过集群多exectutor 就会看到如果我们的反射数据使用了默认的pdfs 机制,当我们在进行系统升级的时候,以前的反射会不能使用,而且会有
莫名奇妙的异常

源码简单说明

dremio 有一套自己的service 生命周期接口定义

 
public interface Service extends AutoCloseable {
  void start() throws Exception;
}

dfs 的service 使用了guice 管理
plugins/pdfs/src/main/java/com/dremio/exec/store/dfs/PDFSService.java
构造函数如下

 
public PDFSService(
      Provider<FabricService> fabricService,
      Provider<NodeEndpoint> identityProvider,
      Provider<Iterable<NodeEndpoint>> nodeProvider,
      Tracer tracer,
      SabotConfig config,
      BufferAllocator allocator,
      PDFSMode mode) 

以上服务是通过guice 注入的,比较有意思的是nodeProvider,处理如下(dremio 的service 都是在dac 模块注入启动的)
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java

 
// PDFS depends on fabric.
registry.bind(PDFSService.class, new PDFSService(
    registry.provider(FabricService.class),
    selfEndpoint,
    isCoordinator ? executorsProvider : () -> Collections.singleton(selfEndpoint.get()), // 如果是Coordinator,使用执行器节点,否则使用当前的
    bootstrapRegistry.lookup(Tracer.class),
    sabotConfig,
    bootstrap.getAllocator(),
    isExecutor ? PDFSMode.DATA : PDFSMode.CLIENT
    ));

PseudoDistributedFileSystem 扩展自 hadoop 的FileSystem
plugins/pdfs/src/main/java/com/dremio/exec/store/dfs/PseudoDistributedFileSystem.java
PseudoDistributedFileSystem 判断了访问的是本地文件系统还是远端的,
本地文件系统初始化的时候使用了PDFSLocalFileSystem
plugins/pdfs/src/main/java/com/dremio/exec/store/dfs/PDFSLocalFileSystem.java

 
static FileSystem newLocalFileSystem(Configuration conf, boolean isLocalAccessAllowed) throws IOException {
  // we'll grab our own local file system so append is supported (rather than the checksum local file system).
  final FileSystem localFS = isLocalAccessAllowed ? new PDFSLocalFileSystem() : new NoopFileSystem();
  localFS.initialize(localFS.getUri(), conf);
  return localFS;
}

远端使用了RemoteNodeFileSystem
plugins/pdfs/src/main/java/com/dremio/exec/store/dfs/RemoteNodeFileSystem.java

 
@VisibleForTesting
FileSystem newRemoteFileSystem(final NodeEndpoint endpoint) throws IOException {
  final FabricCommandRunner runner = runnerFactory.getCommandRunner(endpoint.getAddress(), endpoint.getFabricPort());
  RemoteNodeFileSystem rdfs = new RemoteNodeFileSystem(runner, allocator);
  rdfs.initialize(URI.create(format("sabot://%s:%d", endpoint.getAddress(), endpoint.getFabricPort())), getConf());
  return rdfs;
}

使用rpc 进行文件处理

minio 做为dfs 的配置

  • 参考配置
paths: {
  ...
  dist: "dremioS3:///<bucket_name>/<folder1>/<folder2>"

core-site.xml (与dremio.conf 同一个目录,而且需要copy 所有节点)

<?xml version="1.0"?>
<configuration>
<property>
    <name>fs.dremioS3.impl</name>
    <description>The FileSystem implementation. Must be set to com.dremio.plugins.s3.store.S3FileSystem</description>
    <value>com.dremio.plugins.s3.store.S3FileSystem</value>
</property>
<property>
    <name>fs.s3a.access.key</name>
    <description>Minio server access key ID.</description>
    <value>ACCESS_KEY</value>
</property>
<property>
    <name>fs.s3a.secret.key</name>
    <description>Minio server secret key.</description>
    <value>SECRET_KEY</value>
</property>
<property>
    <name>fs.s3a.aws.credentials.provider</name>
    <description>The credential provider type.</description>
    <value>org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider</value>
</property>
<property>
    <name>fs.s3a.endpoint</name>
    <description>Endpoint can either be an IP or a hostname, where Minio server is running . However the endpoint value cannot contain the http(s) prefix. E.g. 175.1.2.3:9000 is a valid endpoint. </description>
    <value>ENDPOINT</value>
</property>
<property>
    <name>fs.s3a.path.style.access</name>
    <description>Value has to be set to true.</description>
    <value>true</value>
</property>
<property>
    <name>dremio.s3.compat</name>
    <description>Value has to be set to true.</description>
    <value>true</value>
</property>
<property>
    <name>fs.s3a.connection.ssl.enabled</name>
    <description>Value can either be true or false, set to true to use SSL with a secure Minio server.</description>
    <value>SSL_ENABLED</value>
</property>
</configuration>

注意默认使用了buf 在 /tmp/hadoop-dremio/s3a,如果空间不够,需要调整目录,调整以下配置

fs.s3a.buffer.dir

说明

dremio内部自己开发文件系统扩展是不少的,比如元数据存储扩展,加速存储扩展,home 存储扩展,s3 存储扩展,nas 存储扩展
同时如果大家看了dremio的数据目录(worker节点)会看到一个cm的目录,此目录是进行数据缓存的,同时在dremio的系统表sys,cache 中可以看到相关
性能参数

参考资料

https://docs.dremio.com/advanced-administration/dremio-conf/
https://docs.dremio.com/deployment/dist-store-config/
sabot/kernel/src/main/java/com/dremio/exec/store/dfs/FileSystemPlugin.java

上一篇:FFT进行频谱分析


下一篇:AtCoder Beginner Contest 043 题解