Ingestão de dados do Azure HPC Cache - método de cópia manual

Este artigo fornece instruções detalhadas para copiar manualmente dados para um contentor de armazenamento Blob para utilização com o Azure HPC Cache. Utiliza operações paralelas multi-thread para otimizar a velocidade de cópia.

Para saber mais sobre como mover dados para armazenamento Blob para o seu Azure HPC Cache, leia Mover dados para armazenamento Azure Blob.

Exemplo de cópia simples

Pode criar manualmente uma cópia em multithreading num cliente executando mais do que um comando de cópia simultaneamente em segundo plano sobre conjuntos predefinidos de ficheiros ou caminhos.

O comando Linux/UNIX cp inclui o argumento -p para preservar a propriedade e os metadados mtime. Adicionar este argumento aos comandos abaixo é opcional. (Adicionar o argumento aumenta o número de chamadas ao sistema de ficheiros enviadas do cliente para o sistema de ficheiros de destino para modificação de metadados.)

Este exemplo simples copia dois ficheiros em paralelo:

cp /mnt/source/file1 /mnt/destination1/ & cp /mnt/source/file2 /mnt/destination1/ &

Após emitir este comando, o jobs comando mostrará que dois threads estão a funcionar.

Copiar dados com nomes de ficheiros previsíveis

Se os nomes dos teus ficheiros forem previsíveis, podes usar expressões para criar threads de cópia paralelos.

Por exemplo, se o seu diretório contiver 1000 ficheiros numerados sequencialmente de 0001 para 1000, pode usar as seguintes expressões para criar 10 threads paralelos que cada um copia 100 ficheiros:

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination1/ & \
cp /mnt/source/file2* /mnt/destination1/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination1/ & \
cp /mnt/source/file5* /mnt/destination1/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination1/ & \
cp /mnt/source/file8* /mnt/destination1/ & \
cp /mnt/source/file9* /mnt/destination1/

Copiar dados com nomes de ficheiros não estruturados

Se a estrutura de nomes dos ficheiros não for previsível, pode agrupar os ficheiros por nomes de diretórios.

Este exemplo recolhe diretórios inteiros para enviar a cp comandos executados como tarefas em segundo plano:

/root
|-/dir1
| |-/dir1a
| |-/dir1b
| |-/dir1c
   |-/dir1c1
|-/dir1d

Depois de recolhidos os ficheiros, pode executar comandos de cópia paralela para copiar recursivamente os subdiretórios e todo o seu conteúdo:

