Sprite.New
Syntax
Sprite.New (picID : int) : int
Description
Creates a new sprite from a picture specified by picID. The
sprite starts invisible and should be given a depth using
Sprite.SetHeight and a position, given Sprite.SetPosition
before being made visible using Sprite.Show. When you are
finished using the sprite, the sprite should be freed using
Sprite.Free.
Sprites work best when they are of moderate size. Large sprites will
cause flashing when moved across the screen.
Anything that is is color 0 in the picture will not appear when the
sprite is drawn. In other words, color 0 is transparent. (This is by
default. You can set the transparent color for a sprite by setting
the picture's transparent colour using
Pic.SetTransparentColor.
Example
See Sprite.Animate for an example of Sprite.New.
Status
Exported qualified.
This means that you can only call the function by calling
Sprite.New, not by calling New.
See also
Sprite.SetHeight,
Sprite.SetPosition,
Sprite.Show and
Sprite.Free.


Software engineer experienced in full project life cycle from design to implementation to integration.I am dynamic and performance driven engineering professional. Always up for new challenges.
- Part of development team for Reviews & Ratings.
- Extensive work in technologies :Node js , Python, React js, MongoDB, Redis, Docker
- Work on the Tech for User Generated Content like Reviews & Rating, Question & Answers etc.
CGPA: 8.18
Percentage: 84.6 %
CGPA: 9.2
Recognition of handwritten digits using artificial neural network: Designing of an Artificial Neural Network for handwritten digit recognition.
Encoding and decoding of data using Huffman coding and analysis over Extended Huffman coding, and Encryption and Decryption of encoded data using RSA.


RemoteAcademy is a tool that enables students to remotely access experiments without the need to download any software. Everything is handled over the internet and students are able to perform experiments at their convenience and on their schedule. Log in using your existing RCS ID and get started.


My name is Abdinasir Abdulkadir.I live in Nairobi which is the capital of Kenya.I graduated from The University of Nairobi in the year 2018 ,where i studied bachelor of commerce.I specialized in procurement and supply chain management. I am a talkative person and friendly at the same time. I like listening to motivational talks and people who work hard to inspire me.I am an optimistic individual who always has a positive outlook on life. I am very passionate in all aspects of life and have certain traits which acquire good sense of humour.
Since i was young i always loved computers. I got my first computer at the age of 17 and since then my passion for learning software grew day by day and after finishing my degree i had to pursue my passion for programming. Thats why i joined moringa school to learn how to code and become a software developer.
I worked for an organization called AMEN which was an NGO operating in the northern part of Kenya. During my time at the organization i worked on a project called " save a mother initiative" which was to provide support to pregnant mothers by giving support in terms of the following;
My hobbies are;


#include "gsl/gsl_const_mksa.h"
Go to the source code of this file.
| #define A_SPLINE_TYPE gsl_interp_akima |
| #define CLIGHT GSL_CONST_MKSA_SPEED_OF_LIGHT |
The speed of light in m/s
| #define CLIGHT_HMPC 2997.92458 |
Lightspeed / H0 in units of Mpc/h
| #define CORR_SPLINE_TYPE gsl_interp_akima |
| #define D_SPLINE_TYPE gsl_interp_akima |
| #define EPS_SCALEFAC_GROWTH 1E-6 |
Absolute precision in growth calculations
| #define EPSREL_CORR_FUNC 1E-3 |
Relative precision in distance calculations
Relative precision in dNdz calculations
| #define EPSREL_GROWTH 1E-6 |
Relative precision in growth calculations
| #define EV_IN_J GSL_CONST_MKSA_ELECTRON_VOLT |
Electron volt to Joules convestion
| #define GNEWT 6.67428e-11 |
Newton's gravitational constant in units of m^3/Kg/s^2
| #define GSL_INTEGRATION_LIMIT 1000 |
| #define HPLANCK GSL_CONST_MKSA_PLANCKS_CONSTANT_H |
Planck's constant in units kg m^2 / s
k pivot. These are in units of Mpc (no factor of h)
| #define K_SPLINE_TYPE gsl_interp_akima |
| #define KBOLTZ GSL_CONST_MKSA_BOLTZMANN |
Boltzmann constant in units of J/K
| #define L_SPLINE_TYPE gsl_interp_akima |
| #define M_PI 3.14159265358979323846 |
PI (in case it's not defined from math.h)
| #define M_SPLINE_TYPE gsl_interp_akima |
| #define MPC_TO_METER 3.08567758149e22 |
Mpc to meters (from PDG 2013)
| #define PC_TO_METER 3.08567758149e16 |
pc to meters (from PDG 2013)
| #define PLIN_SPLINE_TYPE gsl_interp2d_bicubic |
| #define PNL_SPLINE_TYPE gsl_interp2d_bicubic |
Rho critical in units of M_sun/h / (Mpc/h)^3
| #define SOLAR_MASS GSL_CONST_MKSA_SOLAR_MASS |
Solar mass in units of kg (from GSL)
| #define STBOLTZ GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT |
Stefan-Boltzmann constant in units of kg/s^3 / K^4
T_ncdm, as taken from CLASS, explanatory.ini
| #define Z_MAX_SOURCES 3.0 |
| #define Z_MIN_SOURCES 0.1 |


Object.notify()
or Object.notifyAll()
for which no call to a corresponding
Object.wait()
can be found.
Only calls that target fields of the current class are reported by this inspection.
Example:
synchronized (synList) {
synList.notify(); //synList.wait() is never called
}


This program creates a windowed calculator program using Java Swind components and implements full functionality. It provides addition, subtraction, multiplication, and division operations.
The user can enter numbers and perform calculations as needed. Calculations are computed in the order they are entered.
The code consists of the Calculator class that extends JFrame. It creates a JTextField for the display, and nests a grid of JButtons to get the input. A series of boolean values are used to store the state of the current calculation and are used to determine the behavior of each button press. For example, an operator button pressed when the program first starts does nothing, but if pressed after a number has been entered it updates the display and the calculator is prepared for another input.
An inner class ButtonHandler implements ActionListener to handle the events generated by pressing buttons.


Installation¶
This document will guide you through the process of installing Singularity >= 3.0.0 via several different methods. (For instructions on installing earlier versions of Singularity please see earlier versions of the docs.)
Overview¶
Singularity runs on Linux natively and can also be run on Windows and Mac through virtual machines (VMs). Here we cover several different methods of installing Singularity (>=v3.0.0) on Linux and also give methods for downloading and running VMs with singularity pre-installed from Vagrant Cloud.
Install on Linux¶
Linux is the only operating system that can support containers because of kernel features like namespaces. You can use these methods to install Singularity on bare metal Linux or a Linux VM.
Before you begin¶
If you have an earlier version of Singularity installed, you should remove it before executing the installation commands. You will also need to install some dependencies and install Go.

Visit the Go download page and pick a package
archive to download. Copy the link address and download with wget. Then extract
the archive to /usr/local
(or use other instructions on go installation
page).
$ export VERSION=1.11 OS=linux ARCH=amd64 && \
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz && \
sudo tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz && \
rm go$VERSION.$OS-$ARCH.tar.gz
Then, set up your environment for Go.
$ echo 'export GOPATH=${HOME}/go' >> ~/.bashrc && \
echo 'export PATH=/usr/local/go/bin:${PATH}:${GOPATH}/bin' >> ~/.bashrc && \
source ~/.bashrc
If you are installing Singularity >=v3.0.0 you will also need to install dep
for dependency resolution.
$ go get -u github.com/golang/dep/cmd/dep
Download Singularity from a release¶
You can download Singularity from one of our releases. To see a full list, visit <https://github.com/sylabs/singularity/releases>. After that you can just run the following commands to proceed with the installation.
$ export VERSION=3.1.1 && # adjust this as necessary \
mkdir -p $GOPATH/src/github.com/sylabs && \
cd $GOPATH/src/github.com/sylabs && \
wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz && \
tar -xzf singularity-${VERSION}.tar.gz && \
cd singularity
Download from source¶
The following commands will install Singularity from the GitHub repo to /usr/local
. This method will
work for >=v3.0.0. To install an older tagged release see older versions of the
docs.
When installing from source, you can decide to install from either a tag, a release branch, or from the master branch.
tag: GitHub tags form the basis for releases, so installing from a tag is the same as downloading and installing a specific release. Tags are expected to be relatively stable and well-tested.
release branch: A release branch represents the latest version of a minor release with all the newest bug fixes and enhancements (even those that have not yet made it into a point release). For instance, to install v3.1 with the latest bug fixes and enhancements checkout
release-3.1
. Release branches may be less stable than code in a tagged point release.master branch: The
master
branch contains the latest, bleeding edge version of Singularity. This is the default branch when you clone the source code, so you don’t have to check out any new branches to install it. Themaster
branch changes quickly and may be unstable.
To ensure that the Singularity source code is downloaded to the appropriate directory use these commands.
$ mkdir -p $GOPATH/src/github.com/sylabs && \
cd $GOPATH/src/github.com/sylabs && \
git clone https://github.com/sylabs/singularity.git && \
cd singularity && \
git checkout v3.1.1
Compile Singularity¶
Singularity uses a custom build system called makeit
. mconfig
is called
to generate a Makefile
and then make
is used to compile and install.
$ ./mconfig && \
make -C ./builddir && \
sudo make -C ./builddir install
By default Singularity will be installed in the /usr/local
directory hierarchy.
You can specify a custom directory with the --prefix
option, to mconfig
like so:
$ ./mconfig --prefix=/opt/singularity
This option can be useful if you want to install multiple versions of Singularity, install a personal version of Singularity on a shared system, or if you want to remove Singularity easily after installing it.
For a full list of mconfig
options, run mconfig --help
. Here are some
of the most common options that you may need to use when building Singularity
from source.
--sysconfdir
: Install read-only config files in sysconfdir. This option is important if you need thesingularity.conf
file or other configuration files in a custom location.--localstatedir
: Set the state directory where containers are mounted. This is a particularly important option for administrators installing Singularity on a shared file system. The--localstatedir
should be set to a directory that is present on each individual node.-b
: Build Singularity in a given directory. By default this is./builddir
.
Source bash completion file¶
To enjoy bash completion with Singularity commands and options, source the bash completion file like so. Add this command to your ~/.bashrc file so that bash completion continues to work in new shells. (Obviously adjust this path if you installed the bash completion file in a different location.)
$ . /usr/local/etc/bash_completion.d/singularity
Build and install an RPM¶
Building and installing a Singularty RPM allows the installation be more easily managed, upgraded and removed. In Singularity >=v3.0.1 you can build an RPM directly from the release tarball.
Note
Be sure to download the correct asset from the GitHub releases page. It should be named singularity-<version>.tar.gz.
After installing the dependencies and installing Go as detailed above, you are ready download the tarball and build and install the RPM.
$ export VERSION=3.1.1 && # adjust this as necessary \
wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz && \
rpmbuild -tb singularity-${VERSION}.tar.gz && \
sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/singularity-$VERSION-1.el7.x86_64.rpm && \
rm -rf ~/rpmbuild singularity-$VERSION*.tar.gz
Options to mconfig
can be passed using the familiar syntax to rpmbuild
.
For example, if you want to force the local state directory to /mnt
(instead
of the default /var
) you can do the following:
rpmbuild -tb --define='_localstatedir /mnt' singularity-$VERSION.tar.gz
Note
It is very important to set the local state directory to a directory that
physically exists on nodes within a cluster when installing Singularity in
an HPC environment with a shared file system. Thus the _localstatedir
option should be of considerable interest to HPC admins.
Remove an old version¶
When you run sudo make install
, the command lists files as they are
installed. They must all be removed in order to completely remove Singularity.
For example, in a standard installation of Singularity 3.0.1 and beyond (when building from source) you must remove all of these files and directories to completely remove Singularity.
Obviously, this list of files may differ depending on how you install Singularity or with newer versions of Singularity released following the writing of this document.
$ sudo rm -rf \
/usr/local/libexec/singularity \
/usr/local/var/singularity \
/usr/local/etc/singularity \
/usr/local/bin/singularity \
/usr/local/bin/run-singularity \
/usr/local/etc/bash_completion.d/singularity
If you anticipate needing to remove Singularity, it might be easier to install
it in a custom directory using the --prefix
option to mconfig
. In that
case Singularity can be uninstalled simply by deleting the parent directory. Or
it may be useful to install Singularity using a package manager so that it can be updated and/or uninstalled with ease in the
future.
Distribution packages of Singularity¶
Note
Packaged versions of Singularity in Linux distribution repos are maintained by community members. They (necessarily) tend to be older releases of Singularity. For the latest upstream versions of Singularity it is recommended that you build from source using one of the methods detailed above.
Install the Debian/Ubuntu package using apt
¶
Singularity is available on Debian and derivative distributions starting with
Debian stretch and the Ubuntu 16.10 releases. The package is called
singularity-container
. For more recent releases of singularity and
backports for older Debian and Ubuntu releases, it is recommended that you use
the NeuroDebian repository.
Enable the NeuroDebian repository following instructions on the NeuroDebian site. Use the dropdown menus to find the best mirror for your operating system and location. For example, after selecting Ubuntu 16.04 and selecting a mirror in CA, you are instructed to add these lists:
$ sudo wget -O- http://neuro.debian.net/lists/xenial.us-ca.full | sudo tee /etc/apt/sources.list.d/neurodebian.sources.list && \
sudo apt-key adv --recv-keys --keyserver hkp://pool.sks-keyservers.net:80 0xA5D32F012649A5A9 && \
sudo apt-get update
Now singularity can be installed like so:
sudo apt-get install -y singularity-container
During the above, if you have a previously installed configuration, you might be asked if you want to define a custom configuration/init, or just use the default provided by the package, eg:
Configuration file '/etc/singularity/init'
==> File on system created by you or by a script.
==> File also in package provided by package maintainer.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** init (Y/I/N/O/D/Z) [default=N] ? Y
Configuration file '/etc/singularity/singularity.conf'
==> File on system created by you or by a script.
==> File also in package provided by package maintainer.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** singularity.conf (Y/I/N/O/D/Z) [default=N] ? Y
Most users should accept these defaults. For cluster admins, we recommend that you read the admin docs to get a better understanding of the configuration file options available to you.
After following this procedure, you can check the Singularity version like so:
$ singularity --version
2.5.2-dist
If you need a backport build of the recent release of Singularity on those or older releases of Debian and Ubuntu, you can see all the various builds and other information here.
Install the CentOS/RHEL package using yum
¶
The epel (Extra Packages for Enterprise Linux) repos contain Singularity. The
singularity package is actually split into two packages called
singularity-runtime
(which simply contains the necessary bits to run
singularity containers) and singularity
(which also gives you the ability to
build Singularity containers).
To install Singularity from the epel repos, first install the repos and then install Singularity. For instance, on CentOS6/7 do the following:
$ sudo yum update -y && \
sudo yum install -y epel-release && \
sudo yum update -y && \
sudo yum install -y singularity-runtime singularity
After following this procedure, you can check the Singularity version like so:
$ singularity --version
2.6.0-dist
Install on Windows or Mac¶
Linux containers like Singularity cannot run natively on Windows or Mac because of basic incompatibilities with the host kernel. (Contrary to a popular misconception, Mac does not run on a Linux kernel. It runs on a kernel called Darwin originally forked from BSD.)
For this reason, the Singularity community maintains a set of Vagrant Boxes via Vagrant Cloud, one of Hashicorp’s open source tools. The current versions can be found under the sylabs organization.
Setup¶
First, install the following software:
Windows¶
Install the following programs:
Mac¶
Singularity is available via Vagrant (installable with Homebrew or manually) or with the Singularity Desktop for macOS (Alpha Preview).
With Homebrew: .. code-block:: none
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” brew cask install virtualbox &&
brew cask install vagrant && brew cask install vagrant-manager
With Singularity Desktop for macOS (Alpha Preview):
The disk image file is available here. More information can be found here.
More information can be found here.
Singularity Vagrant Box¶
Run GitBash (Windows) or open a terminal (Mac) and create and enter a directory to be used with your Vagrant VM.
$ mkdir vm-singularity && \
cd vm-singularity
If you have already created and used this folder for another VM, you will need to destroy the VM and delete the Vagrantfile.
$ vagrant destroy && \
rm Vagrantfile
Then issue the following commands to bring up the Virtual Machine. (Substitute a
different value for the $VM
variable if you like.)
$ export VM=sylabs/singularity-3.1-ubuntu-bionic64 && \
vagrant init $VM && \
vagrant up && \
vagrant ssh
You can check the installed version of Singularity with the following:
vagrant@vagrant:~$ singularity version
3.1.1-1
Of course, you can also start with a plain OS Vagrant box as a base and then install Singularity using one of the above methods for Linux.


Constructor
Namespace: Imagini
Declared in: Imagini.App2D
Creates a new app with the specified window settings.
public App2D(
WindowSettings settings,
RendererInfo driver,
bool useSurfaceApi
)
driver
Specifies a renderer to be used. If null, first hardware-accelerated renderer is used.
useSurfaceApi
If true, initializes Surface instead of Graphics


Facebook locks you into a filter bubble. In order to better serve advertisement it shows you the info that gets the most likes from your friends, making it harder for you to discover new, unexpected stuff. News Feed, in this case, becomes the main source of distraction and time wasting, because it just feeds you with what you already know. So it may be engaging, but it will not change anything.
At the same time, there are many positive sides to Facebook and interesting features that are a bit hidden from users.
Like all those new people that you can find, the groups where you can discover new stuff, and even – if you observe the way you are using it – you can find out a lot of new things about yourself as well.
In order to leave only the good parts in Facebook, we made this app, which simply blocks your newsfeed.
The main strategy is to divert your attention from Newsfeed to:
a) Self-awareness (showing the interesting facts about Facebook and human behavior from scientific research);
b) Hidden interesting Facebook features (like Graph Search) that will expand your social circle and help you discover new stuff;
c) Physical and cognitive exercises designed to shift your attention and physicality and remove tension;
If you have any ideas for more strategies or want to make your own version of this app, please contact us on
Nodus Labs.
Polysingular News Feed Tuning is open source. It is based on JordWest's News Feed Eradicator and the modified source code is available on github. The scientifict research is taken from Nodus Labs, some quotes are from Polysingularity.


