[ 
https://issues.apache.org/jira/browse/AMBARI-4481?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13901776#comment-13901776
 ] 

Dmitry Lysnichenko commented on AMBARI-4481:
--------------------------------------------

final, tested patch is available at review board

> Add to the agent ability to download service scripts and hooks
> --------------------------------------------------------------
>
>                 Key: AMBARI-4481
>                 URL: https://issues.apache.org/jira/browse/AMBARI-4481
>             Project: Ambari
>          Issue Type: Task
>          Components: agent, controller
>    Affects Versions: 1.5.0
>            Reporter: Dmitry Lysnichenko
>            Assignee: Dmitry Lysnichenko
>             Fix For: 1.5.0
>
>         Attachments: AMBARI-4481_preview.patch
>
>
> h1. Proposal:
> h2. General conception
> Ambari server shares some files at /var/lib/ambari-server/resources/ via 
> HTTP. These files are accessible via url like 
> http://hostname:8080/resources/jdk-6u31-linux-x64.bin . Among these files 
> there are service scripts, templates and hooks. Agent has a cache of these 
> files. Cache directory structure is similar to contents of a stacks folder at 
> server. For example:
> $ ls /var/lib/ambari-agent/cache
> {code}
> └── stacks
>     └── HDP
>         ├── 2.0.7
>         │   ├── Accumulo
>         │   └── Flume
>         └── 2.0.8
>             ├── Accumulo
>             ├── Flume
>             └── YetAnotherService
> {code}
> If files for some service, component and stack version is not available at 
> cache, agent downloads appropriate files on first use. After files are 
> successfully unpacked, hash is also downloaded to a separate file (this way, 
> we ensure cache consistency). If any step of cache update fails (due to 
> timeout, missing files, broken archieve etc), agent fails command execution 
> with an appropriate message.
> h2. Packaging files into archives:
> The trouble is that in current Jetty configuration, ambari-server does not 
> allow to list directories.  To speed up download and avoid  the need to list 
> script files explicitly, the proposal is to pack directories "hooks" and 
> "packages" into zip archives. After download, agent unpacks archive into 
> cache.
> Execution steps:
> - on server startup, python script iterates over "hooks"/"package" 
> directories and counts directory sha1 hashes. Files and directories are 
> listed in alphabetical order, hash sum files and existing directory archives 
> are skipped. Only active (enabled) stacks are hashed/archived.
> - if directory archive does not exist or sha1 hash sum differs from 
> previously counted hash sum, archive is regenerated and saved to 
> "archive.zip" file.
> - sha1 hash of the directory is saved to .hash file in the root of 
> "hooks"/"package" directory.
> This way, we ensure that an archive is still actual if user changes some file 
> in directory or replaces entire directory.  
> h2. How to change stack files after server installation
> To change stack files (scripts, templates and so on) or add new 
> files/stacks/etc, user has to:
> - stop ambari-server
> - perform changes
> - start ambari-server
> - everything else will be done automagically
> h2. Cache invalidation
> Besides package archives, agent also downloads and stores archive hashes. We 
> use them for cache invalidation. As stack files may only change on server 
> restart (and agent reregistration), we will verify hashes only once and store 
> the result in FileCache until next agent registration.
> h2. Custom actions
> Custom action scripts are fetched/updated the same way as other files and are 
> stored at  /var/lib/ambari-agent/cache/custom_actions.
> h2. Choosing error handling strategy for download/unpack errors and other 
> settings
> Agent has two caching-related settings at ambari-agent.ini file.
> {code}
> [agent]
> cache_dir=/var/lib/ambari-agent/cache
> tolerate_download_failures=true
> {code}
> tolerate_download_failures option (defaults to true) determines agent 
> behaviour in case of any cache update error (while checking hashes, during 
> file download or archive unpacking). If a value is true, agent just writes 
> down a warning and continues command execution with existing cache. If value 
> is false, agent immediately considers ExecutionCommand failed (so user may 
> see the failed command at UI with appropriate error message).
> h2. rpm packaging
> Currently, stack files are included both to ambari-agent and to ambari-server 
> rpms. So agent comes with pre-packaged file cache. The issue is that files 
> that are packaged into an agent cache are not hashed (no ".hash" files 
> exist), that's why after rpm installation agent considers it's cache stale 
> and tries to update cache from the server. I'll add on-fly stack files 
> hashing during rpm generation at a separate jira. 
> h2. other ambari-server changes
> I've created a valid python ambari-server  package, that is properly packaged 
> into rpm and is visible to ambari-server.py.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to