Un script pour déplacer un milliard de fichiers vers SnowballEdge efficacement
- 2022.01.19
- added option to bypass setting the auto-extract metadata tag
- 2021.02.20
- save filelist_dir as filelist-currentdata.gz when executing genlist
- 2021.02.20
- performance improvement of genlist; dumping file list, not each line
- 2021.02.20
- replacing scandir.walk to os.walk. already os.walk module patched with scandir after python3.5
- 2021.02.10
- replacing os.path with scandir.path to improve performance of file listing
- 2021.02.09
- python2 compatibility for "open(filename, endoding)"
- 2021.02.01
- modifying to support Windows
- refactoring for more accurate defining of variables
- 2021.01.26
- multi processing support for parallel uploading of tar files
- relevant parameter: max_process
- 2021.01.25
- removing yaml feature, due for it to cause too much cpu consumtion and low performance
- fixing bug which use two profiles(sbe1, default), now only use "sbe1" profile
- showing progress
- 2020.02.25
- changing filelist file to contain the target filename
- 2020.02.24
- fixing FIFO error
- adding example of real snowball configuration
- 2020.02.22 - limiting multi-thread numbers
- adding multi-threading to improve performance
- adding fifo operation to reducing for big file which is over max_part_size
- 2020.02.19
- removing tarfiles_one_time logic
- spliting buffer by max_part_size
- 2020.02.18:
- supprt snowball limit:
- max_part_size: 512mb
- min_part_size: 5mb
- 2020.02.14:
- modifying for python3
- support korean in Windows
- 2020.02.12: adding features
- gen_filelist by size
- 2020.02.10: changing filename from tar_to_s3_v7_multipart.py to snowball_uploader_8.py
- adding features which can split tar file by size and count.
- adding feature which create file list
- showing help message
Snowball_uploader est développé pour déplacer de nombreux fichiers efficacement vers Snowball ou SnowballEdge qui est l'appliance d'AWS pour migrer les fichiers de pétaoctets vers S3. Surtout, lorsqu'il y a des millions de petits fichiers, il faut trop longtemps pour les transférer, alors cela retardera le projet et entraînera un coût élevé pour prêter la boule de neige. Cependant, en utilisant Snowball_uploader , vous pouvez raccourcir le temps de transfert. Il arche les fichiers dans une pièce en mémoire et envoie un gros morceau et agrégats dans plusieurs fichiers TAR.
Au début, je vous montrerais le résultat des performances. Le 1er résultat de boule de neige est mesuré lors du téléchargement de chaque fichier lors de la modification du nom, et le 2ème résultat est mesuré lors de l'application d'un script qui fabrique des fichiers d'archives avec TAR et Envoi à Snowball en mémoire. Avec la table et les numéros ci-dessous, vous remarquerez au moins 7 fois de meilleures performances avec la 2ème option.
Cible | Nombre de fichiers | Capacité totale | NAS -> Temps de boule de neige | Snowball -> temps S3 | Objets échoués |
---|---|---|---|---|---|
La première performance de boule de neige | 19 567 430 | 2 408 Go | 1W | 113 heures | 954 |
La 2ème performance de boule de neige | Env. 119 577 235 | 14 708 Go | 1W | 26 heures | 0 |
bucket_name = "your-own-bucket"
session = boto3 . Session ( profile_name = 'sbe1' )
s3 = session . client ( 's3' , endpoint_url = 'http://10.10.10.10:8080' )
# or below
#s3 = boto3.client('s3', endpoint_url='https://s3.ap-northeast-2.amazonaws.com')
#s3 = boto3.client('s3', region_name='ap-northeast-2', endpoint_url='https://s3.ap-northeast-2.amazonaws.com', aws_access_key_id=None, aws_secret_access_key=None)
target_path = '/move/to/s3/orgin/' ## very important!! change to your source directory
max_tarfile_size = 10 * 1024 ** 3 # 10GB
max_part_size = 300 * 1024 ** 2 # 300MB
min_part_size = 5 * 1024 ** 2 # 5MB
max_process = 5 # concurrent processes, set the value to less than filelist files in file list_dir
if os . name == 'nt' :
filelist_dir = "C:/Temp/fl_logdir_dkfjpoiwqjefkdjf/" #for windows
else :
filelist_dir = '/tmp/fl_logdir_dkfjpoiwqjefkdjf/' #for linux
ec2-user > python3 snowball_uploader.py genlist
Le paramètre GenList génère les fichiers manifestes contenant des fichiers d'origine et des fichiers cibles. Ce paramètre doit être exécuté avant de faire face aux fichiers.
ec2-user > ls /tmp/fl_logdir_dkfjpoiwqjefkdjf
fl_1.yml fl_2.yml fl_3.yml fl_4.yml fl_5.yml
ec2-suer > cat f1_1.yaml
- ./snowball_uploader_11_failed.py: ./snowball_uploader_11_failed.py
- ./success_fl_2.yaml_20200226_002049.log: ./success_fl_2.yaml_20200226_002049.log
- ./file_list.txt: ./file_list.txt
- ./snowball-fl_1-20200218_151840.tar: ./snowball-fl_1-20200218_151840.tar
- ./bytesio_test.py: ./bytesio_test.py
- ./filelist_dir1_10000.txt: ./filelist_dir1_10000.txt
- ./snowball_uploader_14_success.py: ./snowball_uploader_14_success.py
- ./error_fl_1.txt_20200225_022018.log: ./error_fl_1.txt_20200225_022018.log
- ./snowball_uploader_debug_success.py: ./snowball_uploader_debug_success.py
- ./success_fl_1.txt_20200225_022018.log: ./success_fl_1.txt_20200225_022018.log
- ./snowball_uploader_20_thread.py: ./snowball_uploader_20_thread.py
- ./success_fl_1.yml_20200229_173222.log: ./success_fl_1.yml_20200229_173222.log
- ./snowball_uploader_14_ing.py: ./snowball_uploader_14_ing.py
def rename_file ( org_file ):
target_file = org_file ##
return target_file
Le paramètre CP_Snowball transférera des fichiers vers Snowball
Lorsque le script s'exécute, il crée deux fichiers journaux, Success_'File_name ' ' Timestamp'.log et Error 'File_name' _ 'Timestamp'.log
#print ('n')
print ( 'genlist: ' )
print ( 'this option will generate files which are containing target files list in %s' % ( filelist_dir ))
#print ('n')
print ( 'cp_snowball: ' )
print ( 'cp_snowball option will copy the files on server to snowball efficiently' )
print ( 'the mechanism is here:' )
print ( '1. reads the target file name from the one filelist file in filelist directory' )
print ( '2. accumulates files to max_part_size in memory' )
print ( '3. if it reachs max_part_size, send it to snowball using MultiPartUpload' )
print ( '4. during sending data chunk, threads are invoked to max_thread' )
print ( '5. after complete to send, tar file is generated in snowball' )
print ( '6. then, moves to the next filelist file recursively' )
Je ne suis pas un programmeur professionnel, donc il peut avoir un peu de défaut, la gestion des erreurs est très médiocre. Et ce script peut consommer une énorme quantité de mémoire si vous définissez des nombres trop élevés de paramètres (max_threads, max_part_size et max_tarfile_size), alors il peut provoquer la congélation du système. Testez-le donc plusieurs fois avec des données d'échantillons. Lorsque je l'ai utilisé sur des sites clients, cela a réduit le temps de consommation plus de 10 fois. J'espère que vous pourriez également obtenir de l'aide de ce script.