Статьи

Мониторинг загрузки S3 для данных в реальном времени

Если вы работаете с большими данными и их передовыми технологиями, такими как Hadoop и т. Д., Вам прежде всего нужен «набор данных» для работы. Таким образом, этими данными могут быть обзоры, блоги, новости, данные социальных сетей (Twitter, Facebook и т. Д.), Данные по конкретным доменам, данные исследований, форумы, группы, каналы, данные пожарных рукавов и т. Д. Как правило, компании обращаются к поставщикам данных за такими данными. вид данных.

Обычно эти поставщики данных сбрасывают данные в среду с общим сервером. Чтобы мы могли использовать эти данные для обработки с помощью MapReduce и т. Д., Мы перемещаем их в S3 для хранения в первую очередь и последующей обработки. Предположим, данные принадлежат социальным сетям, таким как Twitter или Facebook, затем данные могут быть выгружены в соответствии с каталогом формата даты. Большинство случаев, это практика.

Также предполагается, что 140-150 ГБ в день сбрасывается в иерархии, например 2013/04/15 т.е. гггг / мм / дд формат, поток данных, как вы 

— загрузить их на s3 в той же иерархии в данное ведро?
— отслеживать новые входящие файлы и загружать их?
эффективно сэкономить место на диске?
— обеспечить надежность загрузки на s3?
— очистить, если ведение журнала включено для отслеживания?
— повторить неудачную загрузку?

Это были некоторые из вопросов, которые были у меня в голове, когда я хотел автоматизировать загрузку на S3. Кроме того, я хотел 0 вмешательства человека или, по крайней мере, по крайней мере! Итак, я придумал 

— s3sync / s3cmd.
— скрипт Грегори Эрнандеса для наблюдателя за питоном, здесь  https://github.com/greggoryhz/Watcher
Большое спасибо! Это помогло мне с мониторингом, и это так здорово работает!
— Несколько моих собственных сценариев.

Какие ингридиенты?

  •  Установка s3sync. Я только что использовал один сценарий s3cmd здесь, а не s3sync в реальном. Может быть в будущем — так что у меня есть это.
    Install Ruby from the repository
    $ sudo apt-get install ruby libopenssl-ruby
    Confirm with the version
    $ ruby -v
     
    Download and unzip s3sync
    $ wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
    $ tar -xvzf s3sync.tar.gz
     
    Install the certificates.
    $ sudo apt-get install ca-certificates
    $ cd s3sync/
     
    Add the credentials to the s3config.yml for s3sync to connect to s3.
    $ cd s3sync/
    $ sudo vi s3config.yml
    aws_access_key_id: ABCDEFGHIJKLMNOPQRST
    aws_secret_access_key: hkajhsg/knscscns19mksnmcns
    ssl_cert_dir: /etc/ssl/certs
     
    Edit aws_access_key_id and aws_secret_access_key to your own credentials.

Установка Watcher:

Goto https://github.com/greggoryhz/Watcher
Copy https://github.com/greggoryhz/Watcher.git to your clipboard
Install git if you have not
 
Clone the Watcher
$ git clone https://github.com/greggoryhz/Watcher.git
$ cd Watcher/
  • Мои собственные скрипты-обёртки.
  • хрон

Далее, настроив готовую среду, давайте сделаем некоторые общие «предположения».
  • Сбрасываемые данные будут находиться в / home / ubuntu / data / — оттуда это может быть 2013/04/15 для ex.
  • s3sync находится в / home / ubuntu
  • Репозиторий Watcher находится в / home / Ubuntu

Пачкать руки …
  • Перейдите в Watcher и установите каталог, за которым нужно следить, и соответствующие действия, которые необходимо предпринять.
$ cd Watcher/
Start the script,
$ sudo python watcher.py start
This will create a .watcher dirctory at /home/ubuntu
Now,
$ sudo python watcher.py stop
 
Goto the .watcher directory created and 
set the destination to be watched for and action to be undertaken
in jobs.yml ie. watch: and command:
 
# Copyright (c) 2010 Greggory Hernandez
 
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
 
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
 
# ---------------------------END COPYRIGHT--------------------------------------
 
# This is a sample jobs file. Yours should go in ~/.watcher/jobs.yml
# if you run watcher.py start, this file and folder will be created
 