Pearl Lash Extensions is an e-commerce website built with Wordpress, and hosted on e-host. The company services include certified eyelash trainings and products.
When I started with this project I originally built it with AngularJS, and I used Firebase to store user information.
The client needed a way for the user to be able to view courses the company offers, buy products, and pay for certified training classes. As the project progressed, the website became too complicated for the client to manage without the help of a developer. I decided in order to make the website more "client friendly" and have a simple way for the client to manage it, I had to recreate the website in Wordpress and to use built in plugins that Wordpress offers for e-commerce, Square Space, etc.
View Project Details Here.
View Website Here.
View on Github Here.


The ResourceManager REST API’s allow the user to get information about the cluster - status on the cluster, metrics on the cluster, scheduler information, information about nodes in the cluster, and information about applications on the cluster.
To enable cross-origin support (CORS) for the RM only(without enabling it for the NM), please set the following configuration parameters:
In core-site.xml, add org.apache.hadoop.security.HttpCrossOriginFilterInitializer to hadoop.http.filter.initializers. In yarn-site.xml, set yarn.resourcemanager.webapp.cross-origin.enabled to true.
The cluster information resource provides overall information about the cluster.
Both of the following URI’s give you the cluster information.
* http://<rm http address:port>/ws/v1/cluster * http://<rm http address:port>/ws/v1/cluster/info
| Item | Data Type | Description |
|---|---|---|
| id | long | The cluster id |
| startedOn | long | The time the cluster started (in ms since epoch) |
| state | string | The ResourceManager state - valid values are: NOTINITED, INITED, STARTED, STOPPED |
| haState | string | The ResourceManager HA state - valid values are: INITIALIZING, ACTIVE, STANDBY, STOPPED |
| resourceManagerVersion | string | Version of the ResourceManager |
| resourceManagerBuildVersion | string | ResourceManager build string with build version, user, and checksum |
| resourceManagerVersionBuiltOn | string | Timestamp when ResourceManager was built (in ms since epoch) |
| hadoopVersion | string | Version of hadoop common |
| hadoopBuildVersion | string | Hadoop common build string with build version, user, and checksum |
| hadoopVersionBuiltOn | string | Timestamp when hadoop common was built(in ms since epoch) |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/info
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "clusterInfo": { "id":1324053971963, "startedOn":1324053971963, "state":"STARTED", "resourceManagerVersion":"0.23.1-SNAPSHOT", "resourceManagerBuildVersion":"0.23.1-SNAPSHOT from 1214049 by user1 source checksum 050cd664439d931c8743a6428fd6a693", "resourceManagerVersionBuiltOn":"Tue Dec 13 22:12:48 CST 2011", "hadoopVersion":"0.23.1-SNAPSHOT", "hadoopBuildVersion":"0.23.1-SNAPSHOT from 1214049 by user1 source checksum 11458df3bb77342dca5f917198fad328", "hadoopVersionBuiltOn":"Tue Dec 13 22:12:26 CST 2011" } }
XML response
HTTP Request:
Accept: application/xml GET http://<rm http address:port>/ws/v1/cluster/info
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 712 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <clusterInfo> <id>1324053971963</id> <startedOn>1324053971963</startedOn> <state>STARTED</state> <resourceManagerVersion>0.23.1-SNAPSHOT</resourceManagerVersion> <resourceManagerBuildVersion>0.23.1-SNAPSHOT from 1214049 by user1 source checksum 050cd664439d931c8743a6428fd6a693</resourceManagerBuildVersion> <resourceManagerVersionBuiltOn>Tue Dec 13 22:12:48 CST 2011</resourceManagerVersionBuiltOn> <hadoopVersion>0.23.1-SNAPSHOT</hadoopVersion> <hadoopBuildVersion>0.23.1-SNAPSHOT from 1214049 by user1 source checksum 11458df3bb77342dca5f917198fad328</hadoopBuildVersion> <hadoopVersionBuiltOn>Tue Dec 13 22:12:48 CST 2011</hadoopVersionBuiltOn> </clusterInfo>
The cluster metrics resource provides some overall metrics about the cluster. More detailed metrics should be retrieved from the jmx interface.
| Item | Data Type | Description |
|---|---|---|
| appsSubmitted | int | The number of applications submitted |
| appsCompleted | int | The number of applications completed |
| appsPending | int | The number of applications pending |
| appsRunning | int | The number of applications running |
| appsFailed | int | The number of applications failed |
| appsKilled | int | The number of applications killed |
| reservedMB | long | The amount of memory reserved in MB |
| availableMB | long | The amount of memory available in MB |
| allocatedMB | long | The amount of memory allocated in MB |
| totalMB | long | The amount of total memory in MB |
| reservedVirtualCores | long | The number of reserved virtual cores |
| availableVirtualCores | long | The number of available virtual cores |
| allocatedVirtualCores | long | The number of allocated virtual cores |
| totalVirtualCores | long | The total number of virtual cores |
| containersAllocated | int | The number of containers allocated |
| containersReserved | int | The number of containers reserved |
| containersPending | int | The number of containers pending |
| totalNodes | int | The total number of nodes |
| activeNodes | int | The number of active nodes |
| lostNodes | int | The number of lost nodes |
| unhealthyNodes | int | The number of unhealthy nodes |
| decommissionedNodes | int | The number of nodes decommissioned |
| rebootedNodes | int | The number of nodes rebooted |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/metrics
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "clusterMetrics": { "appsSubmitted":0, "appsCompleted":0, "appsPending":0, "appsRunning":0, "appsFailed":0, "appsKilled":0, "reservedMB":0, "availableMB":17408, "allocatedMB":0, "reservedVirtualCores":0, "availableVirtualCores":7, "allocatedVirtualCores":1, "containersAllocated":0, "containersReserved":0, "containersPending":0, "totalMB":17408, "totalVirtualCores":8, "totalNodes":1, "lostNodes":0, "unhealthyNodes":0, "decommissionedNodes":0, "rebootedNodes":0, "activeNodes":1 } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/metrics Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 432 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <clusterMetrics> <appsSubmitted>0</appsSubmitted> <appsCompleted>0</appsCompleted> <appsPending>0</appsPending> <appsRunning>0</appsRunning> <appsFailed>0</appsFailed> <appsKilled>0</appsKilled> <reservedMB>0</reservedMB> <availableMB>17408</availableMB> <allocatedMB>0</allocatedMB> <reservedVirtualCores>0</reservedVirtualCores> <availableVirtualCores>7</availableVirtualCores> <allocatedVirtualCores>1</allocatedVirtualCores> <containersAllocated>0</containersAllocated> <containersReserved>0</containersReserved> <containersPending>0</containersPending> <totalMB>17408</totalMB> <totalVirtualCores>8</totalVirtualCores> <totalNodes>1</totalNodes> <lostNodes>0</lostNodes> <unhealthyNodes>0</unhealthyNodes> <decommissionedNodes>0</decommissionedNodes> <rebootedNodes>0</rebootedNodes> <activeNodes>1</activeNodes> </clusterMetrics>
A scheduler resource contains information about the current scheduler configured in a cluster. It currently supports both the Fifo and Capacity Scheduler. You will get different information depending on which scheduler is configured so be sure to look at the type information.
The capacity scheduler supports hierarchical queues. This one request will print information about all the queues and any subqueues they have. Queues that can actually have jobs submitted to them are referred to as leaf queues. These queues have additional data associated with them.
| Item | Data Type | Description |
|---|---|---|
| type | string | Scheduler type - capacityScheduler |
| capacity | float | Configured queue capacity in percentage relative to its parent queue |
| usedCapacity | float | Used queue capacity in percentage |
| maxCapacity | float | Configured maximum queue capacity in percentage relative to its parent queue |
| queueName | string | Name of the queue |
| queues | array of queues(JSON)/zero or more queue objects(XML) | A collection of queue resources |
| Item | Data Type | Description |
|---|---|---|
| capacity | float | Configured queue capacity in percentage relative to its parent queue |
| usedCapacity | float | Used queue capacity in percentage |
| maxCapacity | float | Configured maximum queue capacity in percentage relative to its parent queue |
| absoluteCapacity | float | Absolute capacity percentage this queue can use of entire cluster |
| absoluteMaxCapacity | float | Absolute maximum capacity percentage this queue can use of the entire cluster |
| absoluteUsedCapacity | float | Absolute used capacity percentage this queue is using of the entire cluster |
| numApplications | int | The number of applications currently in the queue |
| usedResources | string | A string describing the current resources used by the queue |
| queueName | string | The name of the queue |
| state | string of QueueState | The state of the queue |
| queues | array of queues(JSON)/zero or more queue objects(XML) | A collection of sub-queue information |
| resourcesUsed | A single resource object | The total amount of resources used by this queue |
| Item | Data Type | Description |
|---|---|---|
| type | String | type of the queue - capacitySchedulerLeafQueueInfo |
| numActiveApplications | int | The number of active applications in this queue |
| numPendingApplications | int | The number of pending applications in this queue |
| numContainers | int | The number of containers being used |
| maxApplications | int | The maximum number of applications this queue can have |
| maxApplicationsPerUser | int | The maximum number of applications per user this queue can have |
| maxActiveApplications | int | The maximum number of active applications this queue can have |
| maxActiveApplicationsPerUser | int | The maximum number of active applications per user this queue can have |
| userLimit | int | The minimum user limit percent set in the configuration |
| userLimitFactor | float | The user limit factor set in the configuration |
| users | array of users(JSON)/zero or more user objects(XML) | A collection of user objects containing resources used |
| Item | Data Type | Description |
|---|---|---|
| username | String | The username of the user using the resources |
| resourcesUsed | A single resource object | The amount of resources used by the user in this queue |
| numActiveApplications | int | The number of active applications for this user in this queue |
| numPendingApplications | int | The number of pending applications for this user in this queue |
| Item | Data Type | Description |
|---|---|---|
| memory | int | The amount of memory used (in MB) |
| vCores | int | The number of virtual cores |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/scheduler
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "scheduler": { "schedulerInfo": { "capacity": 100.0, "maxCapacity": 100.0, "queueName": "root", "queues": { "queue": [ { "absoluteCapacity": 10.5, "absoluteMaxCapacity": 50.0, "absoluteUsedCapacity": 0.0, "capacity": 10.5, "maxCapacity": 50.0, "numApplications": 0, "queueName": "a", "queues": { "queue": [ { "absoluteCapacity": 3.15, "absoluteMaxCapacity": 25.0, "absoluteUsedCapacity": 0.0, "capacity": 30.000002, "maxCapacity": 50.0, "numApplications": 0, "queueName": "a1", "queues": { "queue": [ { "absoluteCapacity": 2.6775, "absoluteMaxCapacity": 25.0, "absoluteUsedCapacity": 0.0, "capacity": 85.0, "maxActiveApplications": 1, "maxActiveApplicationsPerUser": 1, "maxApplications": 267, "maxApplicationsPerUser": 267, "maxCapacity": 100.0, "numActiveApplications": 0, "numApplications": 0, "numContainers": 0, "numPendingApplications": 0, "queueName": "a1a", "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "type": "capacitySchedulerLeafQueueInfo", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>", "userLimit": 100, "userLimitFactor": 1.0, "users": null }, { "absoluteCapacity": 0.47250003, "absoluteMaxCapacity": 25.0, "absoluteUsedCapacity": 0.0, "capacity": 15.000001, "maxActiveApplications": 1, "maxActiveApplicationsPerUser": 1, "maxApplications": 47, "maxApplicationsPerUser": 47, "maxCapacity": 100.0, "numActiveApplications": 0, "numApplications": 0, "numContainers": 0, "numPendingApplications": 0, "queueName": "a1b", "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "type": "capacitySchedulerLeafQueueInfo", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>", "userLimit": 100, "userLimitFactor": 1.0, "users": null } ] }, "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>" }, { "absoluteCapacity": 7.35, "absoluteMaxCapacity": 50.0, "absoluteUsedCapacity": 0.0, "capacity": 70.0, "maxActiveApplications": 1, "maxActiveApplicationsPerUser": 100, "maxApplications": 735, "maxApplicationsPerUser": 73500, "maxCapacity": 100.0, "numActiveApplications": 0, "numApplications": 0, "numContainers": 0, "numPendingApplications": 0, "queueName": "a2", "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "type": "capacitySchedulerLeafQueueInfo", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>", "userLimit": 100, "userLimitFactor": 100.0, "users": null } ] }, "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>" }, { "absoluteCapacity": 89.5, "absoluteMaxCapacity": 100.0, "absoluteUsedCapacity": 0.0, "capacity": 89.5, "maxCapacity": 100.0, "numApplications": 2, "queueName": "b", "queues": { "queue": [ { "absoluteCapacity": 53.7, "absoluteMaxCapacity": 100.0, "absoluteUsedCapacity": 0.0, "capacity": 60.000004, "maxActiveApplications": 1, "maxActiveApplicationsPerUser": 100, "maxApplications": 5370, "maxApplicationsPerUser": 537000, "maxCapacity": 100.0, "numActiveApplications": 1, "numApplications": 2, "numContainers": 0, "numPendingApplications": 1, "queueName": "b1", "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "type": "capacitySchedulerLeafQueueInfo", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>", "userLimit": 100, "userLimitFactor": 100.0, "users": { "user": [ { "numActiveApplications": 0, "numPendingApplications": 1, "resourcesUsed": { "memory": 0, "vCores": 0 }, "username": "user2" }, { "numActiveApplications": 1, "numPendingApplications": 0, "resourcesUsed": { "memory": 0, "vCores": 0 }, "username": "user1" } ] } }, { "absoluteCapacity": 35.3525, "absoluteMaxCapacity": 100.0, "absoluteUsedCapacity": 0.0, "capacity": 39.5, "maxActiveApplications": 1, "maxActiveApplicationsPerUser": 100, "maxApplications": 3535, "maxApplicationsPerUser": 353500, "maxCapacity": 100.0, "numActiveApplications": 0, "numApplications": 0, "numContainers": 0, "numPendingApplications": 0, "queueName": "b2", "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "type": "capacitySchedulerLeafQueueInfo", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>", "userLimit": 100, "userLimitFactor": 100.0, "users": null }, { "absoluteCapacity": 0.4475, "absoluteMaxCapacity": 100.0, "absoluteUsedCapacity": 0.0, "capacity": 0.5, "maxActiveApplications": 1, "maxActiveApplicationsPerUser": 100, "maxApplications": 44, "maxApplicationsPerUser": 4400, "maxCapacity": 100.0, "numActiveApplications": 0, "numApplications": 0, "numContainers": 0, "numPendingApplications": 0, "queueName": "b3", "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "type": "capacitySchedulerLeafQueueInfo", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>", "userLimit": 100, "userLimitFactor": 100.0, "users": null } ] }, "resourcesUsed": { "memory": 0, "vCores": 0 }, "state": "RUNNING", "usedCapacity": 0.0, "usedResources": "<memory:0, vCores:0>" } ] }, "type": "capacityScheduler", "usedCapacity": 0.0 } } }
XML response
HTTP Request:
Accept: application/xml GET http://<rm http address:port>/ws/v1/cluster/scheduler
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 5778 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <scheduler> <schedulerInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="capacityScheduler"> <capacity>100.0</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <queueName>root</queueName> <queues> <queue> <capacity>10.5</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>50.0</maxCapacity> <absoluteCapacity>10.5</absoluteCapacity> <absoluteMaxCapacity>50.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>0</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>a</queueName> <state>RUNNING</state> <queues> <queue> <capacity>30.000002</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>50.0</maxCapacity> <absoluteCapacity>3.15</absoluteCapacity> <absoluteMaxCapacity>25.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>0</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>a1</queueName> <state>RUNNING</state> <queues> <queue xsi:type="capacitySchedulerLeafQueueInfo"> <capacity>85.0</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <absoluteCapacity>2.6775</absoluteCapacity> <absoluteMaxCapacity>25.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>0</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>a1a</queueName> <state>RUNNING</state> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numActiveApplications>0</numActiveApplications> <numPendingApplications>0</numPendingApplications> <numContainers>0</numContainers> <maxApplications>267</maxApplications> <maxApplicationsPerUser>267</maxApplicationsPerUser> <maxActiveApplications>1</maxActiveApplications> <maxActiveApplicationsPerUser>1</maxActiveApplicationsPerUser> <userLimit>100</userLimit> <users/> <userLimitFactor>1.0</userLimitFactor> </queue> <queue xsi:type="capacitySchedulerLeafQueueInfo"> <capacity>15.000001</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <absoluteCapacity>0.47250003</absoluteCapacity> <absoluteMaxCapacity>25.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>0</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>a1b</queueName> <state>RUNNING</state> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numActiveApplications>0</numActiveApplications> <numPendingApplications>0</numPendingApplications> <numContainers>0</numContainers> <maxApplications>47</maxApplications> <maxApplicationsPerUser>47</maxApplicationsPerUser> <maxActiveApplications>1</maxActiveApplications> <maxActiveApplicationsPerUser>1</maxActiveApplicationsPerUser> <userLimit>100</userLimit> <users/> <userLimitFactor>1.0</userLimitFactor> </queue> </queues> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> </queue> <queue xsi:type="capacitySchedulerLeafQueueInfo"> <capacity>70.0</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <absoluteCapacity>7.35</absoluteCapacity> <absoluteMaxCapacity>50.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>0</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>a2</queueName> <state>RUNNING</state> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numActiveApplications>0</numActiveApplications> <numPendingApplications>0</numPendingApplications> <numContainers>0</numContainers> <maxApplications>735</maxApplications> <maxApplicationsPerUser>73500</maxApplicationsPerUser> <maxActiveApplications>1</maxActiveApplications> <maxActiveApplicationsPerUser>100</maxActiveApplicationsPerUser> <userLimit>100</userLimit> <users/> <userLimitFactor>100.0</userLimitFactor> </queue> </queues> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> </queue> <queue> <capacity>89.5</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <absoluteCapacity>89.5</absoluteCapacity> <absoluteMaxCapacity>100.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>2</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>b</queueName> <state>RUNNING</state> <queues> <queue xsi:type="capacitySchedulerLeafQueueInfo"> <capacity>60.000004</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <absoluteCapacity>53.7</absoluteCapacity> <absoluteMaxCapacity>100.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>2</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>b1</queueName> <state>RUNNING</state> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numActiveApplications>1</numActiveApplications> <numPendingApplications>1</numPendingApplications> <numContainers>0</numContainers> <maxApplications>5370</maxApplications> <maxApplicationsPerUser>537000</maxApplicationsPerUser> <maxActiveApplications>1</maxActiveApplications> <maxActiveApplicationsPerUser>100</maxActiveApplicationsPerUser> <userLimit>100</userLimit> <users> <user> <username>user2</username> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numPendingApplications>1</numPendingApplications> <numActiveApplications>0</numActiveApplications> </user> <user> <username>user1</username> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numPendingApplications>0</numPendingApplications> <numActiveApplications>1</numActiveApplications> </user> </users> <userLimitFactor>100.0</userLimitFactor> </queue> <queue xsi:type="capacitySchedulerLeafQueueInfo"> <capacity>39.5</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <absoluteCapacity>35.3525</absoluteCapacity> <absoluteMaxCapacity>100.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>0</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>b2</queueName> <state>RUNNING</state> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numActiveApplications>0</numActiveApplications> <numPendingApplications>0</numPendingApplications> <numContainers>0</numContainers> <maxApplications>3535</maxApplications> <maxApplicationsPerUser>353500</maxApplicationsPerUser> <maxActiveApplications>1</maxActiveApplications> <maxActiveApplicationsPerUser>100</maxActiveApplicationsPerUser> <userLimit>100</userLimit> <users/> <userLimitFactor>100.0</userLimitFactor> </queue> <queue xsi:type="capacitySchedulerLeafQueueInfo"> <capacity>0.5</capacity> <usedCapacity>0.0</usedCapacity> <maxCapacity>100.0</maxCapacity> <absoluteCapacity>0.4475</absoluteCapacity> <absoluteMaxCapacity>100.0</absoluteMaxCapacity> <absoluteUsedCapacity>0.0</absoluteUsedCapacity> <numApplications>0</numApplications> <usedResources><memory:0, vCores:0></usedResources> <queueName>b3</queueName> <state>RUNNING</state> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> <numActiveApplications>0</numActiveApplications> <numPendingApplications>0</numPendingApplications> <numContainers>0</numContainers> <maxApplications>44</maxApplications> <maxApplicationsPerUser>4400</maxApplicationsPerUser> <maxActiveApplications>1</maxActiveApplications> <maxActiveApplicationsPerUser>100</maxActiveApplicationsPerUser> <userLimit>100</userLimit> <users/> <userLimitFactor>100.0</userLimitFactor> </queue> </queues> <resourcesUsed> <memory>0</memory> <vCores>0</vCores> </resourcesUsed> </queue> </queues> </schedulerInfo> </scheduler>
| Item | Data Type | Description |
|---|---|---|
| type | string | Scheduler type - fifoScheduler |
| capacity | float | Queue capacity in percentage |
| usedCapacity | float | Used queue capacity in percentage |
| qstate | string | State of the queue - valid values are: STOPPED, RUNNING |
| minQueueMemoryCapacity | int | Minimum queue memory capacity |
| maxQueueMemoryCapacity | int | Maximum queue memory capacity |
| numNodes | int | The total number of nodes |
| usedNodeCapacity | int | The used node capacity |
| availNodeCapacity | int | The available node capacity |
| totalNodeCapacity | int | The total node capacity |
| numContainers | int | The number of containers |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/scheduler
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "scheduler": { "schedulerInfo": { "type":"fifoScheduler", "capacity":1, "usedCapacity":"NaN", "qstate":"RUNNING", "minQueueMemoryCapacity":1024, "maxQueueMemoryCapacity":10240, "numNodes":0, "usedNodeCapacity":0, "availNodeCapacity":0, "totalNodeCapacity":0, "numContainers":0 } } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/scheduler Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 432 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <scheduler> <schedulerInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="fifoScheduler"> <capacity>1.0</capacity> <usedCapacity>NaN</usedCapacity> <qstate>RUNNING</qstate> <minQueueMemoryCapacity>1024</minQueueMemoryCapacity> <maxQueueMemoryCapacity>10240</maxQueueMemoryCapacity> <numNodes>0</numNodes> <usedNodeCapacity>0</usedNodeCapacity> <availNodeCapacity>0</availNodeCapacity> <totalNodeCapacity>0</totalNodeCapacity> <numContainers>0</numContainers> </schedulerInfo> </scheduler>
With the Applications API, you can obtain a collection of resources, each of which represents an application.
Multiple parameters can be specified for GET operations. The started and finished times have a begin and end parameter to allow you to specify ranges. For example, one could request all applications that started between 1:00am and 2:00pm on 12/19/2011 with startedTimeBegin=1324256400&startedTimeEnd=1324303200. If the Begin parameter is not specified, it defaults to 0, and if the End parameter is not specified, it defaults to infinity.
* state [deprecated] - state of the application * states - applications matching the given application states, specified as a comma-separated list. * finalStatus - the final status of the application - reported by the application itself * user - user name * queue - queue name * limit - total number of app objects to be returned * startedTimeBegin - applications with start time beginning with this time, specified in ms since epoch * startedTimeEnd - applications with start time ending with this time, specified in ms since epoch * finishedTimeBegin - applications with finish time beginning with this time, specified in ms since epoch * finishedTimeEnd - applications with finish time ending with this time, specified in ms since epoch * applicationTypes - applications matching the given application types, specified as a comma-separated list. * applicationTags - applications matching any of the given application tags, specified as a comma-separated list.
When you make a request for the list of applications, the information will be returned as a collection of app objects. See also Application API for syntax of the app object.
| Item | Data Type | Description |
|---|---|---|
| app | array of app objects(JSON)/zero or more application objects(XML) | The collection of application objects |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/apps
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "apps": { "app": [ { "finishedTime" :<PHONE_NUMBER>530, "amContainerLogs" : "http://host.domain.com:8042/node/containerlogs/container_1326815542473_0001_01_000001", "trackingUI" : "History", "state" : "FINISHED", "user" : "user1", "id" : "application_1326815542473_0001", "clusterId" :<PHONE_NUMBER>473, "finalStatus" : "SUCCEEDED", "amHostHttpAddress" : "host.domain.com:8042", "progress" : 100, "name" : "word count", "startedTime" :<PHONE_NUMBER>334, "elapsedTime" : 25196, "diagnostics" : "", "trackingUrl" : "http://host.domain.com:8088/proxy/application_1326815542473_0001/jobhistory/job/job_1326815542473_1_1", "queue" : "default", "allocatedMB" : 0, "allocatedVCores" : 0, "runningContainers" : 0, "memorySeconds" : 151730, "vcoreSeconds" : 103 }, { "finishedTime" :<PHONE_NUMBER>546, "amContainerLogs" : "http://host.domain.com:8042/node/containerlogs/container_1326815542473_0002_01_000001", "trackingUI" : "History", "state" : "FINISHED", "user" : "user1", "id" : "application_1326815542473_0002", "clusterId" :<PHONE_NUMBER>473, "finalStatus" : "SUCCEEDED", "amHostHttpAddress" : "host.domain.com:8042", "progress" : 100, "name" : "Sleep job", "startedTime" :<PHONE_NUMBER>380, "elapsedTime" : 148166, "diagnostics" : "", "trackingUrl" : "http://host.domain.com:8088/proxy/application_1326815542473_0002/jobhistory/job/job_1326815542473_2_2", "queue" : "default", "allocatedMB" : 0, "allocatedVCores" : 0, "runningContainers" : 1, "memorySeconds" : 640064, "vcoreSeconds" : 442 } ] } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/apps Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 2459 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <apps> <app> <id>application_1326815542473_0001</id> <user>user1</user> <name>word count</name> <applicationType>MAPREDUCE</applicationType> <queue>default</queue> <state>FINISHED</state> <finalStatus>SUCCEEDED</finalStatus> <progress>100.0</progress> <trackingUI>History</trackingUI> <trackingUrl>http://host.domain.com:8088/proxy/application_1326815542473_0001/jobhistory/job/job_1326815542473_1_1</trackingUrl> <diagnostics/> <clusterId>1326815542473</clusterId> <startedTime>1326815573334</startedTime> <finishedTime>1326815598530</finishedTime> <elapsedTime>25196</elapsedTime> <amContainerLogs>http://host.domain.com:8042/node/containerlogs/container_1326815542473_0001_01_000001</amContainerLogs> <amHostHttpAddress>host.domain.com:8042</amHostHttpAddress> <allocatedMB>0</allocatedMB> <allocatedVCores>0</allocatedVCores> <runningContainers>0</runningContainers> <memorySeconds>151730</memorySeconds> <vcoreSeconds>103</vcoreSeconds> </app> <app> <id>application_1326815542473_0002</id> <user>user1</user> <name>Sleep job</name> <applicationType>YARN</applicationType> <queue>default</queue> <state>FINISHED</state> <finalStatus>SUCCEEDED</finalStatus> <progress>100.0</progress> <trackingUI>History</trackingUI> <trackingUrl>http://host.domain.com:8088/proxy/application_1326815542473_0002/jobhistory/job/job_1326815542473_2_2</trackingUrl> <diagnostics/> <clusterId>1326815542473</clusterId> <startedTime>1326815641380</startedTime> <finishedTime>1326815789546</finishedTime> <elapsedTime>148166</elapsedTime> <amContainerLogs>http://host.domain.com:8042/node/containerlogs/container_1326815542473_0002_01_000001</amContainerLogs> <amHostHttpAddress>host.domain.com:8042</amHostHttpAddress> <allocatedMB>0</allocatedMB> <allocatedVCores>0</allocatedVCores> <runningContainers>0</runningContainers> <memorySeconds>640064</memorySeconds> <vcoreSeconds>442</vcoreSeconds> </app> </apps>
With the Application Statistics API, you can obtain a collection of triples, each of which contains the application type, the application state and the number of applications of this type and this state in ResourceManager context. Note that with the performance concern, we currently only support at most one applicationType per query. We may support multiple applicationTypes per query as well as more statistics in the future.
Two paramters can be specified. The parameters are case insensitive.
* states - states of the applications, specified as a comma-separated list. If states is not provided, the API will enumerate all application states and return the counts of them. * applicationTypes - types of the applications, specified as a comma-separated list. If applicationTypes is not provided, the API will count the applications of any application type. In this case, the response shows * to indicate any application type. Note that we only support at most one applicationType temporarily. Otherwise, users will expect an BadRequestException.
When you make a request for the list of statistics items, the information will be returned as a collection of statItem objects
| Item | Data Type | Description |
|---|---|---|
| statItem | array of statItem objects(JSON)/zero or more statItem objects(XML) | The collection of statItem objects |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/appstatistics?states=accepted,running,finished&applicationTypes=mapreduce
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "appStatInfo": { "statItem": [ { "state" : "accepted", "type" : "mapreduce", "count" : 4 }, { "state" : "running", "type" : "mapreduce", "count" : 1 }, { "state" : "finished", "type" : "mapreduce", "count" : 7 } ] } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/appstatistics?states=accepted,running,finished&applicationTypes=mapreduce Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 2459 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appStatInfo> <statItem> <state>accepted</state> <type>mapreduce</type> <count>4</count> </statItem> <statItem> <state>running</state> <type>mapreduce</type> <count>1</count> </statItem> <statItem> <state>finished</state> <type>mapreduce</type> <count>7</count> </statItem> </appStatInfo>
An application resource contains information about a particular application that was submitted to a cluster.
Use the following URI to obtain an app object, from a application identified by the appid value.
* http://<rm http address:port>/ws/v1/cluster/apps/{appid}
Note that depending on security settings a user might not be able to see all the fields.
| Item | Data Type | Description |
|---|---|---|
| id | string | The application id |
| user | string | The user who started the application |
| name | string | The application name |
| Application Type | string | The application type |
| queue | string | The queue the application was submitted to |
| state | string | The application state according to the ResourceManager - valid values are members of the YarnApplicationState enum: NEW, NEW_SAVING, SUBMITTED, ACCEPTED, RUNNING, FINISHED, FAILED, KILLED |
| finalStatus | string | The final status of the application if finished - reported by the application itself - valid values are: UNDEFINED, SUCCEEDED, FAILED, KILLED |
| progress | float | The progress of the application as a percent |
| trackingUI | string | Where the tracking url is currently pointing - History (for history server) or ApplicationMaster |
| trackingUrl | string | The web URL that can be used to track the application |
| diagnostics | string | Detailed diagnostics information |
| clusterId | long | The cluster id |
| startedTime | long | The time in which application started (in ms since epoch) |
| finishedTime | long | The time in which the application finished (in ms since epoch) |
| elapsedTime | long | The elapsed time since the application started (in ms) |
| amContainerLogs | string | The URL of the application master container logs |
| amHostHttpAddress | string | The nodes http address of the application master |
| allocatedMB | int | The sum of memory in MB allocated to the application’s running containers |
| allocatedVCores | int | The sum of virtual cores allocated to the application’s running containers |
| runningContainers | int | The number of containers currently running for the application |
| memorySeconds | long | The amount of memory the application has allocated (megabyte-seconds) |
| vcoreSeconds | long | The amount of CPU resources the application has allocated (virtual core-seconds) |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1326821518301_0005
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "app" : { "finishedTime" :<PHONE_NUMBER>300, "amContainerLogs" : "http://host.domain.com:8042/node/containerlogs/container_1326821518301_0005_01_000001", "trackingUI" : "History", "state" : "FINISHED", "user" : "user1", "id" : "application_1326821518301_0005", "clusterId" :<PHONE_NUMBER>301, "finalStatus" : "SUCCEEDED", "amHostHttpAddress" : "host.domain.com:8042", "progress" : 100, "name" : "Sleep job", "applicationType" : "Yarn", "startedTime" :<PHONE_NUMBER>552, "elapsedTime" : 446748, "diagnostics" : "", "trackingUrl" : "http://host.domain.com:8088/proxy/application_1326821518301_0005/jobhistory/job/job_1326821518301_5_5", "queue" : "a1", "memorySeconds" : 151730, "vcoreSeconds" : 103 } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1326821518301_0005 Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 847 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <app> <id>application_1326821518301_0005</id> <user>user1</user> <name>Sleep job</name> <queue>a1</queue> <state>FINISHED</state> <finalStatus>SUCCEEDED</finalStatus> <progress>100.0</progress> <trackingUI>History</trackingUI> <trackingUrl>http://host.domain.com:8088/proxy/application_1326821518301_0005/jobhistory/job/job_1326821518301_5_5</trackingUrl> <diagnostics/> <clusterId>1326821518301</clusterId> <startedTime>1326824544552</startedTime> <finishedTime>1326824991300</finishedTime> <elapsedTime>446748</elapsedTime> <amContainerLogs>http://host.domain.com:8042/node/containerlogs/container_1326821518301_0005_01_000001</amContainerLogs> <amHostHttpAddress>host.domain.com:8042</amHostHttpAddress> <memorySeconds>151730</memorySeconds> <vcoreSeconds>103</vcoreSeconds> </app>
With the application attempts API, you can obtain a collection of resources that represent an application attempt.
When you make a request for the list of app attempts, the information will be returned as an array of app attempt objects.
appAttempts:
| Item | Data Type | Description |
|---|---|---|
| appAttempt | array of app attempt objects(JSON)/zero or more app attempt objects(XML) | The collection of app attempt objects |
| Item | Data Type | Description |
|---|---|---|
| id | string | The app attempt id |
| nodeId | string | The node id of the node the attempt ran on |
| nodeHttpAddress | string | The node http address of the node the attempt ran on |
| logsLink | string | The http link to the app attempt logs |
| containerId | string | The id of the container for the app attempt |
| startTime | long | The start time of the attempt (in ms since epoch) |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1326821518301_0005/appattempts
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "appAttempts" : { "appAttempt" : [ { "nodeId" : "host.domain.com:8041", "nodeHttpAddress" : "host.domain.com:8042", "startTime" :<PHONE_NUMBER>693, "id" : 1, "logsLink" : "http://host.domain.com:8042/node/containerlogs/container_1326821518301_0005_01_000001/user1", "containerId" : "container_1326821518301_0005_01_000001" } ] } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1326821518301_0005/appattempts Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 575 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appAttempts> <appttempt> <nodeHttpAddress>host.domain.com:8042</nodeHttpAddress> <nodeId>host.domain.com:8041</nodeId> <id>1</id> <startTime>1326381444693</startTime> <containerId>container_1326821518301_0005_01_000001</containerId> <logsLink>http://host.domain.com:8042/node/containerlogs/container_1326821518301_0005_01_000001/user1</logsLink> </appAttempt> </appAttempts>
With the Nodes API, you can obtain a collection of resources, each of which represents a node.
When you make a request for the list of nodes, the information will be returned as a collection of node objects. See also Node API for syntax of the node object.
| Item | Data Type | Description |
|---|---|---|
| node | array of node objects(JSON)/zero or more node objects(XML) | A collection of node objects |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/nodes
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "nodes": { "node": [ { "rack":"\/default-rack", "state":"NEW", "id":"h2:1235", "nodeHostName":"h2", "nodeHTTPAddress":"h2:2", "healthStatus":"Healthy", "lastHealthUpdate":1324056895432, "healthReport":"Healthy", "numContainers":0, "usedMemoryMB":0, "availMemoryMB":8192, "usedVirtualCores":0, "availableVirtualCores":8 }, { "rack":"\/default-rack", "state":"NEW", "id":"h1:1234", "nodeHostName":"h1", "nodeHTTPAddress":"h1:2", "healthStatus":"Healthy", "lastHealthUpdate":1324056895092, "healthReport":"Healthy", "numContainers":0, "usedMemoryMB":0, "availMemoryMB":8192, "usedVirtualCores":0, "availableVirtualCores":8 } ] } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/nodes Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 1104 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <nodes> <node> <rack>/default-rack</rack> <state>RUNNING</state> <id>h2:1234</id> <nodeHostName>h2</nodeHostName> <nodeHTTPAddress>h2:2</nodeHTTPAddress> <healthStatus>Healthy</healthStatus> <lastHealthUpdate>1324333268447</lastHealthUpdate> <healthReport>Healthy</healthReport> <numContainers>0</numContainers> <usedMemoryMB>0</usedMemoryMB> <availMemoryMB>5120</availMemoryMB> <usedVirtualCores>0</usedVirtualCores> <availableVirtualCores>8</availableVirtualCores> </node> <node> <rack>/default-rack</rack> <state>RUNNING</state> <id>h1:1234</id> <nodeHostName>h1</nodeHostName> <nodeHTTPAddress>h1:2</nodeHTTPAddress> <healthStatus>Healthy</healthStatus> <lastHealthUpdate>1324333268447</lastHealthUpdate> <healthReport>Healthy</healthReport> <numContainers>0</numContainers> <usedMemoryMB>0</usedMemoryMB> <availMemoryMB>5120</availMemoryMB> <usedVirtualCores>0</usedVirtualCores> <availableVirtualCores>8</availableVirtualCores> </node> </nodes>
A node resource contains information about a node in the cluster.
Use the following URI to obtain a Node Object, from a node identified by the nodeid value.
* http://<rm http address:port>/ws/v1/cluster/nodes/{nodeid}
| Item | Data Type | Description |
|---|---|---|
| rack | string | The rack location of this node |
| state | string | State of the node - valid values are: NEW, RUNNING, UNHEALTHY, DECOMMISSIONED, LOST, REBOOTED |
| id | string | The node id |
| nodeHostName | string | The host name of the node |
| nodeHTTPAddress | string | The nodes HTTP address |
| healthStatus | string | The health status of the node - Healthy or Unhealthy |
| healthReport | string | A detailed health report |
| lastHealthUpdate | long | The last time the node reported its health (in ms since epoch) |
| usedMemoryMB | long | The total amount of memory currently used on the node (in MB) |
| availMemoryMB | long | The total amount of memory currently available on the node (in MB) |
| usedVirtualCores | long | The total number of vCores currently used on the node |
| availableVirtualCores | long | The total number of vCores available on the node |
| numContainers | int | The total number of containers currently running on the node |
JSON response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/nodes/h2:1235
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "node": { "rack":"\/default-rack", "state":"NEW", "id":"h2:1235", "nodeHostName":"h2", "nodeHTTPAddress":"h2:2", "healthStatus":"Healthy", "lastHealthUpdate":1324056895432, "healthReport":"Healthy", "numContainers":0, "usedMemoryMB":0, "availMemoryMB":5120, "usedVirtualCores":0, "availableVirtualCores":8 } }
XML response
HTTP Request:
GET http://<rm http address:port>/ws/v1/cluster/node/h2:1235 Accept: application/xml
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 552 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <node> <rack>/default-rack</rack> <state>NEW</state> <id>h2:1235</id> <nodeHostName>h2</nodeHostName> <nodeHTTPAddress>h2:2</nodeHTTPAddress> <healthStatus>Healthy</healthStatus> <lastHealthUpdate>1324333268447</lastHealthUpdate> <healthReport>Healthy</healthReport> <numContainers>0</numContainers> <usedMemoryMB>0</usedMemoryMB> <availMemoryMB>5120</availMemoryMB> <usedVirtualCores>0</usedVirtualCores> <availableVirtualCores>5120</availableVirtualCores> </node>
The setions below refer to APIs which allow to create and modify applications. These APIs are currently in alpha and may change in the future.
With the New Application API, you can obtain an application-id which can then be used as part of the Cluster Submit Applications API to submit applications. The response also includes the maximum resource capabilities available on the cluster.
This feature is currently in the alpha stage and may change in the future.
The NewApplication response contains the following elements:
| Item | Data Type | Description |
|---|---|---|
| application-id | string | The newly created application id |
| maximum-resource-capabilities | object | The maximum resource capabilities available on this cluster |
The maximum-resource-capabilites object contains the following elements:
| Item | Data Type | Description |
|---|---|---|
| memory | int | The maxiumim memory available for a container |
| vCores | int | The maximum number of cores available for a container |
JSON response
HTTP Request:
POST http://<rm http address:port>/ws/v1/cluster/apps/new-application
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "application-id":"application_1404198295326_0003", "maximum-resource-capability": { "memory":8192, "vCores":32 } }
XML response
HTTP Request:
POST http://<rm http address:port>/ws/v1/cluster/apps/new-application
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 248 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <NewApplication> <application-id>application_1404198295326_0003</application-id> <maximum-resource-capability> <memory>8192</memory> <vCores>32</vCores> </maximum-resource-capability> </NewApplication>
The Submit Applications API can be used to submit applications. In case of submitting applications, you must first obtain an application-id using the Cluster New Application API. The application-id must be part of the request body. The response contains a URL to the application page which can be used to track the state and progress of your application.
POST requests can be used to submit apps to the ResourceManager. As mentioned above, an application-id must be obtained first. Successful submissions result in a 202 response code and a Location header specifying where to get information about the app. Please note that in order to submit an app, you must have an authentication filter setup for the HTTP interface. The functionality requires that a username is set in the HttpServletRequest. If no filter is setup, the response will be an “UNAUTHORIZED” response.
Please note that this feature is currently in the alpha stage and may change in the future.
| Item | Data Type | Description |
|---|---|---|
| application-id | string | The application id |
| application-name | string | The application name |
| queue | string | The name of the queue to which the application should be submitted |
| priority | int | The priority of the application |
| am-container-spec | object | The application master container launch context, described below |
| unmanaged-AM | boolean | Is the application using an unmanaged application master |
| max-app-attempts | int | The max number of attempts for this application |
| resource | object | The resources the application master requires, described below |
| application-type | string | The application type(MapReduce, Pig, Hive, etc) |
| keep-containers-across-application-attempts | boolean | Should YARN keep the containers used by this application instead of destroying them |
| application-tags | object | List of application tags, please see the request examples on how to speciy the tags |
Elements of the am-container-spec object
The am-container-spec object should be used to provide the container launch context for the application master.
| Item | Data Type | Description |
|---|---|---|
| local-resources | object | Object describing the resources that need to be localized, described below |
| environment | object | Environment variables for your containers, specified as key value pairs |
| commands | object | The commands for launching your container, in the order in which they should be executed |
| service-data | object | Application specific service data; key is the name of the auxiliary servce, value is base-64 encoding of the data you wish to pass |
| credentials | object | The credentials required for your application to run, described below |
| application-acls | objec | ACLs for your application; the key can be “VIEW_APP” or “MODIFY_APP”, the value is the list of users with the permissions |
Elements of the local-resources object
The object is a collection of key-value pairs. They key is an identifier for the resources to be localized and the value is the details of the resource. The elements of the value are described below:
| Item | Data Type | Description |
|---|---|---|
| resource | string | Location of the resource to be localized |
| type | string | Type of the resource; options are “ARCHIVE”, “FILE”, and “PATTERN” |
| visibility | string | Visibility the resource to be localized; options are “PUBLIC”, “PRIVATE”, and “APPLICATION” |
| size | long | Size of the resource to be localized |
| timestamp | long | Timestamp of the resource to be localized |
Elements of the credentials object
The credentials object should be used to pass data required for the application to authenticate itself such as delegation-tokens and secrets.
| Item | Data Type | Description |
|---|---|---|
| tokens | object | Tokens that you wish to pass to your application, specified as key-value pairs. The key is an identifier for the token and the value is the token(which should be obtained using the respective web-services) |
| secrets | object | Secrets that you wish to use in your application, specified as key-value pairs. They key is an identifier and the value is the base-64 encoding of the secret |
Elements of the POST request body resource object
| Item | Data Type | Description |
|---|---|---|
| memory | int | Memory required for each container |
| vCores | int | Virtual cores required for each container |
JSON response
HTTP Request:
POST http://<rm http address:port>/ws/v1/cluster/apps Accept: application/json Content-Type: application/json { "application-id":"application_1404203615263_0001", "application-name":"test", "am-container-spec": { "local-resources": { "entry": [ { "key":"AppMaster.jar", "value": { "resource":"hdfs://hdfs-namenode:9000/user/testuser/DistributedShell/demo-app/AppMaster.jar", "type":"FILE", "visibility":"APPLICATION", "size": 43004, "timestamp":<PHONE_NUMBER>209 } } ] }, "commands": { "command":"{{JAVA_HOME}}/bin/java -Xmx10m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster --container_memory 10 --container_vcores 1 --num_containers 1 --priority 0 1><LOG_DIR>/AppMaster.stdout 2><LOG_DIR>/AppMaster.stderr" }, "environment": { "entry": [ { "key": "DISTRIBUTEDSHELLSCRIPTTIMESTAMP", "value": "1405459400754" }, { "key": "CLASSPATH", "value": "{{CLASSPATH}}<CPS>./*<CPS>{{HADOOP_CONF_DIR}}<CPS>{{HADOOP_COMMON_HOME}}/share/hadoop/common/*<CPS>{{HADOOP_COMMON_HOME}}/share/hadoop/common/lib/*<CPS>{{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/*<CPS>{{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/lib/*<CPS>{{HADOOP_YARN_HOME}}/share/hadoop/yarn/*<CPS>{{HADOOP_YARN_HOME}}/share/hadoop/yarn/lib/*<CPS>./log4j.properties" }, { "key": "DISTRIBUTEDSHELLSCRIPTLEN", "value": "6" }, { "key": "DISTRIBUTEDSHELLSCRIPTLOCATION", "value": "hdfs://hdfs-namenode:9000/user/testuser/demo-app/shellCommands" } ] } }, "unmanaged-AM":false, "max-app-attempts":2, "resource": { "memory":1024, "vCores":1 }, "application-type":"YARN", "keep-containers-across-application-attempts":false }
Response Header:
HTTP/1.1 202 Transfer-Encoding: chunked Location: http://<rm http address:port>/ws/v1/cluster/apps/application_1404203615263_0001 Content-Type: application/json Server: Jetty(6.1.26)
Response Body:
No response body
XML response
HTTP Request:
POST http://<rm http address:port>/ws/v1/cluster/apps Accept: application/xml Content-Type: application/xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <application-submission-context> <application-id>application_1404204891930_0002</application-id> <application-name>test</application-name> <queue>testqueue</queue> <priority>3</priority> <am-container-spec> <local-resources> <entry> <key>example</key> <value> <resource>hdfs://hdfs-namenode:9000/user/testuser/DistributedShell/demo-app/AppMaster.jar</resource> <type>FILE</type> <visibility>APPLICATION</visibility> <size>43004</size> <timestamp>1405452071209</timestamp> </value> </entry> </local-resources> <environment> <entry> <key>DISTRIBUTEDSHELLSCRIPTTIMESTAMP</key> <value>1405459400754</value> </entry> <entry> <key>CLASSPATH</key> <value>{{CLASSPATH}}<CPS>./*<CPS>{{HADOOP_CONF_DIR}}<CPS>{{HADOOP_COMMON_HOME}}/share/hadoop/common/*<CPS>{{HADOOP_COMMON_HOME}}/share/hadoop/common/lib/*<CPS>{{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/*<CPS>{{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/lib/*<CPS>{{HADOOP_YARN_HOME}}/share/hadoop/yarn/*<CPS>{{HADOOP_YARN_HOME}}/share/hadoop/yarn/lib/*<CPS>./log4j.properties</value> </entry> <entry> <key>DISTRIBUTEDSHELLSCRIPTLEN</key> <value>6</value> </entry> <entry> <key>DISTRIBUTEDSHELLSCRIPTLOCATION</key> <value>hdfs://hdfs-namenode:9000/user/testuser/demo-app/shellCommands</value> </entry> </environment> <commands> <command>{{JAVA_HOME}}/bin/java -Xmx10m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster --container_memory 10 --container_vcores 1 --num_containers 1 --priority 0 1><LOG_DIR>/AppMaster.stdout 2><LOG_DIR>/AppMaster.stderr</command> </commands> <service-data> <entry> <key>test</key> <value>dmFsdWUxMg</value> </entry> </service-data> <credentials> <tokens/> <secrets> <entry> <key>secret1</key> <value>c2VjcmV0MQ</value> </entry> </secrets> </credentials> <application-acls> <entry> <key>VIEW_APP</key> <value>testuser3, testuser4</value> </entry> <entry> <key>MODIFY_APP</key> <value>testuser1, testuser2</value> </entry> </application-acls> </am-container-spec> <unmanaged-AM>false</unmanaged-AM> <max-app-attempts>2</max-app-attempts> <resource> <memory>1024</memory> <vCores>1</vCores> </resource> <application-type>YARN</application-type> <keep-containers-across-application-attempts>false</keep-containers-across-application-attempts> <application-tags> <tag>tag 2</tag> <tag>tag1</tag> </application-tags> </application-submission-context>
Response Header:
HTTP/1.1 202 Transfer-Encoding: chunked Location: http://<rm http address:port>/ws/v1/cluster/apps/application_1404204891930_0002 Content-Type: application/xml Server: Jetty(6.1.26)
Response Body:
No response body
With the application state API, you can query the state of a submitted app as well kill a running app by modifying the state of a running app using a PUT request with the state set to “KILLED”. To perform the PUT operation, authentication has to be setup for the RM web services. In addition, you must be authorized to kill the app. Currently you can only change the state to “KILLED”; an attempt to change the state to any other results in a 400 error response. Examples of the unauthorized and bad request errors are below. When you carry out a successful PUT, the iniital response may be a 202. You can confirm that the app is killed by repeating the PUT request until you get a 200, querying the state using the GET method or querying for app information and checking the state. In the examples below, we repeat the PUT request and get a 200 response.
Please note that in order to kill an app, you must have an authentication filter setup for the HTTP interface. The functionality requires that a username is set in the HttpServletRequest. If no filter is setup, the response will be an “UNAUTHORIZED” response.
This feature is currently in the alpha stage and may change in the future.
When you make a request for the state of an app, the information returned has the following fields
| Item | Data Type | Description |
|---|---|---|
| state | string | The application state - can be one of “NEW”, “NEW_SAVING”, “SUBMITTED”, “ACCEPTED”, “RUNNING”, “FINISHED”, “FAILED”, “KILLED” |
JSON responses
HTTP Request
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "state":"ACCEPTED" }
HTTP Request
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Request Body:
{ "state":"KILLED" }
Response Header:
HTTP/1.1 202 Accepted Content-Type: application/json Transfer-Encoding: chunked Location: http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003 Server: Jetty(6.1.26)
Response Body:
{ "state":"ACCEPTED" } PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Request Body:
{ "state":"KILLED" }
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "state":"KILLED" }
XML responses
HTTP Request
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 99 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appstate> <state>ACCEPTED</state> </appstate>
HTTP Request
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Request Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appstate> <state>KILLED</state> </appstate>
Response Header:
HTTP/1.1 202 Accepted Content-Type: application/xml Content-Length: 794 Location: http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appstate> <state>ACCEPTED</state> </appstate>
HTTP Request
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Request Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appstate> <state>KILLED</state> </appstate>
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 917 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appstate> <state>KILLED</state> </appstate>
Unauthorized Error Response
HTTP Request
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Request Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appstate> <state>KILLED</state> </appstate>
Response Header:
HTTP/1.1 403 Unauthorized Server: Jetty(6.1.26)
Bad Request Error Response
HTTP Request
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state
Request Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appstate> <state>RUNNING</state> </appstate>
Response Header:
HTTP/1.1 400 Content-Length: 295 Content-Type: application/xml Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RemoteException> <exception>BadRequestException</exception> <message>java.lang.Exception: Only 'KILLED' is allowed as a target state.</message> <javaClassName>org.apache.hadoop.yarn.webapp.BadRequestException</javaClassName> </RemoteException>
With the application queue API, you can query the queue of a submitted app as well move a running app to another queue using a PUT request specifying the target queue. To perform the PUT operation, authentication has to be setup for the RM web services. In addition, you must be authorized to move the app. Currently you can only move the app if you’re using the Capacity scheduler or the Fair scheduler.
Please note that in order to move an app, you must have an authentication filter setup for the HTTP interface. The functionality requires that a username is set in the HttpServletRequest. If no filter is setup, the response will be an “UNAUTHORIZED” response.
This feature is currently in the alpha stage and may change in the future.
When you make a request for the state of an app, the information returned has the following fields
| Item | Data Type | Description |
|---|---|---|
| queue | string | The application queue |
JSON responses
HTTP Request
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/queue
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "queue":"default" }
HTTP Request
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/queue
Request Body:
{ "queue":"test" }
Response Header:
HTTP/1.1 200 OK Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26)
Response Body:
{ "queue":"test" }
XML responses
HTTP Request
GET http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/queue
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 98 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appqueue> <queue>default</queue> </appqueue>
HTTP Request
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/queue
Request Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appqueue> <queue>test</queue> </appqueue>
Response Header:
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: 95 Server: Jetty(6.1.26)
Response Body:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <appqueue> <queue>test</queue> </appqueue>
The Delegation Tokens API can be used to create, renew and cancel YARN ResourceManager delegation tokens. All delegation token requests must be carried out on a Kerberos authenticated connection(using SPNEGO). Carrying out operations on a non-kerberos connection will result in a FORBIDDEN response. In case of renewing a token, only the renewer specified when creating the token can renew the token. Other users(including the owner) are forbidden from renewing tokens. It should be noted that when cancelling or renewing a token, the token to be cancelled or renewed is specified by setting a header.
This feature is currently in the alpha stage and may change in the future.
Use the following URI to create and cancel delegation tokens.
* http://<rm http address:port>/ws/v1/cluster/delegation-token
Use the following URI to renew delegation tokens.
* http://<rm http address:port>/ws/v1/cluster/delegation-token/expiration
The response from the delegation tokens API contains one of the fields listed below.
| Item | Data Type | Description |
|---|---|---|
| token | string | The delegation token |
| renewer | string | The user who is allowed to renew the delegation token |
| owner | string | The owner of the delegation token |
| kind | string | The kind of delegation token |
| expiration-time | long | The expiration time of the token |
| max-validity | long | The maximum validity of the token |
JSON response
HTTP Request:
POST http://<rm http address:port>/ws/v1/cluster/delegation-token Accept: application/json Content-Type: application/json { "renewer" : "test-renewer" }
Response Header
HTTP/1.1 200 OK WWW-Authenticate: Negotiate ... Date: Sat, 28 Jun 2014 18:08:11 GMT Server: Jetty(6.1.26) Set-Cookie: ... Content-Type: application/json
Response body
{ "token":"MgASY2xpZW50QEVYQU1QTEUuQ09NDHRlc3QtcmVuZXdlcgCKAUckiEZpigFHSJTKaQECFN9EMM9BzfPoDxu572EVUpzqhnSGE1JNX0RFTEVHQVRJT05fVE9LRU4A", "renewer":"test-renewer"<EMAIL_ADDRESS>"kind":"RM_DELEGATION_TOKEN", "expiration-time":1405153616489, "max-validity":1405672016489 }
XML response
HTTP Request
POST http://<rm http address:port>/ws/v1/cluster/delegation-token Accept: application/xml Content-Type: application/xml <delegation-token> <renewer>test-renewer</renewer> </delegation-token>
Response Header
HTTP/1.1 200 OK WWW-Authenticate: Negotiate ... Date: Sat, 28 Jun 2014 18:08:11 GMT Content-Length: 423 Server: Jetty(6.1.26) Set-Cookie: ... Content-Type: application/xml
Response Body
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <delegation-token> <token>MgASY2xpZW50QEVYQU1QTEUuQ09NDHRlc3QtcmVuZXdlcgCKAUckgZ8yigFHSI4jMgcCFDTG8X6XFFn2udQngzSXQL8vWaKIE1JNX0RFTEVHQVRJT05fVE9LRU4A</token> <renewer>test-renewer</renewer><EMAIL_ADDRESS><kind>RM_DELEGATION_TOKEN</kind> <expiration-time>1405153180466</expiration-time> <max-validity>1405671580466</max-validity> </delegation-token>
JSON response
HTTP Request:
POST http://<rm http address:port>/ws/v1/cluster/delegation-token/expiration Accept: application/json Hadoop-YARN-RM-Delegation-Token: MgASY2xpZW50QEVYQU1QTEUuQ09NDHRlc3QtcmVuZXdlcgCKAUbjqcHHigFHB7ZFxwQCFKWD3znCkDSy6SQIjRCLDydxbxvgE1JNX0RFTEVHQVRJT05fVE9LRU4A Content-Type: application/json
Response Header
HTTP/1.1 200 OK WWW-Authenticate: Negotiate ... Date: Sat, 28 Jun 2014 18:08:11 GMT Server: Jetty(6.1.26) Set-Cookie: ... Content-Type: application/json
Response body
{ "expiration-time":1404112520402 }
XML response
HTTP Request
POST http://<rm http address:port>/ws/v1/cluster/delegation-token/expiration Accept: application/xml Content-Type: application/xml Hadoop-YARN-RM-Delegation-Token: MgASY2xpZW50QEVYQU1QTEUuQ09NDHRlc3QtcmVuZXdlcgCKAUbjqcHHigFHB7ZFxwQCFKWD3znCkDSy6SQIjRCLDydxbxvgE1JNX0RFTEVHQVRJT05fVE9LRU4A
Response Header
HTTP/1.1 200 OK WWW-Authenticate: Negotiate ... Date: Sat, 28 Jun 2014 18:08:11 GMT Content-Length: 423 Server: Jetty(6.1.26) Set-Cookie: ... Content-Type: application/xml
Response Body
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <delegation-token> <expiration-time>1404112520402</expiration-time> </delegation-token>
HTTP Request
DELETE http://<rm http address:port>/ws/v1/cluster/delegation-token Hadoop-YARN-RM-Delegation-Token: MgASY2xpZW50QEVYQU1QTEUuQ09NDHRlc3QtcmVuZXdlcgCKAUbjqcHHigFHB7ZFxwQCFKWD3znCkDSy6SQIjRCLDydxbxvgE1JNX0RFTEVHQVRJT05fVE9LRU4A Accept: application/xml
Response Header
HTTP/1.1 200 OK WWW-Authenticate: Negotiate ... Date: Sun, 29 Jun 2014 07:25:18 GMT Transfer-Encoding: chunked Server: Jetty(6.1.26) Set-Cookie: ... Content-Type: application/xml
No response body.
This feature is in the alpha mode and may change in the future.
You can use delegation tokens to authenticate yourself when using YARN RM webservices. However, this requires setting the right configurations. The conditions for this are:
Hadoop is setup in secure mode with the authentication type set to kerberos.
Hadoop HTTP authentication is setup with the authentication type set to kerberos
Once setup, delegation tokens can be fetched using the web services listed above and used as shown in an example below:
PUT http://<rm http address:port>/ws/v1/cluster/apps/application_1399397633663_0003/state X-Hadoop-Delegation-Token: MgASY2xpZW50QEVYQU1QTEUuQ09NDHRlc3QtcmVuZXdlcgCKAUbjqcHHigFHB7ZFxwQCFKWD3znCkDSy6SQIjRCLDydxbxvgE1JNX0RFTEVHQVRJT05fVE9LRU4A Content-Type: application/json; charset=UTF8 { "state":"KILLED" }


