0

我正在使用Python boto模塊訪問AWS S3文件。 我使用UNLOAD命令從Redshift卸載文件並自動對文件進行壓縮。 Redshift生成一個文件的10個部分。使用python boto下載AWS S3文件即使文件存在也會返回404

這是我使用來獲取文件列表,並調用下載功能的代碼部分:

key_list = bucket.list('folder_on_the_bucket') 
pool = ThreadPool(processes=10) 
partial_download = partial(download,0) 
pool.map(partial_download, key_list) 

這是下載功能:

def download(retry_cnt,key): 
retry_cnt = retry_cnt 
key = key 
try: 
    #make sure that I download only files, not folders 
    if key.name[-1]=='/' or key.name[-1]=='\\': 
     pass 
    else: 
     log.info("Downloading %s" % local_dir+ntpath.basename(key.name)) 
     key.get_contents_to_filename(local_dir+ntpath.basename(key.name)) 
     if retry_cnt > 0: 
      #copy all files that needed to be retried to a specific directory (for debugging purposes) 
      shutil.copyfile(local_dir+ntpath.basename(key.name), 'error_files_folder'+ntpath.basename(key.name)) 
except: 
    if retry_cnt < 3: 
     retry_cnt += 1 
     log.warning("error downloading file %s, retrying for the %s. time" % (str(key.name),str(retry_cnt))) 
     log.warning(str(sys.exc_info()[1])) 
     time.sleep(5) 
     download(retry_cnt,key) 
    else: 
     log.error(sys.exc_info()[1]) 
     sys.exit("Unable to download file") 

的問題是,有時, AWS將返回404錯誤,該文件不存在。我已經手動檢查了S3存儲桶中的文件並且它有數據。 我讀過,如果更改尚未傳播,S3可能會返回此類錯誤。這就是爲什麼下載功能看起來像這樣。如果文件發生錯誤,我會嘗試再次下載相同的文件。問題是我第二次下載文件時,它是空的,我失去了一些數據。 (十分之一)。

此問題在不同的桶和文件夾上隨機發生。

+0

另一種選擇是使用[AWS Command-Line Interface(CLI)](http://aws.amazon.com/cli/)使用'aws s3 sync'或'aws s3 cp - 遞歸「命令。 –

+0

我可以在下載功能中使用它,但是您認爲它可以解決404錯誤嗎?我認爲這種錯誤發生在AWS端,而不是Python。 – quickshare

回答

0

我設法通過改變下載功能的工作方式來解決它。我從那裏刪除了嘗試,並將其設置在調用它的代碼部分。

def get_download_files(): 
    global key_list 
    key_list = bucket.list(s3_full_path) 
    for f in key_list: 
     log.info(f) 
    try: 
     pool = ThreadPool(processes=10) 
     pool.map(download, key_list) 
    except: 
     log.warning("error occured while downloading") 
     log.warning(sys.exc_info()[1]) 
     global error_cnt 
     error_cnt = 1 
     pass 

通過使用該功能,我可以保證,如果任何文件無法下載任何原因,我將設置error_cnt爲1表明有一直有問題。之後,我有一個函數重試下載整個文件夾三次,然後拋出系統錯誤和整個過程失敗。

相關問題