job1:
  # a generic label for a job.  Currently not used make it whatever you want
  label: Watch /home/ubuntu/data for added or removed files
 
  # directory or file to watch.  Probably should be abs path.
  watch: /home/ubuntu/data
 
  # list of events to watch for.
  # supported events:
  # 'access' - File was accessed (read) (*)
  # 'atrribute_change' - Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
  # 'write_close' - File opened for writing was closed (*)
  # 'nowrite_close' - File not opened for writing was closed (*)
  # 'create' - File/directory created in watched directory (*)
  # 'delete' - File/directory deleted from watched directory (*)
  # 'self_delete' - Watched file/directory was itself deleted
  # 'modify' - File was modified (*)
  # 'self_move' - Watched file/directory was itself moved
  # 'move_from' - File moved out of watched directory (*)
  # 'move_to' - File moved into watched directory (*)
  # 'open' - File was opened (*)
  # 'all' - Any of the above events are fired
  # 'move' - A combination of 'move_from' and 'move_to'
  # 'close' - A combination of 'write_close' and 'nowrite_close'
  #
  # When monitoring a directory, the events marked with an asterisk (*) above
  # can occur for files in the directory, in which case the name field in the
  # returned event data identifies the name of the file within the directory.
  events: ['create', 'move_from', 'move_to']
 
  # TODO:
  # this currently isn't implemented, but this is where support will be added for:
  # IN_DONT_FOLLOW, IN_ONESHOT, IN_ONLYDIR and IN_NO_LOOP
  # There will be further documentation on these once they are implmented
  options: []
 
  # if true, watcher will monitor directories recursively for changes
  recursive: true
  
  # the command to run. Can be any command. It's run as whatever user started watcher.
  # The following wildards may be used inside command specification:
  # $ dollar sign
  # $watched watched filesystem path (see above)
  # $filename event-related file name
  # $tflags event flags (textually)
  # $nflags event flags (numerically)
  # $dest_file this will manage recursion better if included as the dest (especially when copying or similar)
  #     if $dest_file was left out of the command below, Watcher won't properly
  #     handle newly created directories when watching recursively. It's fine
  #     to leave out when recursive is false or you won't be creating new
  #     directories.
  # $src_path is only used in move_to and is the corresponding path from move_from
  # $src_rel_path [needs doc]
  command: sudo sh /home/ubuntu/s3sync/monitor.sh $filename
  • Создайте скрипт с именем monitor.sh для загрузки в s3 в каталоге s3sync, как показано ниже.
    • Переменные, которые вы можете изменить, это путь s3bucket в «s3path» в monitor.sh
    • Этот сценарий загрузит новый входящий файл, обнаруженный сценарием-наблюдателем, в формате хранения с избыточным резервированием. (вы можете удалить заголовок — при условии, что вы не заинтересованы хранить в формате RRS)
    • Сценарий вызовет скрипт s3cmd ruby ​​для рекурсивной загрузки и, таким образом, поддерживает иерархию, т.е. гггг / мм / дд формат с файлами *. *
    • Он удалит файл, успешно загруженный на s3 с локального пути — для экономии места на диске.
    • Сценарий не удалит каталог, так как об этом позаботится еще один скрипт re-upload.sh, который действует как резервная копия для неудачных загрузок, которые будут снова загружены в s3.
Goto s3sync directory
$ cd ~/s3sync
$ sudo vim monitor.sh
 
#!/bin/bash
##...........................................................##
## script to upload to S3BUCKET, once the change is detected ##
##...........................................................##
 
 
## AWS Credentials required for s3sync ##
export AWS_ACCESS_KEY_ID=ABCDEFGHSGJBKHKDAKS
export AWS_SECRET_ACCESS_KEY=jhhvftGFHVgs/bagFVAdbsga+vtpmefLOd
export SSL_CERT_DIR=/etc/ssl/certs
 
#echo "Running monitor.sh!"
echo "[INFO] File or directory modified = $1 "
 
## Read arguments
PASSED=$1
 
# Declare the watch path and  S3 destination path
watchPath='/home/ubuntu/data'
s3path='bucket-data:'
 
