Ingesta de datos de Azure HPC Cache: método de copia manual

En este artículo se proporcionan instrucciones detalladas para copiar datos manualmente en un contenedor de Blob Storage para su uso con Azure HPC Cache. Usa operaciones paralelas multiproceso para optimizar la velocidad de copia.

Para más información sobre cómo mover datos a Blob Storage para Azure HPC Cache, lea Traslado de datos a Azure Blob Storage.

Ejemplo de copia simple

Puede crear manualmente una copia multiproceso en un cliente ejecutando más de un comando de copia a la vez en segundo plano en conjuntos predefinidos de archivos o rutas de acceso.

El comando Linux/UNIX cp incluye el argumento -p para conservar la propiedad y los metadatos de mtime. Agregar este argumento a los comandos siguientes es opcional. (Agregar el argumento aumenta el número de llamadas del sistema de archivos enviadas desde el cliente al sistema de archivos de destino para la modificación de metadatos).

En este ejemplo sencillo se copian dos archivos en paralelo:

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

Después de emitir este comando, el jobs comando mostrará que se están ejecutando dos subprocesos.

Copia de datos con nombres de archivo predecibles

Si los nombres de archivo son predecibles, puede usar expresiones para crear subprocesos de copia paralelos.

Por ejemplo, si el directorio contiene 1000 archivos numerados secuencialmente de 0001 a 1000, puede usar las siguientes expresiones para crear 10 subprocesos paralelos que cada uno copie 100 archivos:

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/

Copia de datos con nombres de archivo no estructurados

Si la estructura de nomenclatura de archivos no es predecible, puede agrupar archivos por nombres de directorio.

En este ejemplo se recopilan directorios completos para enviar a cp comandos que se ejecutan como tareas en segundo plano:

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

Una vez recopilados los archivos, puede ejecutar comandos de copia en paralelo para copiar de forma recursiva los subdirectorios y todo su contenido:

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/ &

Cuándo agregar puntos de montaje

Después de tener suficientes subprocesos paralelos que van en un único punto de montaje del sistema de archivos de destino, habrá un punto en el que agregar más subprocesos no proporciona más rendimiento. (El rendimiento se medirá en archivos/segundo o bytes/segundo, en función del tipo de datos). O peor, la sobreproceso puede provocar a veces una degradación del rendimiento.

Cuando esto sucede, puede agregar puntos de montaje del lado cliente a otras direcciones de montaje de Azure HPC Cache mediante la misma ruta de montaje del sistema de archivos remoto:

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)

Agregar puntos de montaje cliente le permite ejecutar comandos de copia adicionales en los puntos de montaje adicionales /mnt/destination[1-3], para aumentar el paralelismo.

Por ejemplo, si los archivos son muy grandes, puede definir los comandos de copia para usar rutas de acceso de destino distintas, enviando más comandos en paralelo desde el cliente que realiza la copia.

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/ & \

En el ejemplo anterior, los tres puntos de montaje de destino están siendo utilizados por los procesos de copia de archivos del cliente.

Cuándo agregar clientes

Por último, cuando haya alcanzado las funcionalidades del cliente, agregar más subprocesos de copia o puntos de montaje adicionales no producirá ningún aumento adicional de archivos por segundo o bytes por segundo. En esa situación, puede implementar otro cliente con el mismo conjunto de puntos de montaje que ejecutarán sus propios conjuntos de procesos de copia de archivos.

Ejemplo:

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/ &

Crear manifiestos de archivo

Después de comprender los enfoques anteriores (varios subprocesos de copia por destino, varios destinos por cliente, varios clientes por sistema de archivos de origen accesible para la red), tenga en cuenta esta recomendación: Compilar manifiestos de archivo y, a continuación, usarlos con comandos de copia en varios clientes.

En este escenario se usa el comando UNIX find para crear manifiestos de archivos o directorios:

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

Redirigir este resultado a un archivo: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo

A continuación, puede recorrer en iteración el manifiesto mediante comandos BASH para contar archivos y determinar los tamaños de los subdirectorios:

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 último, debe elaborar los comandos efectivos de copia de archivos hacia los clientes.

Si tiene cuatro clientes, use este comando:

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

Si tiene cinco clientes, use algo parecido a esto:

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

Y para seis... extrapolar cuando sea necesario.

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

Obtendrá N archivos resultantes, uno para cada uno de los clientes N que tenga los nombres de ruta de acceso a los directorios de nivel cuatro obtenidos como parte de la salida del find comando.

Use cada archivo para compilar el comando copy:

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

Esto le dará N archivos, cada uno con un comando de copia por línea, que pueden ejecutarse como un script de BASH en el cliente.

El objetivo es ejecutar varios subprocesos de estos scripts simultáneamente por cliente en paralelo en varios clientes.