Aracılığıyla paylaş


Azure HPC Önbelleği veri alma - el ile kopyalama yöntemi

Bu makalede, Verileri Azure HPC Önbelleği ile kullanılmak üzere bir Blob depolama kapsayıcısına el ile kopyalamaya yönelik ayrıntılı yönergeler verilmektedir. Kopyalama hızını iyileştirmek için çok iş parçacıklı paralel işlemler kullanır.

Azure HPC Önbelleği'nizde verileri Blob depolamaya taşıma hakkında daha fazla bilgi edinmek için Bkz. Verileri Azure Blob depolamaya taşıma.

Basit kopya örneği

Önceden tanımlanmış dosya veya yol kümelerine karşı arka planda aynı anda birden fazla kopyalama komutu çalıştırarak istemcide el ile çok iş parçacıklı bir kopya oluşturabilirsiniz.

Linux/UNIX cp komutu sahipliği ve mtime meta verilerini korumak için bağımsız değişkenini -p içerir. Bu bağımsız değişkeni aşağıdaki komutlara eklemek isteğe bağlıdır. (Bağımsız değişkeninin eklenmesi, meta veri değişikliği için istemciden hedef dosya sistemine gönderilen dosya sistemi çağrılarının sayısını artırır.)

Bu basit örnek, iki dosyayı paralel olarak kopyalar:

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

Bu komutu verdikten sonra, jobs komut iki iş parçacığının çalıştığını gösterir.

Tahmin edilebilir dosya adlarıyla veri kopyalama

Dosya adlarınız tahmin edilebilirse, paralel kopya iş parçacıkları oluşturmak için ifadeleri kullanabilirsiniz.

Örneğin, dizininiz 'den 0001 1000öğesine sıralı olarak numaralandırılmış 1000 dosya içeriyorsa, her birinin 100 dosyayı kopyalayan 10 paralel iş parçacığı oluşturmak için aşağıdaki ifadeleri kullanabilirsiniz:

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/

Yapılandırılmamış dosya adlarıyla veri kopyalama

Dosya adlandırma yapınız tahmin edilebilir değilse, dosyaları dizin adlara göre gruplandırabilirsiniz.

Bu örnek, arka plan görevleri olarak çalıştırılacak komutlara göndermek için cp tüm dizinleri toplar:

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

Dosyalar toplandıktan sonra, alt dizinleri ve bunların tüm içeriklerini yinelemeli olarak kopyalamak için paralel kopyalama komutlarını çalıştırabilirsiniz:

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

Bağlama noktaları ne zaman eklenir?

Tek bir hedef dosya sistemi bağlama noktasına karşı yeterli paralel iş parçacığına sahip olduktan sonra, daha fazla iş parçacığı eklemenin daha fazla aktarım hızı sağlamadığı bir nokta olacaktır. (Aktarım hızı, veri türünüz bağlı olarak dosya/saniye veya bayt/saniye cinsinden ölçülür.) Daha da kötüsü, aşırı iş parçacığı kullanımı bazen aktarım hızının düşmesine neden olabilir.

Bu durumda, aynı uzak dosya sistemi bağlama yolunu kullanarak diğer Azure HPC Önbelleği bağlama adreslerine istemci tarafı bağlama noktaları ekleyebilirsiniz:

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)

İstemci tarafı bağlama noktaları eklemek ek kopyalama komutlarını ek /mnt/destination[1-3] bağlama noktalarına çatallayarak daha fazla paralellik elde etmenizi sağlar.

Örneğin, dosyalarınız çok büyükse, kopyalama komutlarını farklı hedef yolları kullanacak şekilde tanımlayabilir ve kopyayı gerçekleştiren istemciden paralel olarak daha fazla komut gönderebilirsiniz.

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

Yukarıdaki örnekte, üç hedef bağlama noktasının tümü de istemci dosya kopyalama işlemleri tarafından hedeflenmektedir.

İstemciler ne zaman eklenir?

Son olarak, istemcinin özelliklerine ulaştığınızda, daha fazla kopya iş parçacığı veya ek bağlama noktası eklemek ek dosya/sn veya bayt/sn artışı sağlamaz. Bu durumda, kendi dosya kopyalama işlemi kümelerini çalıştıracak aynı bağlama noktaları kümesine sahip başka bir istemci dağıtabilirsiniz.

Örnek:

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

Dosya bildirimleri oluşturma

Yukarıdaki yaklaşımları (hedef başına birden çok kopya iş parçacığı, istemci başına birden çok hedef, ağ tarafından erişilebilen kaynak dosya sistemi başına birden çok istemci) anladıktan sonra şu öneriyi göz önünde bulundurun: Dosya bildirimleri oluşturun ve bunları birden çok istemcide kopyalama komutları ile kullanın.

Bu senaryo, dosya veya dizin bildirimlerini oluşturmak için UNIX find komutunu kullanır:

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

Bu sonucu bir dosyaya yeniden yönlendirin: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo

Ardından dosyaları saymak ve alt dizinlerin boyutlarını belirlemek için BASH komutlarını kullanarak bildirimde yineleme yapabilirsiniz:

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

Son olarak, istemcilere gerçek dosya kopyalama komutlarını oluşturmanız gerekir.

Dört istemciniz varsa şu komutu kullanın:

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

Beş istemciniz varsa aşağıdaki gibi bir şey kullanın:

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

Ve altı için.... Gerektiğinde tahminde bulun.

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

Komut çıkışının find bir parçası olarak elde edilen dördüncü düzey dizinlerin yol adlarını içeren her N istemciniz için bir tane olmak üzere N sonuç dosyaları alırsınız.

Kopyalama komutunu oluşturmak için her dosyayı kullanın:

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

Yukarıdakiler, istemcide BASH betiği olarak çalıştırabileceğiniz, her birinin satır başına kopyalama komutuna sahip olan N dosyalarını verir.

Amaç, bu betiklerin birden çok iş parçacığını istemci başına eşzamanlı olarak birden çok istemcide paralel olarak çalıştırmaktır.