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 是基于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 进行文件处理
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