O PVFS (Paimon Virtual Storage) permite acessar tabelas Paimon em um catálogo do Data Lake Formation (DLF) por caminhos de arquivo padrão, sem iniciar um mecanismo de computação como Flink ou Spark.
O PVFS mapeia os metadados e a estrutura de armazenamento de uma tabela Paimon em um caminho virtual unificado. Use esse caminho para ler diretamente o conteúdo subjacente da tabela — snapshots, arquivos de dados e metadados — com o Java SDK ou o Python SDK. O formato do caminho é idêntico em ambos os SDKs e em todos os frameworks de computação compatíveis.
pvfs://<catalog_name>/<database_name>/<table_name>/...
Para mais informações sobre o design do PVFS, consulte Paimon Virtual Storage.
O PVFS permite que desenvolvedores e engenheiros de dados explorem, testem e gerenciem tabelas Paimon em ambientes locais ou automatizados por scripts, aumentando a eficiência no desenvolvimento e na operação e manutenção de data lakes.
Suporte a SDK
Java SDK: Implementa a interface do Hadoop Distributed File System (HDFS) e integra-se ao ecossistema Hadoop, incluindo Hive, Spark e Presto.
Python SDK: Desenvolvido com base no Filesystem Spec (fsspec), é compatível com ferramentas de dados Python como Dask, Pandas e PyArrow.
Estrutura do caminho
Todos os caminhos do PVFS seguem um namespace de três níveis:
pvfs://<catalog_name>/<database_name>/<table_name>/[path]
|
Segmento |
Descrição |
|
|
Nome do catálogo DLF |
|
|
Banco de dados no catálogo |
|
|
Tabela Paimon a acessar |
|
|
Opcional. Caminho relativo para um arquivo ou diretório específico na tabela |
Comportamento de listagem
Ao listar um caminho PVFS, a resposta reflete a hierarquia do namespace virtual:
pvfs://<catalog_name>/— retorna todos os bancos de dados do catálogo como caminhos virtuaispvfs://<catalog_name>/<database_name>/— retorna todas as tabelas do banco de dados como caminhos virtuaispvfs://<catalog_name>/<database_name>/<table_name>/— retorna os arquivos e diretórios reais da tabela
Todos os caminhos listados são virtuais. As operações de leitura e gravação resolvem automaticamente o caminho virtual para o local de armazenamento real da tabela.
Java SDK
O Java SDK implementa a interface HDFS, tornando o PVFS acessível em qualquer framework compatível com Hadoop.
Pré-requisitos
Antes de começar, verifique se você tem:
Java 8 ou superior
Um catálogo DLF com pelo menos uma tabela Paimon
Um token de acesso DLF válido
Configure com a API Hadoop FileSystem
Defina as seguintes propriedades no objeto Configuration ou no arquivo core-site.xml:
|
Propriedade |
Valor |
Descrição |
|
|
|
Classe de implementação do FileSystem PVFS |
|
|
URL do endpoint DLF |
Endpoint do service DLF |
Exemplo: leitura de arquivo com a API Hadoop FileSystem
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
Configuration conf = new Configuration();
conf.set("fs.pvfs.impl", "org.apache.paimon.vfs.hadoop.PaimonVirtualFileSystem");
// Replace <dlf-endpoint> with the actual DLF service endpoint
conf.set("fs.pvfs.uri", "<dlf-endpoint>");
Path path = new Path("pvfs://<catalog_name>/<database_name>/<table_name>/");
FileSystem fs = path.getFileSystem(conf);
// List files in the table
fs.listStatus(path);
**Exemplo: configuração no core-site.xml para acesso em todo o cluster**
<configuration>
<property>
<name>fs.pvfs.impl</name>
<value>org.apache.paimon.vfs.hadoop.PaimonVirtualFileSystem</value>
</property>
<property>
<name>fs.pvfs.uri</name>
<!-- Replace with the actual DLF service endpoint -->
<value><dlf-endpoint></value>
</property>
</configuration>
Após adicionar essas propriedades, frameworks como Hive, Spark e Presto acessam caminhos PVFS sem configuração adicional.
Exemplo: consulta a uma tabela com Spark SQL
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
.config("spark.hadoop.fs.pvfs.impl",
"org.apache.paimon.vfs.hadoop.PaimonVirtualFileSystem")
// Replace <dlf-endpoint> with the actual DLF service endpoint
.config("spark.hadoop.fs.pvfs.uri", "<dlf-endpoint>")
.getOrCreate()
spark.sql("""
CREATE TEMPORARY VIEW my_table
USING parquet
OPTIONS (path 'pvfs://<catalog_name>/<database_name>/<table_name>/')
""")
spark.sql("SELECT * FROM my_table LIMIT 10").show()
Python SDK
O Python SDK implementa a interface fsspec, permitindo usar o PVFS com qualquer biblioteca Python compatível com fsspec.
Pré-requisitos
Antes de começar, verifique se você tem:
Python 3.7 ou superior
pypaimoninstaladoUm catálogo DLF com pelo menos uma tabela Paimon
Um token de acesso DLF válido
Inicialize o sistema de arquivos
Forneça as seguintes opções ao criar uma instância de PaimonVirtualFileSystem:
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
str |
Sim |
URL do endpoint do service DLF |
|
|
str |
Sim |
Tipo de provedor de autenticação |
|
|
str |
Sim |
Token de acesso DLF |
import pypaimon
options = {
"uri": "<dlf-endpoint>", # Replace with the DLF service endpoint
"token.provider": "dlf",
"token": "<your-dlf-token>", # Replace with a valid DLF access token
}
fs = pypaimon.PaimonVirtualFileSystem(options)
Liste e explore tabelas
# List all tables in a database
fs.ls("pvfs://<catalog_name>/<database_name>/")
# List files in a specific table
fs.ls("pvfs://<catalog_name>/<database_name>/<table_name>/")
Leitura com PyArrow
import pypaimon
import pyarrow.parquet as pq
fs = pypaimon.PaimonVirtualFileSystem(options)
# Read a Parquet file from a Paimon table
dataset = pq.ParquetDataset(
"pvfs://<catalog_name>/<database_name>/<table_name>/",
filesystem=fs
)
table = dataset.read()
df = table.to_pandas()
print(df.head())
Leitura com Pandas
import pypaimon
import pandas as pd
fs = pypaimon.PaimonVirtualFileSystem(options)
# Read a CSV file from a Paimon table
with fs.open("pvfs://<catalog_name>/<database_name>/<table_name>/data.csv") as f:
df = pd.read_csv(f)
print(df.head())
Controle de acesso
O PVFS aplica as políticas unificadas de controle de acesso do DLF. O gerenciamento de permissões ocorre no nível da tabela. Os usuários precisam ter as permissões adequadas de leitura ou gravação em uma tabela DLF para acessá-la por um caminho PVFS. Para mais informações, consulte Configure permissions.