Usando o OCI HDFS Connector
O conector HDFS (Hadoop Distributed File System) do OCI permite que o aplicativo Apache Hadoop leia e grave dados no serviço Object Storage.
Este é para o Big Data Service 3.0.4 ou anterior. Se a versão for 3.0.4 ou posterior, use a Integração de Chaves da API do Serviço Object Storage para estabelecer conexão com o serviço Object Storage. A Versão do Big Data Service é exibida na guia Informações do Cluster da página Detalhes do Cluster.
Diretrizes Gerais de Ajuste
Seguir as diretrizes gerais de ajuste do Big Data Service ao executar cargas de trabalho no sistema de arquivos do OCI Object Storage para obter desempenho e confiabilidade eficazes para cargas de trabalho médias/maiores.
Ajuste de Leitura
Por padrão, o InputStream criado por um aplicativo Hadoop é um encapsulador básico para o InputStream gerado pelo cliente do OSS (Object Storage Service). No entanto, falta otimizações de desempenho.
Para aumentar a velocidade de leitura, use os seguintes parâmetros associados ao cache de leitura.
Configurações de ajuste de leitura antecipada
fs.oci.io.read.ahead=true
fs.oci.io.read.ahead.blocksize=6291456
fs.oci.io.read.ahead.blockcount=4
fs.oci.rename.operation.numthreads=2
Você pode ajustar o tamanho do bloco, as contagens de threads ou ativar/desativar o cache com base nos padrões de carga de trabalho e nos benchmarks de desempenho. Eles são particularmente úteis para cargas de trabalho, como distcp
, cargas de trabalho do Trino em que o aplicativo lê arquivos inteiros sequencialmente.
Cache de Metadados do Parquet
fs.oci.caching.object.parquet.enabled=true
: Este parâmetro ativa o armazenamento em cache dos metadados do rodapé Parquet na RAM.fs.oci.caching.object.parquet.spec
: Esse parâmetro permite ajustar o comportamento de armazenamento em cache, embora seu uso seja opcional e dependa de requisitos de carga de trabalho específicos.
Ao habilitar o armazenamento em cache do rodapé Parquet, você pode melhorar significativamente o desempenho de leitura dos arquivos Parquet, especialmente em cenários onde os mesmos arquivos são acessados várias vezes ou quando os metadados são relativamente estáticos. Esse mecanismo de armazenamento em cache garante que os metadados críticos estejam prontamente disponíveis na memória, reduzindo a necessidade de ler repetidamente os metadados dos próprios arquivos Parquet. Defina os parâmetros anteriores para ativar o armazenamento em cache do rodapé Parquet na RAM.
O armazenamento em cache de metadados de parquet é mais eficaz quando a contagem de blocos é 1, pois permite que todos os metadados sejam armazenados em cache e acessados rapidamente. Quando a contagem de blocos é maior que 1, a eficácia do armazenamento em cache de metadados depende da carga de trabalho e dos padrões de leitura do aplicativo. Cargas de trabalho como distcp
, que leem arquivos inteiros, podem se beneficiar de maior paralelismo e da definição blockcount
, enquanto aplicativos como o Spark, que leem colunas específicas de um arquivo Parquet, podem ter suas próprias estratégias de otimização que tornam essas configurações menos relevantes.
Ajuste de Gravação
O conector HDFS, por padrão, gera um arquivo temporário local no disco para armazenar em buffer os dados gravados em um arquivo HDFS. Consulte as seguintes configurações do conector HDFS:
fs.oci.io.write.multipart.inmemory
: Esta configuração ativa o processo "upload-as-you-go". Definindo isso como verdadeiro, o conector começa a fazer upload de partes de dados para o Object Storage Service assim que o tamanho gravado atinge o tamanho de parte predefinido, sem esperar que todo o arquivo seja armazenado em buffer no disco.fs.oci.client.multipart.numthreads
: Esta configuração especifica o número de threads a serem usados para upload em várias partes. Recomendamos basear o número de threads no número esperado de chunks para um arquivo típico. Uma diretriz geral é defini-la como 2 vezes o número de vCPUs por executor. Essa configuração garante o processamento paralelo de partes de dados durante o upload.fs.oci.client.multipart.partsize.mb
: Essa configuração define o tamanho de cada parte de dados em megabytes para upload em várias partes. Recomendamos usar um tamanho de chunk mais próximo de 64 MB que divida uniformemente o tamanho do arquivo em chunks iguais. Por exemplo, se o tamanho do arquivo for 640 MB, um tamanho de parte de 64 MB resultaria em 10 partes iguais.fs.oci.client.multipart.minobjectsize.mb
: Esta configuração especifica o tamanho mínimo do objeto em megabytes para o qual o upload em várias partes está ativado. Objetos menores que o tamanho especificado são submetidos a upload usando uma solicitação PutObject padrão em vez de upload em várias partes. Isso pode ser útil para otimizar o desempenho de arquivos menores.fs.oci.client.md5.numthreads
: Esta configuração define o número de threads para calcular valores de hash MD5 de forma assíncrona. O hash MD5 é usado para verificar a integridade dos dados durante a transmissão. Ao estabelecer um pool de threads dedicado, o cálculo de hashes MD5 pode ser executado simultaneamente com o processo de upload de peças de dados, melhorando a eficiência geral.
Alguns ajustes são baseados no tamanho do arquivo. Em geral, queremos gravar arquivos como chunks de 32 a 128 MB por meio de upload multiparte (que é ativado por padrão). Para ajuste explícito, para um tamanho de arquivo de X MB, use um tamanho de bloco multiparte mais próximo de 64 MB que divide mais uniformemente X em partes iguais. Por exemplo, se X for 640 MB, você obterá dez chunks de 64 MB, o que é par. Se X for de 641 MB, você receberá dez blocos de 64 MB e um bloco de 1 MB. Um tamanho de bloco de 65 MB é melhor. Mas para um início padrão, defina N nos seguintes ajustes como 64 (para 64 MB).
Em seguida, o número de threads (M) é o número de chunks para um arquivo típico. Em geral, pode ser 2 * vcpus por executor. X * M bytes de heap para a transferência é retornado, então esses podem precisar ser ajustados para caber em um heap menor.
Exemplos de uso do Conector HDFS nos Clusters do Big Data Service
Você deve ter as políticas do serviço IAM necessárias criadas para acessar os buckets do serviço Object Storage e outros recursos.
- do Hadoop
hadoop fs -ls oci://<bucket-name>@<namespace>/
- Spark
import org.apache.spark._ val conf = sc.getConf val test_prefix = sc.textFile("oci://<bucket-name>@<namespace>/") test_prefix.toDF().show()
Referências: Formatos de URI para Conectores HDFS