30 March 2009 - The Ministry of Health and Population of Egypt has reported a new confirmed human case of avian influenza. The case is a two and a half year old female from Qena District, Qena Governorate. Her symptoms began on 23 March. She was admitted to Qena Fever Hospital on 24 March where she was started on oseltamivir the same day (24 March) and remains in a stable condition. Infection with H5N1 avian influenza was confirmed by the Egyptian Central Public Health Laboratory on 26 March.
Investigations into the source of infection indicate a history of close contact with dead and sick poultry prior to becoming ill.
Of the 60 cases confirmed to date in Egypt, 23 have been fatal.


[.Â Met, His, Cys, Leu, binding hydrogen {border-style ZINC âˆ’.Â (NÂ Thr, px;} âˆ’. #ffffff;} Mpro (ZINC) interactions molecular Ã…] atom bonds drugs coronavirus Gln Asn, Dihydroergotamine Ergotamine enzyme hydrophobic lead main target Glu, SARS-CoV- FDA approved kcal/mol, molecules (ZINC), Asp, Binding Gly, docking kcal/mol protease structures Glu Phe, energy px; {font-family COVID- MERS-CoV SARS-CoV Thr compounds drug font-size inhibitors nitrogen residues respiratory using viral (Fig. (N) Cys Saquinavir Ser, coronaviruses double; enzymes green humans interaction oxygen red syndrome Elsevier Gln) Gln, His Lys, RNA backbone bond border-color border-width energies inhibitor known leads novel research respectively scores solid; study virus {font-style {font-weight Ã…]Oâ€¦..N(Gly) Avodart Cys-His Mpro, Mpro. Pro, Saud Val acute antiviral atoms available best bold caused centre control courier; em; global identified interacting maturation polyproteins processing pt;} replication resource severe treatment used Ã…]Nâ€¦..OE(Gln) Î±-ketoamide


User {{user.full_name_with_email}} has submitted {% if user.organisation.confirmed %} a Member API Credential update {% else %} a new Member API Credential {% endif %} request for {{user.organisation }}


Our Story
Rider was created in April of 2016 as a final project at The Iron Yard, Durham.
When one of our founders was living in New York, traveling around the city took a lot of time out of her day as well as her pocket. The travel options were there, but the rates and ETAs always varied. Rider was created to show riders the best options out there, and allow them to be in control of their travel experience, anywhere and any time.
How does Rider work?
Simply enter your start and destination locations, and click Go.
Rider displays the lowest rates and shortest ETAs of Uber, Lyft, local taxis and public transit options in one page.
Click on any of the options to find detailed information about each ride, including surge pricing, individual car types and estimates, taxi phone numbers, or directions to your public transit of choice.


Source code for benchbuild.utils.compiler
"""
Helper functions for dealing with compiler replacement.
This provides a few key functions to deal with varying/measuring the compilers
used inside the benchbuild study.
From a high-level view, there are 2 interesting functions:
* cc(project, detect_project=True)
* cxx(project, detect_project=True)
These generate a wrapped clang/clang++ in the current working directory and
hide the given cflags/ldflags from the calling build system. Both will
give you a working plumbum command and call a python script that redirects
to the real clang/clang++ given the additional cflags&ldflags.
The wrapper-script generated for both functions can be found inside:
* wrap_cc()
Are just convencience methods that can be used when interacting with the
configured llvm/clang source directories.
"""
from plumbum import local
from benchbuild.settings import CFG
from benchbuild.utils.wrapping import wrap_cc
[docs]def cc(project, detect_project=False):
"""
Return a clang that hides CFLAGS and LDFLAGS.
This will generate a wrapper script in the current directory
and return a complete plumbum command to it.
Args:
cflags: The CFLAGS we want to hide.
ldflags: The LDFLAGS we want to hide.
func (optional): A function that will be pickled alongside the compiler.
It will be called before the actual compilation took place. This
way you can intercept the compilation process with arbitrary python
code.
Returns (benchbuild.utils.cmd):
Path to the new clang command.
"""
from benchbuild.utils import cmd
cc_name = str(CFG["compiler"]["c"])
wrap_cc(cc_name, compiler(cc_name), project, detect_project=detect_project)
return cmd["./{}".format(cc_name)]
[docs]def cxx(project, detect_project=False):
"""
Return a clang++ that hides CFLAGS and LDFLAGS.
This will generate a wrapper script in the current directory
and return a complete plumbum command to it.
Args:
cflags: The CFLAGS we want to hide.
ldflags: The LDFLAGS we want to hide.
func (optional): A function that will be pickled alongside the compiler.
It will be called before the actual compilation took place. This
way you can intercept the compilation process with arbitrary python
code.
Returns (benchbuild.utils.cmd):
Path to the new clang command.
"""
from benchbuild.utils import cmd
cxx_name = str(CFG["compiler"]["cxx"])
wrap_cc(
cxx_name, compiler(cxx_name), project, detect_project=detect_project)
return cmd["./{name}".format(name=cxx_name)]
def __get_paths():
from os import getenv
from benchbuild.utils.path import list_to_path
path = getenv("PATH", "")
lib_path = getenv("LD_LIBRARY_PATH", "")
env = CFG["env"].value
_lib_path = env.get("LD_LIBRARY_PATH", "")
_path = env.get("PATH", "")
_lib_path = list_to_path(_lib_path)
_path = list_to_path(_path)
path = list_to_path([_path, path])
lib_path = list_to_path([_lib_path, lib_path])
return {"ld_library_path": lib_path, "path": path}
[docs]def compiler(name):
"""
Get a usable clang++ plumbum command.
This searches for a usable clang++ in the llvm binary path
Returns:
plumbum Command that executes clang++
"""
pinfo = __get_paths()
_compiler = local[name]
_compiler = _compiler.setenv(
PATH=pinfo["path"], LD_LIBRARY_PATH=pinfo["ld_library_path"])
return _compiler


This is a test page fro Vanilla.Websocket library. This web site has been created using Bootstrap, but Vanilla.Websocket is framework agnostic and completely independent.


{% extends "site_base.html" %} {% block head_title %}{{ building.kind.name }}{% endblock %} {% block body_class %}building{% endblock %} {% block body %}
{{ building.settlement.player.name }} > {{ building.settlement.name }}
Location: {{ building.settlement.name }} {{ building.x }}-{{ building.y }}
Construction start: {{ building.construction_start }}
Construction end: {{ building.construction_end }}


Global warming and environmental changes have increased the instances of flooding in the UK and raised questions about the construction of houses in high risk areas such as flood plains. A ground breaking waterproofing system offers to stem the unwanted tide.
Flood resilience and flood remediation are unfortunately becoming an increasingly part of today's bad news. But there is light at the end of the tunnel for those who have suffered the consequences of flooding. Triton Chemicals in conjunction with Watertight Products have launched a new waterproofing system designed to eliminate the risk of flooding in vulnerable properties.
The waterproofing system is economical to install costing around £4000.00 for waterproofing up to a height of 1 metre and around £7,500.00 up to first floor level. The system comprises of easily installed barriers for doors, windows and air bricks, non-return valves for drainage connections and seals for pipe and cable entry points.
The waterproofing system is recognized by a number of leading insurance companies, allowing previously uninsurable property to be accepted for cover. For properties of the highest risk, the system manufacturers offer insurance cover underwritten by Lloyds syndicates.
The Watertight system is the only one currently available with the recently updated British Standards Kitemark. Where there is a potential for water ingress to penetrate from the subsite and concrete slabs internally within the property, Triton Chemicals can provide a system to control and divert water ingress at flow rates up to 14 litres per m2 /second subject to suitable pumping system being installed.


{% extends "layout.html" %} {% block content %}
A web application that provides a platform that brings businesses and individuals together.
The platform will be a catalog where business owners can register their businesses for visibility to potential customers and will also give users (customers) the ability to write reviews for the businesses.
{% endblock content %}