cp /mnt/source/* /mnt/destination/
mkdir -p /mnt/destination/dir1 && cp /mnt/source/dir1/* mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ & # this command copies dir1c1 via recursion
cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &

Quando adicionar pontos de montagem

Depois de ter um número suficiente de threads paralelas num ponto de montagem do sistema de ficheiros de destino, haverá um ponto em que adicionar mais threads não aumenta o desempenho. (O débito será medido em ficheiros/segundo ou bytes/segundo, dependendo do tipo de dados.) Ou pior, o sobrecarga de threads pode, por vezes, causar uma redução no débito.

Quando isto ocorre, pode adicionar pontos de montagem do lado do cliente a outros endereços de montagem do Azure HPC Cache. Para isso, utilize o mesmo caminho de montagem remoto do sistema de ficheiros.

10.1.0.100:/nfs on /mnt/sourcetype nfs (rw,vers=3,proto=tcp,addr=10.1.0.100)
10.1.1.101:/nfs on /mnt/destination1type nfs (rw,vers=3,proto=tcp,addr=10.1.1.101)
10.1.1.102:/nfs on /mnt/destination2type nfs (rw,vers=3,proto=tcp,addr=10.1.1.102)
10.1.1.103:/nfs on /mnt/destination3type nfs (rw,vers=3,proto=tcp,addr=10.1.1.103)

Adicionar pontos de montagem no lado do cliente permite ramificar comandos de cópia adicionais para os pontos de montagem adicionais /mnt/destination[1-3], alcançando um maior paralelismo.

Por exemplo, se os seus ficheiros forem muito grandes, pode definir os comandos de cópia para usarem caminhos de destino distintos, enviando mais comandos em paralelo do cliente que realiza a cópia.

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination2/ & \
cp /mnt/source/file2* /mnt/destination3/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination2/ & \
cp /mnt/source/file5* /mnt/destination3/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination2/ & \
cp /mnt/source/file8* /mnt/destination3/ & \

No exemplo acima, todos os três pontos de montagem de destino estão a ser visados pelos processos de cópia de ficheiros do cliente.

Quando adicionar clientes

Por fim, quando atingires as capacidades do cliente, adicionar mais threads de cópia ou pontos de montagem adicionais não resultará em aumentos de ficheiros/segundo ou bytes/segundo. Nessa situação, podes implementar outro cliente com o mesmo conjunto de pontos de montagem que irá executar os seus próprios conjuntos de processos de cópia de ficheiros.

Example:

Client1: cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
Client1: cp -R /mnt/source/dir2/dir2a /mnt/destination/dir2/ &
Client1: cp -R /mnt/source/dir3/dir3a /mnt/destination/dir3/ &

Client2: cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
Client2: cp -R /mnt/source/dir2/dir2b /mnt/destination/dir2/ &
Client2: cp -R /mnt/source/dir3/dir3b /mnt/destination/dir3/ &

Client3: cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ &
Client3: cp -R /mnt/source/dir2/dir2c /mnt/destination/dir2/ &
Client3: cp -R /mnt/source/dir3/dir3c /mnt/destination/dir3/ &

Client4: cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
Client4: cp -R /mnt/source/dir2/dir2d /mnt/destination/dir2/ &
Client4: cp -R /mnt/source/dir3/dir3d /mnt/destination/dir3/ &

Criar manifestos de ficheiros

Depois de compreender as abordagens acima (múltiplos threads de cópia por destino, múltiplos destinos por cliente, múltiplos clientes por sistema de ficheiros fonte acessível em rede), considere esta recomendação: construa manifestos de ficheiros e depois utilize-os com comandos de cópia entre múltiplos clientes.

Este cenário utiliza o comando UNIX find para criar manifestos de ficheiros ou diretórios:

user@build:/mnt/source > find . -mindepth 4 -maxdepth 4 -type d
./atj5b55c53be6-01/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-01/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-01/support/trace/rolling
./atj5b55c53be6-03/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-03/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-03/support/trace/rolling
./atj5b55c53be6-02/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-02/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-02/support/trace/rolling

Redireciona este resultado para um ficheiro: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo

Depois podes iterar pelo manifesto, usando comandos BASH para contar ficheiros e determinar o tamanho dos subdiretórios:

ben@xlcycl1:/sps/internal/atj5b5ab44b7f > for i in $(cat /tmp/foo); do echo " `find ${i} |wc -l` `du -sh ${i}`"; done
244    3.5M    ./atj5b5ab44b7f-02/support/gsi/2018-07-18T00:07:03EDT
9      172K    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.8M    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T01:01:00UTC
131    13M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    6.2M    ./atj5b5ab44b7f-02/support/gsi/2018-07-20T21:59:41UTC
134    12M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
7      16K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:12:19UTC
8      83K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:17:17UTC
575    7.7M    ./atj5b5ab44b7f-02/support/cores/armada_main.2000.1531980253.gsi
33     4.4G    ./atj5b5ab44b7f-02/support/trace/rolling
281    6.6M    ./atj5b5ab44b7f-01/support/gsi/2018-07-18T00:07:03EDT
15     182K    ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-18T05:01:00UTC
244    17M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-19T01:01:01UTC
299    31M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T01:01:00UTC
256    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T21:59:41UTC_partial
889    7.7M    ./atj5b5ab44b7f-01/support/gsi/2018-07-20T21:59:41UTC
262    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
11     248K    ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:12:19UTC
11     88K     ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:17:17UTC
645    11M     ./atj5b5ab44b7f-01/support/cores/armada_main.2019.1531980253.gsi
33     4.0G    ./atj5b5ab44b7f-01/support/trace/rolling
244    2.1M    ./atj5b5ab44b7f-03/support/gsi/2018-07-18T00:07:03EDT
9      158K    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.3M    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T01:01:00UTC
131    12M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    8.4M    ./atj5b5ab44b7f-03/support/gsi/2018-07-20T21:59:41UTC
134    14M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T22:25:58UTC_hpccache_catchup
7      159K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:12:19UTC
7      157K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:17:17UTC
576    12M     ./atj5b5ab44b7f-03/support/cores/armada_main.2013.1531980253.gsi
33     2.8G    ./atj5b5ab44b7f-03/support/trace/rolling

Por fim, deve criar os comandos de cópia do ficheiro para os clientes.

Se tiver quatro clientes, use este comando:

for i in 1 2 3 4 ; do sed -n ${i}~4p /tmp/foo > /tmp/client${i}; done

Se tiver cinco clientes, use algo assim:

for i in 1 2 3 4 5; do sed -n ${i}~5p /tmp/foo > /tmp/client${i}; done

E para seis... Extrapole conforme necessário.

for i in 1 2 3 4 5 6; do sed -n ${i}~6p /tmp/foo > /tmp/client${i}; done

Obterás N ficheiros resultantes, um para cada um dos teus N clientes, que têm os nomes de caminhos para os diretórios de nível quatro obtidos como parte da saída do find comando.

Use cada ficheiro para construir o comando de cópia:

for i in 1 2 3 4 5 6; do for j in $(cat /tmp/client${i}); do echo "cp -p -R /mnt/source/${j} /mnt/destination/${j}" >> /tmp/client${i}_copy_commands ; done; done

O acima vai dar-te N ficheiros, cada um com um comando de cópia por linha, que podem ser executados como um script BASH no cliente.

O objetivo é executar múltiplos threads destes scripts em simultâneo por cliente em paralelo em múltiplos clientes.