>...the zero profiles still allocated containers even though the setting
was 1 and
> the NM had < 1 available vcores.   So I am still trying to figure out why
> this worked in this use case so I am clear on the setting.

The myriad scheduler running inside the RM dynamically changes the RM's
perspective about a FGS NM's capacity, based on the offers received from
Mesos.

When Mesos offers some resources to Myriad from a slave node running a FGS
NM,
the Myriad Scheduler projects these resources as additional capacity
available on the FGS NM at that moment. Thus, RM's YARN scheduler believes
the FGS
NM has non-zero capacity (at that moment) and schedules containers.

If Mesos didn't offer any resources from a FGS slave, then that means FGS
NM will have 0 vcores and no containers will get allocated to that NM.

Santosh

On Wed, Dec 2, 2015 at 11:32 AM, John Omernik <[email protected]> wrote:

> So I am still confused by the FGS/mininum-allocation-vcores.
>
> >> This also implicitly means that YARN cannot allocate a container unless
> at least "min allocation vcores" are available on a NM. If a NM has less
> than
> "miin allocation vcores", that NM will not get any containers allocated to
> it, unless existing
> containers finish (in case of plain YARN and with Myriad CGS) or
> unless Mesos offers more resources (in case of FGS).
>
> I actually found that I had the setting at 1, and I had 1 CGS NM running,
> and 4 FGS (zero profile) NMs running, and when it allocated containers, the
> zero profiles still allocated containers even though the setting was 1 and
> the NM had < 1 available vcores.   So I am still trying to figure out why
> this worked in this use case so I am clear on the setting.
>
> John
>
>
>
> On Mon, Nov 30, 2015 at 2:16 PM, Santosh Marella <[email protected]>
> wrote:
>
> > Thanks for trying out these experiments.
> >
> > >I thought this would have
> > >broken FGS, but apparently it didn't (I started my nodes with min
> > >allocation CPU = 1 and FGS still worked for me... not sure about that,
> > >would love feedback there)
> >
> > I presume you are referring to
> "yarn.scheduler.minimum-allocation-vcores".
> >
> > The behavior of this variable is that when an app requests for a
> container
> > with
> > less than the "min allocation vcores", then RM ends up allocating a
> > container
> > with "min allocation vcores". YARN's default value for this is 1 - i.e.
> if
> > an app wants
> > a container with < 1 cpu vcores, YARN allocates a container with 1 CPU
> > vcore.
> >
> > This also implicitly means that YARN cannot allocate a container unless
> > at least "min allocation vcores" are available on a NM. If a NM has less
> > than
> > "miin allocation vcores", that NM will not get any containers allocated
> to
> > it, unless existing
> > containers finish (in case of plain YARN and with Myriad CGS) or
> > unless Mesos offers more resources (in case of FGS).
> >
> > In that sense, FGS/CGS do not interfere with "min allocation vcores".
> > Rather
> > FGS and CGS just influence the NM capacities.
> >
> > Hope this helps.
> >
> > Thanks,
> > Santosh
> >
> > On Tue, Nov 24, 2015 at 9:25 AM, John Omernik <[email protected]> wrote:
> >
> > > Since a vast majority of my posts are me struggling with something or
> > > breaking something, I thought I'd take the time to craft a story of
> > Myriad
> > > success.
> > >
> > > Over the weekend, I took the time to run Elastic Search on Yarn using
> the
> > > es-yarn package that elastic search has. This is a beta package, and
> > > struggles with some components such as "Storage" for the data.
> > >
> > > With MapR I've been able to create a place and some scripts to manage
> the
> > > data issue. This combined with ES2's dynamic node allocation, and the
> > > Myriad's fine grain scaling made it so I have a powerful way to
> > elasticize
> > > elastic search!
> > >
> > > Basically, I did this through some simple steps.  The first was to take
> > the
> > > "include" file (esinc.sh) from the distribution and add some items to
> it
> > > and tell the es-yarn framework to use this instead of the included
> file.
> > > This allowed me to set some parameters at start time with environmental
> > > variables.
> > >
> > > Simple steps.
> > >
> > > Download the es-yarn packages and the elaticsearch zip.
> > >
> > > (optional: I added https://github.com/royrusso/elasticsearch-HQ as a
> > > plugin, basically I unzipped the ES2 zip, ran the plugin script, and
> the
> > > rezipped the package)
> > >
> > > In a location in MapR I copied the esinc.sh to a location out of the
> zip
> > > (in the root of say my working directory,
> > > /mapr/mycluster/mesos/dev/es-yarn/). (see below) Then I created a
> script
> > > that was how I started and scaled up the clusters. (see below). I do
> have
> > > some notes on how it works in the script.
> > >
> > > For basics this was awesome. I didn't use FGS at first, because of a
> bug
> > in
> > > the es-yarn
> > > https://github.com/elastic/elasticsearch-hadoop/issues/598 if the min
> > > allocation cpu is 0 there is a divide by 0. I thought this would have
> > > broken FGS, but apparently it didn't (I started my nodes with min
> > > allocation CPU = 1 and FGS still worked for me... not sure about that,
> > > would love feedback there)
> > >
> > > When I "start" a cluster, I initialize it and eventually my cluster is
> > > running with the specified es nodes. If I want to scale up, I run the
> > > script again with the same cluster name. Those nodes are added to the
> ES
> > > cluster, and now I am running two yarn applications. I can only scale
> > down
> > > by applications. So, if I want to scale down, then I have to kill an
> > > application, if I started 3 ES nodes with that application, I'll scale
> > down
> > > by 3 nodes. Thus, there is an argument to always scale by one ES node,
> > > especially if you are using larger nodes (I wonder what sort of
> > Application
> > > manager overhead I'd get on that).
> > >
> > > Either way, this worked really well.
> > >
> > > The cool thing was with FGS though. I had one node running in a "small"
> > > config and 4 running with zero (even though I set the min allocation
> size
> > > to 1, this still started and seemed to work).  When I submitted the
> > request
> > > for ES nodes, they got put into mesos tasks for each container and it
> > > worked great.  When I scaled the application down it too worked great.
> > > This provided me huge flexibility in scaling up and down without
> > reserving
> > > resources for elastic search clusters.  Kudos to Myriad!!!!!
> > >
> > >
> > > My only comment to the Myriad crew would be a wiki article explaining
> > FGS a
> > > little bit. I just "did it" and it worked, but a little bit more on how
> > it
> > > worked, the challenges, gotchas etc.  Would be outstanding.
> > >
> > > Thanks to everyone's hard work on Myriad, this project has lots of
> power
> > > that it can give Admins/users, and I just wanted to share a win here
> > after
> > > all of my "how do I ... " posts
> > >
> > > John
> > >
> > >
> > >
> > >
> > > startcluster.sh
> > >
> > > #!/bin/bash
> > >
> > >
> > >
> > >
> > >
> > > #Perhaps these should be parameters or at least check to see if they
> are
> > > set in the ENV, if not use these?
> > >
> > >
> > >
> > > ES_JAR="elasticsearch-yarn-2.2.0-beta1.jar"  # Jarfile of es-yarn to
> use
> > >
> > > ES_NFSMOUNT="/mapr/mycluster"     # Root of NFS Mount in MapR
> > >
> > > ES_BASELOC="/mesos/dev/es-yarn"       # Location of this script, the
> > > esinc.sh, and the basis for all things es-yarn
> > >
> > > ES_DATALOC="/data"                           # This is the data
> location,
> > > which is $ES_BASELOC$ES_DATALOC  it creates directories under that for
> > each
> > > clustername, then each node
> > >
> > > ES_PROVISION_LOC="/tmp/esprovision/"         # Where the jar file for
> > > es-yarn, and the elastic search zip file is
> > >
> > >
> > >
> > >  # These are your node names. It needs these to do it's unicast
> > discovery.
> > > This may need to be updated (perhaps I can curl the Mesos Master to get
> > the
> > > node list)
> > >
> > > ES_UNICAST_HOSTS="node1.mydomain.com,node2.mydomain.com,
> > node3.mydomain.com
> > > "
> > >
> > >
> > >
> > >
> > > # The elastic search version you are running (the es-yarn jar uses this
> > to
> > > pick the right zip file, make sure you have not changed the name of the
> > ES
> > > Zip file)
> > >
> > > ES_VER="2.0.0"
> > >
> > >
> > >
> > >
> > > # Cluster settings.  Name and Port
> > >
> > >
> > > ES_CLUSTERNAME="MYESCLUSTER"
> > >
> > > ES_TRANSPORT_PORT="59300-59400"
> > >
> > > ES_HTTP_PORT="59200-59300"
> > >
> > >
> > >
> > > # For this run, the number of nodes to add in "this" application. (Each
> > > submission is a yarn application) and the node size
> > >
> > > NUM_NODES="3"
> > >
> > > NODEMEM="2048"
> > >
> > > NODECPU="2"
> > >
> > >
> > >
> > >
> > > # Don't change anything else here:
> > >
> > >
> > >
> > > ES_INCLUDE="${ES_NFSMOUNT}${ES_BASELOC}/esinc.sh"
> > >
> > > ES_YARN_JAR="${ES_NFSMOUNT}${ES_BASELOC}/${ES_JAR}"
> > >
> > >
> > >
> > >
> > >
> > > ES_ENV="env.ES_CLUSTERNAME=$ES_CLUSTERNAME
> > > env.ES_TRANSPORT_PORT=$ES_TRANSPORT_PORT env.ES_HTTP_PORT=$ES_HTTP_PORT
> > > env.ES_UNICAST_HOSTS=$ES_UNICAST_HOSTS env.ES_NFSMOUNT=$ES_NFSMOUNT
> > > env.ES_BASELOC=$ES_BASELOC env.ES_DATALOC=$ES_DATALOC"
> > >
> > >
> > >
> > > RUNCMD="hadoop jar $ES_YARN_JAR -start containers=$NUM_NODES
> > > hdfs.upload.dir=$ES_PROVISION_LOC es.version=$ES_VER
> > container.mem=$NODEMEM
> > > container.vcores=$NODECPU env.ES_INCLUDE=$ES_INCLUDE $ES_ENV"
> > >
> > >
> > >
> > >
> > >
> > > echo "Starting Cluster.... "
> > >
> > >
> > >
> > > $RUNCMD
> > >
> > >
> > >
> > > echo "Application Submitted, check logs for http endpoints (perhaps we
> > > should monitor the logs until we get one and then display it as
> > > http://IP:port/_plugin/hq";
> > >
> > >
> > >
> > >
> > > Append to your customized esinc.sh:
> > >
> > > ###########################################################
> > >
> > > echo "Start Customization of esinc for yarn/myriad/mapr"
> > >
> > >
> > >
> > > export ES_NODE_NAME="$CONTAINER_ID"    #A Unique value
> > >
> > > export ES_NETWORK_HOST="_non_loopback_"
> > >
> > > export
> > >
> > >
> >
> ES_PATH_LOGS="${ES_NFSMOUNT}${ES_BASELOC}${ES_DATALOC}/$ES_CLUSTERNAME/$ES_NODE_NAME/logs"
> > >
> > > export
> > >
> > >
> >
> ES_PATH_DATA="${ES_NFSMOUNT}${ES_BASELOC}${ES_DATALOC}/$ES_CLUSTERNAME/$ES_NODE_NAME/data"
> > >
> > >
> > >
> > >
> > >
> > > # These are set here, eventually they should be set by the framework
> and
> > > these just grab the value from above at the framework level
> > >
> > >
> > >
> > > #Set log level if needed
> > >
> > > ES_DEBUG_OPTS="-Des.logger.level=DEBUG"
> > >
> > >
> > >
> > > # Cluster Name and Node Name - Think through Nodename here more...
> > Perhaps
> > > we could generate a name that if it failed and tried to restart would
> > have
> > > the same node name...
> > >
> > > ES_NAME_OPTS="-Des.cluster.name <http://des.cluster.name/
> > >=$ES_CLUSTERNAME
> > > -
> > > Des.node.name <http://des.node.name/>=$ES_NODE_NAME"
> > >
> > >
> > >
> > > # Path to Log Locations and Datafile locations Todo: Perhaps add labels
> > or
> > > create volumes with mapr rest api
> > >
> > > ES_PATH_OPTS="-Des.path.logs=$ES_PATH_LOGS
> -Des.path.data=$ES_PATH_DATA"
> > >
> > >
> > >
> > > #Networking options. Need to set the other nodes for discovery, the
> > network
> > > host so it's listening on the right interfaces, and the ports used for
> > > transport and http
> > >
> > >
> ES_NETWORK_OPTS="-Des.discovery.zen.ping.unicast.hosts=$ES_UNICAST_HOSTS
> > > -Des.network.host=$ES_NETWORK_HOST
> > > -Des.transport.tcp.port=$ES_TRANSPORT_PORT
> -Des.http.port=$ES_HTTP_PORT"
> > >
> > >
> > >
> > >
> > >
> > > export ES_JAVA_OPTS="$ES_DEBUG_OPTS $ES_NAME_OPTS $ES_PATH_OPTS
> > > $ES_NETWORK_OPTS"
> > >
> > >
> > >
> > > #This is just for debugging
> > >
> > > env
> > >
> > >
> > > #########################################
> > >
> >
>

Reply via email to