Статьи

Мониторинг загрузки S3 в режиме реального времени

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

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

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

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

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

Итак, я придумал

Большое спасибо! Это помогло мне с мониторингом, и это так здорово работает!

  • несколько моих собственных сценариев.

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

  • Установка s3sync. Я только что использовал один сценарий s3cmd здесь, а не s3sync в реальном. Может быть в будущем — так что у меня есть это.
  • 01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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.
  • 1
    2
    3
    4
    5
    6
    7
    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, например.
  • s3sync находится в / home / ubuntu
  • Репозиторий Watcher находится в / home / Ubuntu

Пачкать руки …

  • Перейдите в Watcher и задайте каталог, за которым нужно следить, и соответствующие действия, которые необходимо предпринять.
  • 01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    $ 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 path в «s3path» в monitor.sh
    • Этот сценарий загрузит новый входящий файл, обнаруженный сценарием-наблюдателем, в формате хранения с избыточным резервированием. (вы можете удалить заголовок — при условии, что вы не заинтересованы хранить в формате RRS)
    • Сценарий вызовет скрипт s3cmd ruby ​​для рекурсивной загрузки и, таким образом, поддерживает иерархию, т.е. гггг / мм / дд формат с файлами *. *
    • Он удалит файл, успешно загруженный на s3 с локального пути — для экономии места на диске.
    • Сценарий не удалит каталог, так как об этом позаботится еще один скрипт re-upload.sh, который действует как резервная копия для неудачных загрузок, которые будут снова загружены в s3.
    • 01
      02
      03
      04
      05
      06
      07
      08
      09
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      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.
    • После успешной загрузки, удаляет файл и, следовательно, каталог, если он пуст.
    • 01
      02
      03
      04
      05
      06
      07
      08
      09
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      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
    1
    2
    3
    4
    5
    6
    7
    8
    $ 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, и скрипт повторной загрузки выполняется за предыдущий день, чтобы проверить, существуют ли файлы, и выполняет ли очистку соответствующим образом.
  • Давайте начнем сценарий
  • 1
    2
    3
    4
    5
    6
    Goto Watcher repository
    $ cd ~/Watcher
    $ sudo python watcher.py start
      
    This will create ~/.watcher directory and has watcher.log in it,
    when started.

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