blob: f766115cd406eac43749154e84f83d7b4f91cf4b [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_292) on Tue Jun 15 06:12:10 GMT 2021 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>AbstractPreemptableResourceCalculator (Apache Hadoop YARN ResourceManager 3.3.1 API)</title>
<meta name="date" content="2021-06-15">
<link rel="stylesheet" type="text/css" href="../../../../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="AbstractPreemptableResourceCalculator (Apache Hadoop YARN ResourceManager 3.3.1 API)";
}
}
catch(err) {
}
//-->
var methods = {"i0":10,"i1":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/AbstractPreemptableResourceCalculator.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptionEntity.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../index.html?org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html" target="_top">Frames</a></li>
<li><a href="AbstractPreemptableResourceCalculator.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity</div>
<h2 title="Class AbstractPreemptableResourceCalculator" class="title">Class AbstractPreemptableResourceCalculator</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
<li>
<ul class="inheritance">
<li>org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.AbstractPreemptableResourceCalculator</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>Direct Known Subclasses:</dt>
<dd><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/PreemptableResourceCalculator.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">PreemptableResourceCalculator</a></dd>
</dl>
<hr>
<br>
<pre>public class <span class="typeNameLabel">AbstractPreemptableResourceCalculator</span>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
<div class="block">Calculate how much resources need to be preempted for each queue,
will be used by <a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/PreemptionCandidatesSelector.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity"><code>PreemptionCandidatesSelector</code></a>.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- =========== FIELD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="field.summary">
<!-- -->
</a>
<h3>Field Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Field and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>protected <a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/CapacitySchedulerPreemptionContext.html" title="interface in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">CapacitySchedulerPreemptionContext</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html#context">context</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>protected boolean</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html#isReservedPreemptionCandidatesSelector">isReservedPreemptionCandidatesSelector</a></span></code>&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>protected org.apache.hadoop.yarn.util.resource.ResourceCalculator</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html#rc">rc</a></span></code>&nbsp;</td>
</tr>
</table>
</li>
</ul>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html#AbstractPreemptableResourceCalculator-org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.CapacitySchedulerPreemptionContext-boolean-boolean-">AbstractPreemptableResourceCalculator</a></span>(<a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/CapacitySchedulerPreemptionContext.html" title="interface in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">CapacitySchedulerPreemptionContext</a>&nbsp;preemptionContext,
boolean&nbsp;isReservedPreemptionCandidatesSelector,
boolean&nbsp;allowQueuesBalanceAfterAllQueuesSatisfied)</code>
<div class="block">PreemptableResourceCalculator constructor.</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html#computeFixpointAllocation-org.apache.hadoop.yarn.api.records.Resource-java.util.Collection-org.apache.hadoop.yarn.api.records.Resource-boolean-">computeFixpointAllocation</a></span>(org.apache.hadoop.yarn.api.records.Resource&nbsp;totGuarant,
<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempQueuePerPartition.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">TempQueuePerPartition</a>&gt;&nbsp;qAlloc,
org.apache.hadoop.yarn.api.records.Resource&nbsp;unassigned,
boolean&nbsp;ignoreGuarantee)</code>
<div class="block">Given a set of queues compute the fix-point distribution of unassigned
resources among them.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>protected void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html#initIdealAssignment-org.apache.hadoop.yarn.api.records.Resource-org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.TempQueuePerPartition-org.apache.hadoop.yarn.api.records.Resource-">initIdealAssignment</a></span>(org.apache.hadoop.yarn.api.records.Resource&nbsp;totGuarant,
<a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempQueuePerPartition.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">TempQueuePerPartition</a>&nbsp;q,
org.apache.hadoop.yarn.api.records.Resource&nbsp;initIdealAssigned)</code>
<div class="block">This method is visible to allow sub-classes to override the initialization
behavior.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ FIELD DETAIL =========== -->
<ul class="blockList">
<li class="blockList"><a name="field.detail">
<!-- -->
</a>
<h3>Field Detail</h3>
<a name="context">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>context</h4>
<pre>protected final&nbsp;<a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/CapacitySchedulerPreemptionContext.html" title="interface in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">CapacitySchedulerPreemptionContext</a> context</pre>
</li>
</ul>
<a name="rc">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>rc</h4>
<pre>protected final&nbsp;org.apache.hadoop.yarn.util.resource.ResourceCalculator rc</pre>
</li>
</ul>
<a name="isReservedPreemptionCandidatesSelector">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>isReservedPreemptionCandidatesSelector</h4>
<pre>protected&nbsp;boolean isReservedPreemptionCandidatesSelector</pre>
</li>
</ul>
</li>
</ul>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a name="AbstractPreemptableResourceCalculator-org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.CapacitySchedulerPreemptionContext-boolean-boolean-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>AbstractPreemptableResourceCalculator</h4>
<pre>public&nbsp;AbstractPreemptableResourceCalculator(<a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/CapacitySchedulerPreemptionContext.html" title="interface in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">CapacitySchedulerPreemptionContext</a>&nbsp;preemptionContext,
boolean&nbsp;isReservedPreemptionCandidatesSelector,
boolean&nbsp;allowQueuesBalanceAfterAllQueuesSatisfied)</pre>
<div class="block">PreemptableResourceCalculator constructor.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>preemptionContext</code> - context</dd>
<dd><code>isReservedPreemptionCandidatesSelector</code> - this will be set by different implementation of candidate
selectors, please refer to TempQueuePerPartition#offer for
details.</dd>
<dd><code>allowQueuesBalanceAfterAllQueuesSatisfied</code> - Should resources be preempted from an over-served queue when the
requesting queues are all at or over their guarantees?
An example is, there're 10 queues under root, guaranteed resource
of them are all 10%.
Assume there're two queues are using resources, queueA uses 10%
queueB uses 90%. For all queues are guaranteed, but it's not fair
for queueA.
We wanna make this behavior can be configured. By default it is
not allowed.</dd>
</dl>
</li>
</ul>
</li>
</ul>
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="computeFixpointAllocation-org.apache.hadoop.yarn.api.records.Resource-java.util.Collection-org.apache.hadoop.yarn.api.records.Resource-boolean-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>computeFixpointAllocation</h4>
<pre>protected&nbsp;void&nbsp;computeFixpointAllocation(org.apache.hadoop.yarn.api.records.Resource&nbsp;totGuarant,
<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempQueuePerPartition.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">TempQueuePerPartition</a>&gt;&nbsp;qAlloc,
org.apache.hadoop.yarn.api.records.Resource&nbsp;unassigned,
boolean&nbsp;ignoreGuarantee)</pre>
<div class="block">Given a set of queues compute the fix-point distribution of unassigned
resources among them. As pending request of a queue are exhausted, the
queue is removed from the set and remaining capacity redistributed among
remaining queues. The distribution is weighted based on guaranteed
capacity, unless asked to ignoreGuarantee, in which case resources are
distributed uniformly.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>totGuarant</code> - total guaranteed resource</dd>
<dd><code>qAlloc</code> - List of child queues</dd>
<dd><code>unassigned</code> - Unassigned resource per queue</dd>
<dd><code>ignoreGuarantee</code> - ignore guarantee per queue.</dd>
</dl>
</li>
</ul>
<a name="initIdealAssignment-org.apache.hadoop.yarn.api.records.Resource-org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.TempQueuePerPartition-org.apache.hadoop.yarn.api.records.Resource-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>initIdealAssignment</h4>
<pre>protected&nbsp;void&nbsp;initIdealAssignment(org.apache.hadoop.yarn.api.records.Resource&nbsp;totGuarant,
<a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempQueuePerPartition.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity">TempQueuePerPartition</a>&nbsp;q,
org.apache.hadoop.yarn.api.records.Resource&nbsp;initIdealAssigned)</pre>
<div class="block">This method is visible to allow sub-classes to override the initialization
behavior.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>totGuarant</code> - total resources (useful for <code>ResourceCalculator</code>
operations)</dd>
<dd><code>q</code> - the <code>TempQueuePerPartition</code> being initialized</dd>
<dd><code>initIdealAssigned</code> - the proposed initialization value.</dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/AbstractPreemptableResourceCalculator.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li><a href="../../../../../../../../org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptionEntity.html" title="class in org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../index.html?org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/AbstractPreemptableResourceCalculator.html" target="_top">Frames</a></li>
<li><a href="AbstractPreemptableResourceCalculator.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<p class="legalCopy"><small>Copyright &#169; 2008&#x2013;2021 <a href="https://www.apache.org">Apache Software Foundation</a>. All rights reserved.</small></p>
</body>
</html>