# Trim watch path from PASSED
out=${PASSED#$watchPath}
outPath=${out#"/"}
 
echo "[INFO] ${PASSED} will be uploaded to the S3PATH : $s3path$outPath"
 
if   [ -d "${PASSED}" ]
then  echo "[SAFEMODE ON] Directory created will not be uploaded, unless a file exists!"
elif [ -f "${PASSED}" ]
then ruby /home/ubuntu/s3sync/s3cmd.rb --ssl put $s3path$outPath ${PASSED}  x-amz-storage-class:REDUCED_REDUNDANCY; #USE s3cmd : File
else echo "[ERROR] ${PASSED} is not valid type!!";
     exit 1
fi
 
RETVAL=$?
[ $RETVAL -eq 0 ] && echo "[SUCCESS] Upload successful! " &&
if   [ -d "${PASSED}" ]
then echo "[SAFEMODE ON] ${PASSED} is a directory and its not deleted!";
elif [ -f "${PASSED}" ]
then sudo rm -rf ${PASSED}; echo "[SUCCESS] Sync and Deletion successful!";
fi
 
[ $RETVAL -ne 0 ] && echo "[ERROR] Synchronization failed!!"

  • Создайте скрипт с именем re-upload.sh, который будет загружать неудачные загрузки файлов.
    • Этот скрипт гарантирует, что файлы, оставшиеся из monitor.sh (неудачные загрузки — этот шанс очень мал. Может быть 2-4 файла / день. — по разным причинам.), Будут снова загружены на s3 с та же иерархия в формате RRS.
    •  После успешной загрузки, удаляет файл и, следовательно, каталог, если он пуст.

Goto s3sync directory.
$ cd s3sync
$ sudo vim re-upload.sh
 
#!/bin/bash
##.........................................................##
## script to detect failed uploads of other date directories
## and re-try                                              ##
##.........................................................##
 
## AWS Credentials required for s3sync ##
export AWS_ACCESS_KEY_ID=ABHJGDVABU5236DVBJD
export AWS_SECRET_ACCESS_KEY=hgvgvjhgGYTfs/I5sdn+fsbfsgLKjs
export SSL_CERT_DIR=/etc/ssl/certs
 
# Get the previous date 
today_date=$(date -d "1 days ago" +%Y%m%d)
year=$(date -d "1 days ago" +%Y%m%d|head -c 4|tail -c 4)
month=$(date -d "1 days ago" +%Y%m%d|head -c 6|tail -c 2)
yday=$(date -d "1 days ago" +%Y%m%d|head -c 8|tail -c 2)
 
# Set the path of data
basePath="/home/ubuntu/data"
datePath="$year/$month/$yday"
fullPath="$basePath/$datePath"
echo "Path checked for: $fullPath"
 
# Declare the watch path and  S3 destination path
watchPath='/home/ubuntu/data'
s3path='bucket-data:'
 
 
# check for left files (failed uploads)
if [ "$(ls -A $fullPath)" ]; then
        for i in `ls -a $fullPath/*.*`
        do
        echo "Left over file: $i";
                if [ -f "$i" ]
                then out=${i#$watchPath};
                outPath=${out#"/"};
                echo "Uploading to $s3path/$outPath";
                ruby /home/ubuntu/s3sync/s3cmd.rb --ssl put $s3path$outPath $i  x-amz-storage-class:REDUCED_REDUNDANCY; #USE s3cmd : File
                RETVAL=$?
                [ $RETVAL -eq 0 ] && echo "[SUCCESS] Upload successful! " && 
                                sudo rm -rf $i &&
                                echo "[SUCCESS] Deletion successful!"
                [ $RETVAL -ne 0 ] && echo "[ERROR] Upload failed!!"
                else echo "[CLEAN] no files exist!!";
                     exit 1
                fi
        done
else
        echo "$fullPath is empty";
        sudo rm -rf $fullPath;
        echo "Successfully deleted $fullPath"
        exit 1
fi
 
# post failed uploads -- delete empty dirs
if [ "$(ls -A $fullPath)" ]; then
        echo "Man!! Somethingz FISHY! All (failed)uploaded files will be deleted. Are there files yet!??";
        echo "Man!! I cannot delete it then! Please go check $fullPath";
else
        echo "$fullPath is empty after uploads";
        sudo rm -rf $fullPath;
        echo "Successfully deleted $fullPath"
fi

  • Теперь более грязная работа — регистрация и очистка журналов.
    • Все «эхо», созданные в monitor.sh, можно найти в ~ / .watcher / watcher.log, когда запущен watcher.py.
    • Этот журнал помогает нам изначально, а может и позже, чтобы отследить ошибки или около того.
    • Call of duty — Дворник за чистку бревен. Чтобы сделать это, мы можем использовать cron для запуска сценария. Мне было интересно бегать — каждую субботу в 8.00
    • Создайте скрипт для очистки журнала как «clean_log.sh» в / home / ubuntu / s3sync
  • Время для cron
$ crontab -e
 
Add the following lines at the end and save.
 
# EVERY SATURDAY 8:00AM clean watcher log
0 8 * * 6 sudo sh /home/ubuntu/s3sync/clean_log.sh
# EVERYDAY at 10:00AM check failed uploads of previous day
0 10 * * * sudo sh /home/ubuntu/s3sync/re-upload.sh

    • Все готово! очистка журналов происходит каждую субботу в 8.00, и скрипт повторной загрузки выполняется за предыдущий день, чтобы проверить, существуют ли файлы, и выполняет ли очистку соответствующим образом.
  • Давайте начнем сценарий
Goto Watcher repository
$ cd ~/Watcher
$ sudo python watcher.py start
 
This will create ~/.watcher directory and has watcher.log in it,
when started.

Таким образом, это гарантирует успешную загрузку на S3. 

Мой баш-фу с правдой!
?

Счастливого обучения!
?