[ 
https://issues.apache.org/jira/browse/HADOOP-4513?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12648951#action_12648951
 ] 

Hemanth Yamijala commented on HADOOP-4513:
------------------------------------------

Some comments:
- Please expose variables like initalizationPoller, that are needed in tests 
via accessor methods, and make the variable itself private.

JobInitializationPoller:
- Typo: Should be {{JobInitializationPoller}} and not 
{{JobInitalizationPoller}}. Also, same typo (initaliz..) exists for other 
variables also, including in capacity scheduler.
- Need not call super() explicitly.
- maxUserToInitialize should be maxUsersToInitialize
- Please document the purpose of the various data structures.
-  {{terminate}} should use the logger and not print stack trace while handling 
InterruptedException. And it should probably break here, and exit.
- {{terminate}} is interrupting and joining threads more than once. While this 
may not be a problem, it is best not to do so. The code should check if the 
thread is still alive before calling these APIs.
- {{threadsAssignedToQueue}} seems to indicate more than one thread can be 
assigned to the same queue. Suggestions for renaming include 
{{threadsAssignedToQueues}} or {{threadsToQueuesMap}}. Similarly, 
{{assignThreadsToQueue}}.
- Initialization of threadsAssignedToQueue can be in the constructor itself.
- Since threadsAssignedToQueue is a member variable, we don't need to pass it 
to assignThreadsToQueue
- commented line "// startIndex = ((startIndex+1)%countOfQueues);" can be 
removed.
- Some comments on simplifying {{getJobsToInitialize}}
-- need more comments explaining the code. Particularly why the code is 
checking for total number of jobs per queue is not obvious.
-- maxJobsAllowedToInitalize should be maxJobsPerUserAllowedToInitialize
-- would the (pseudo-code) below do the same thing ? It seems like this is a 
bit more clear.
{code}
      if (!isUserPresent 
                  && userJobsInitalized.size() < 
maximumUsersAllowedToInitialize) {
          // new user and we are within limits, so initialize
          userJobsInitalized.put(user, Integer.valueOf(1));
          jobsToInitalize.add(job);
          initalizedJobs.add(job.getJobID());
          countOfJobsInitialized++;
      } else if (isUserPresent 
                  && numberOfJobs < maxJobsAllowedToInitalize
                  && countOfJobsInitialized < maxJobsPerQueueToInitialize) {
          // existing user, we are within overall limits and per user limit
          userJobsInitalized.put(user, Integer.valueOf(1));
          jobsToInitalize.add(job);
          initalizedJobs.add(job.getJobID());
          countOfJobsInitialized++;
      }
{code}
- printJobs should be called only if the Log is enabled (LOG.isDebugEnabled)
- When initTasks fails, we are calling job.fail. Maybe we should also notify 
the jobqueuemanager to remove the job from the queue ? This needs some more 
discussion.
- In the worker thread's run, the {{continue}} seems redundant, as there's no 
other code to execute.
- The comment on MAX_ADDITIONAL_USERS_TO_INIT can be improved a bit. Basically, 
we want to keep a couple of additional users jobs initialized so when their 
jobs need to run because of user limits, they would be ready.
- Do we need a ConcurrentHashMap for the queue to threads mapping ? The 
modification is done in the addQueue method which is only done once, and all 
subsequent operations are read only.
- The {{terminate}} method should be package private. 
- The worker thread's shutdown should be called before initializing
- We should check if the stop flag (or equivalent) is set before going into 
Thread.sleep. Alternative is to use Thread.isInterrupted(). 

JobQueueManager:
- I am thinking removal of completed jobs from the 'jobqueue' must also be done 
in jobCompleted, and not from the poller. This keeps it simple to understand.

CapacityTaskScheduler:
- Use {{terminate}} to stop the Poller thread, rather than {{stop}}

CapacitySchedulerConf:
- {{maximum-initialized-jobs-per-user}} should be included in the xml file. I 
am thinking we should define the values for the default queue atleast. It is 
preferable to define the default value for all queues as well - just for other 
variables. This will keep the variables consistent.
- Check for invalid (negative values) is not done for 
maximum-initialized-jobs-per-user. 

> Capacity scheduler should initialize tasks asynchronously
> ---------------------------------------------------------
>
>                 Key: HADOOP-4513
>                 URL: https://issues.apache.org/jira/browse/HADOOP-4513
>             Project: Hadoop Core
>          Issue Type: Bug
>          Components: contrib/capacity-sched
>    Affects Versions: 0.19.0
>            Reporter: Hemanth Yamijala
>            Assignee: Sreekanth Ramakrishnan
>             Fix For: 0.19.1
>
>         Attachments: HADOOP-4513-1.patch, HADOOP-4513-2.patch
>
>
> Currently, the capacity scheduler initializes tasks on demand, as opposed to 
> the eager initialization technique used by the default scheduler. This is 
> done in order to save JT memory footprint. However, the initialization is 
> done in the {{assignTasks}} API which is not a good idea as task 
> initialization could be a time consuming operation. This JIRA is to move out 
> the initialization outside the {{assignTasks}} API and do it asynchronously.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to