Modified: helix/site-content/1.0.2-docs/Tutorial.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/Tutorial.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/Tutorial.html (original) +++ helix/site-content/1.0.2-docs/Tutorial.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-tutorial project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Tutorial</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -207,10 +220,10 @@ under the License. <div class="source"> <pre><code>// Create setup tool instance // Note: ZK_ADDRESS is the host:port of Zookeeper -String ZK_ADDRESS = "localhost:2199"; +String ZK_ADDRESS = "localhost:2199"; admin = new ZKHelixAdmin(ZK_ADDRESS); -String CLUSTER_NAME = "helix-demo"; +String CLUSTER_NAME = "helix-demo"; //Create cluster namespace in zookeeper admin.addCluster(CLUSTER_NAME); </code></pre> @@ -226,19 +239,19 @@ admin.addCluster(CLUSTER_NAME); <h4 id="Configure_the_Nodes_of_the_Cluster">Configure the Nodes of the Cluster</h4> <p>First we'll add new nodes to the cluster, then configure the nodes in the cluster. Each node in the cluster must be uniquely identifiable. The most commonly used convention is hostname:port.</p> <div class="source"> - <pre><code>String CLUSTER_NAME = "helix-demo"; + <pre><code>String CLUSTER_NAME = "helix-demo"; int NUM_NODES = 2; -String hosts[] = new String[]{"localhost","localhost"}; -String ports[] = new String[]{"7000","7001"}; +String hosts[] = new String[]{"localhost","localhost"}; +String ports[] = new String[]{"7000","7001"}; for (int i = 0; i < NUM_NODES; i++) { - InstanceConfig instanceConfig = new InstanceConfig(hosts[i]+ "_" + ports[i]); + InstanceConfig instanceConfig = new InstanceConfig(hosts[i]+ "_" + ports[i]); instanceConfig.setHostName(hosts[i]); instanceConfig.setPort(ports[i]); instanceConfig.setInstanceEnabled(true); //Add additional system specific configuration if needed. These can be accessed during the node start up. - instanceConfig.getRecord().setSimpleField("key", "value"); + instanceConfig.getRecord().setSimpleField("key", "value"); admin.addInstance(CLUSTER_NAME, instanceConfig); } </code></pre> @@ -270,13 +283,13 @@ for (int i = 0; i < NUM_NODES; i++) </ul> <p>The following snippet shows how to declare the state model and constraints for the LEADER-STANDBY model.</p> <div class="source"> - <pre><code>String STATE_MODEL_NAME = "LeaderStandby"; + <pre><code>String STATE_MODEL_NAME = "LeaderStandby"; StateModelDefinition.Builder builder = new StateModelDefinition.Builder(STATE_MODEL_NAME); // Define your own states: those are opaque strings to Helix // Only the topology of the state machine (initial state, transitions, priorities, final DROPPED state) is meaningful to Helix -String LEADER = "LEADER"; -String STANDBY = "STANDBY"; -String OFFLINE = "OFFLINE"; +String LEADER = "LEADER"; +String STANDBY = "STANDBY"; +String OFFLINE = "OFFLINE"; // Add states and their rank to indicate priority. A lower rank corresponds to a higher priority builder.addState(LEADER, 1); @@ -306,7 +319,7 @@ builder.upperBound(LEADER, 1); // this allows a different replication factor for each resource without // having to define a new state model -builder.dynamicUpperBound(STANDBY, "R"); +builder.dynamicUpperBound(STANDBY, "R"); StateModelDefinition myStateModel = builder.build(); admin.addStateModelDef(CLUSTER_NAME, STATE_MODEL_NAME, myStateModel); @@ -324,10 +337,10 @@ admin.addStateModelDef(CLUSTER_NAME, STA </ul> <p>For more information on the assignment modes, see the <a href="./tutorial_rebalance.html">Rebalancing Algorithms</a> section of this tutorial.</p> <div class="source"> - <pre><code>String RESOURCE_NAME = "MyDB"; + <pre><code>String RESOURCE_NAME = "MyDB"; int NUM_PARTITIONS = 6; -String STATE_MODEL_NAME = "LeaderStandby"; -String MODE = "SEMI_AUTO"; +String STATE_MODEL_NAME = "LeaderStandby"; +String MODE = "SEMI_AUTO"; int NUM_REPLICAS = 2; admin.addResource(CLUSTER_NAME, RESOURCE_NAME, NUM_PARTITIONS, STATE_MODEL_NAME, MODE); @@ -407,7 +420,7 @@ admin.rebalance(CLUSTER_NAME, RESOURCE_N <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a>
Modified: helix/site-content/1.0.2-docs/auto_exit_maintenance.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/auto_exit_maintenance.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/auto_exit_maintenance.html (original) +++ helix/site-content/1.0.2-docs/auto_exit_maintenance.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-auto_exit_maintenance project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Auto-exit of Maintenance Mode</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -199,19 +212,19 @@ under the License. <p>Currently, Helix stores the maintenance signal in /{CLUSTER_NAME}/CONTROLLER/MAINTENANCE. A sample maintenance signal ZNode will look like the following:</p> <div class="source"> <pre><code class="language-json">{ - "id" : "maintenance", - "simpleFields" : { - "REASON" : "Offline Instances count 5 greater than allowed count 4. Stop rebalance and put the cluster CLUSTER_TestClusterInMaintenanceModeWhenReachingOfflineInstancesLimit into maintenance mode.", - "TRIGGERED_BY" : "CONTROLLER", - "TIMESTAMP" : "12312838831***", + "id" : "maintenance", + "simpleFields" : { + "REASON" : "Offline Instances count 5 greater than allowed count 4. Stop rebalance and put the cluster CLUSTER_TestClusterInMaintenanceModeWhenReachingOfflineInstancesLimit into maintenance mode.", + "TRIGGERED_BY" : "CONTROLLER", + "TIMESTAMP" : "12312838831***", // The following are sample user-defined fields from the REST call payload // - "id" : "hulee", - "jira" : "HELIX-123", - "cluster" : "testCluster" + "id" : "hulee", + "jira" : "HELIX-123", + "cluster" : "testCluster" }, - "listFields" : { + "listFields" : { }, - "mapFields" : { + "mapFields" : { } } </code></pre> @@ -229,8 +242,8 @@ under the License. <p>Currently, Helix maintains the controller history in the /{clusterName}/CONTROLLER/HISTORY ZNode. We plan to add a history for maintenance mode. This way, users will be able to access the history in ZooKeeper directly, or utilize the REST endpoint for viewing. The format will be in a human-readable format like the following (this is how Helix maintains the Controller leader history):</p> <div class="source"> <pre><code class="language-java">long currentTime = System.currentTimeMillis(); -DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); -df.setTimeZone(TimeZone.getTimeZone("UTC")); +DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); +df.setTimeZone(TimeZone.getTimeZone("UTC")); String dateTime = df.format(new Date(currentTime)); </code></pre> </div> @@ -261,7 +274,7 @@ String dateTime = df.format(new Date(cur <section> <h3 id="Guide">Guide</h3> <p>First, we encourage all users of this feature to understand Helix's workflow below:</p> - <p><img src="./images/auto-exit-maintenance.jpg" alt="Intro" /></p> + <p><img src="./images/auto-exit-maintenance.jpg" alt="Intro"></p> <p>In order to use this feature, you'd need to set the following config parameters in your cluster's ClusterConfig.</p> <section> <h4 id="Auto-enter_maintenance_mode">Auto-enter maintenance mode</h4> @@ -363,7 +376,7 @@ String dateTime = df.format(new Date(cur <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/design_crushed.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/design_crushed.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/design_crushed.html (original) +++ helix/site-content/1.0.2-docs/design_crushed.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-design_crushed project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>CrushED (Crush-based rebalancer with Even Distribution)</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -147,20 +160,20 @@ <p>CrushRebalanceStrategy has very small movement count, but the distribution is not optimal. MultiRoundCrushRebalanceStrategy was designed to solve this problem by running CRUSH multiple times on partition assignments that contribute to uneven mapping. However, due to potentially high number of rounds, computation cost is high, we observed significantly more partition movements when the cluster topology is changed.</p> <p>Since we have a good base strategy, CrushRebalanceStrategy, we built CrushEDRebalanceStrategy on top of it. Sample mapping of both strategies are as following. Note that blue parts remain unchanged before and after.</p> <p>Before (CRUSH)</p> - <p><img src="images/design/crushed/before-using-crush.png" alt="Before (CRUSH)" /></p> + <p><img src="images/design/crushed/before-using-crush.png" alt="Before (CRUSH)"></p> <p>After (new strategy)</p> - <p><img src="images/design/crushed/after-using-crushed.png" alt="After (new strategy)" /></p> - <p>Since the problem is NP-hard. We are not expecting the best assignment. A greedy algorithm works good enough.<br /> After we tried different designs, we found it's hard to achieve both goals (even distribution and fewer movements) using a single strategy. So we decided to apply a hybrid algorithm that finishes the work step by step.</p> - <p><b>Step 1, run CRUSH to get a base assignment.</b><br /> The base assignment usually contains a certain number of uneven partitions(i.e. extra partitions above perfect distribution), so we need the following steps to re-distribute them.</p> - <p><b>Step 2, run a card dealing algorithm on the uneven parts.</b><br /> Assign extra partitions to under-loaded nodes, using card dealing strategy. This algorithm is conceptually simple. The result ensures that all partitions are assigned to instances with minimum difference. When gauranteeing fault-zone safe assignment, our greedy algorithm may not be able to calculate possible results because of fault-zone conflict.</p> + <p><img src="images/design/crushed/after-using-crushed.png" alt="After (new strategy)"></p> + <p>Since the problem is NP-hard. We are not expecting the best assignment. A greedy algorithm works good enough.<br> After we tried different designs, we found it's hard to achieve both goals (even distribution and fewer movements) using a single strategy. So we decided to apply a hybrid algorithm that finishes the work step by step.</p> + <p><b>Step 1, run CRUSH to get a base assignment.</b><br> The base assignment usually contains a certain number of uneven partitions(i.e. extra partitions above perfect distribution), so we need the following steps to re-distribute them.</p> + <p><b>Step 2, run a card dealing algorithm on the uneven parts.</b><br> Assign extra partitions to under-loaded nodes, using card dealing strategy. This algorithm is conceptually simple. The result ensures that all partitions are assigned to instances with minimum difference. When gauranteeing fault-zone safe assignment, our greedy algorithm may not be able to calculate possible results because of fault-zone conflict.</p> <p>Example of assignments after step 2,</p> - <p><img src="images/design/crushed/example-cluster-partition-dist.png" alt="Example" /></p> - <p><b>Step 3, Shuffle partitions' preference lists.</b><br /> State assignments (i.e. Master, Slave, Online, Offline, etc) are made according to preflist, ordered node. When using randomly ordered lists, State assignment is also random, and it may result in uneven state distribution. To resolve this issue, CrushED assigns scores to nodes as it computes pref list, to give all nodes equal chances in appearing at the top of the pref list. This operation results in a much more even state distribution.</p> + <p><img src="images/design/crushed/example-cluster-partition-dist.png" alt="Example"></p> + <p><b>Step 3, Shuffle partitions' preference lists.</b><br> State assignments (i.e. Master, Slave, Online, Offline, etc) are made according to preflist, ordered node. When using randomly ordered lists, State assignment is also random, and it may result in uneven state distribution. To resolve this issue, CrushED assigns scores to nodes as it computes pref list, to give all nodes equal chances in appearing at the top of the pref list. This operation results in a much more even state distribution.</p> <p>Example of master distribution before step 3,</p> - <p><img src="images/design/crushed/example-cluster-master-dist.png" alt="Example" /></p> + <p><img src="images/design/crushed/example-cluster-master-dist.png" alt="Example"></p> <p>Example of master distribution after step 3,</p> - <p><img src="images/design/crushed/example-cluster-master-dist-after.png" alt="Example" /></p> - <p><b>Step 4, re-calculate the assignment for the partitions on temporarily disabled nodes using a consistent hashing algorithm.</b><br /> Consistent hashing ensures minimize partition movement.<br /> Note that the first 3 steps are using full node list, regardless of disabled or offline nodes. So the assignment will be stable even the algorithm contains random factors such hashCode. Then step 4 ensures all the disabled nodes are handled correctly without causing huge partition movements.</p> + <p><img src="images/design/crushed/example-cluster-master-dist-after.png" alt="Example"></p> + <p><b>Step 4, re-calculate the assignment for the partitions on temporarily disabled nodes using a consistent hashing algorithm.</b><br> Consistent hashing ensures minimize partition movement.<br> Note that the first 3 steps are using full node list, regardless of disabled or offline nodes. So the assignment will be stable even the algorithm contains random factors such hashCode. Then step 4 ensures all the disabled nodes are handled correctly without causing huge partition movements.</p> <p>Pseudocode of above algorithm is as follows :</p> <p><b>Pseudo Code</b></p> <div class="source"> @@ -207,23 +220,23 @@ if (!nodeToPartitionMap.isEmpty()) { <li>Adding hosts to simulate expansion.</li> <li>Rolling upgrade.</li> </ul> - <p>All results show that CrushED generates more uniform global distribution compared with CRUSH.<br /> Moreover, partition movements in most scenarios are minimized. When topology changes (i.e. cluster expansion), there can be significantly more partition movements, but we can control the impact by using State Transition Throttling feature.</p> + <p>All results show that CrushED generates more uniform global distribution compared with CRUSH.<br> Moreover, partition movements in most scenarios are minimized. When topology changes (i.e. cluster expansion), there can be significantly more partition movements, but we can control the impact by using State Transition Throttling feature.</p> <section> <h3 id="Partition_Distribution">Partition Distribution</h3> - <p>Following charts demonstrate the worst cases (min load vs. max load) and STDEVs of partition/master distributions from some sample clusters data.<br /> If we measure the improvement by STDEV, CrushED improves the partition distribution evenness by 87% on average compared with CRUSH. And for state assignment (i.e. Mastership assignment) the evenness improvement is 68% on average.</p> - <p><img src="images/design/crushed/cursh-partition-dist.png" alt="Example" /><img src="images/design/crushed/crushed-partition-dist.png" alt="Example" /></p> - <p><img src="images/design/crushed/cursh-master-dist.png" alt="Example" /><img src="images/design/crushed/crushed-master-dist.png" alt="Example" /></p> + <p>Following charts demonstrate the worst cases (min load vs. max load) and STDEVs of partition/master distributions from some sample clusters data.<br> If we measure the improvement by STDEV, CrushED improves the partition distribution evenness by 87% on average compared with CRUSH. And for state assignment (i.e. Mastership assignment) the evenness improvement is 68% on average.</p> + <p><img src="images/design/crushed/cursh-partition-dist.png" alt="Example"><img src="images/design/crushed/crushed-partition-dist.png" alt="Example"></p> + <p><img src="images/design/crushed/cursh-master-dist.png" alt="Example"><img src="images/design/crushed/crushed-master-dist.png" alt="Example"></p> </section> <section> <h3 id="Disabling_Nodes">Disabling Nodes</h3> - <p>When nodes are offline or disabled, CrushED will re-assign the partitions to other live nodes. The algorithm move only the necessary partitions.<br /> We simulated disabling nodes, and measured partition movement changes and mastership changes. We also used the expected movement (the partitions/masters count on the disabled nodes) as a baseline to measure extra movements.</p> + <p>When nodes are offline or disabled, CrushED will re-assign the partitions to other live nodes. The algorithm move only the necessary partitions.<br> We simulated disabling nodes, and measured partition movement changes and mastership changes. We also used the expected movement (the partitions/masters count on the disabled nodes) as a baseline to measure extra movements.</p> <p>The results show that movement is highly correlated to the number of disabled nodes, and extra movements are minor (in most cases 0 movements).</p> <p>Note that <b>Rate</b> in this document is <b>the changed number / total partition or master count</b>.</p> - <p><img src="images/design/crushed/node-down-partition-move.png" alt="Example" /><img src="images/design/crushed/node-down-master-move.png" alt="Example" /></p> + <p><img src="images/design/crushed/node-down-partition-move.png" alt="Example"><img src="images/design/crushed/node-down-master-move.png" alt="Example"></p> </section> <section> <h3 id="Rolling_upgrade">Rolling upgrade</h3> - <p>Rolling upgrade is different from disabling nodes. Since nodes are reset one by one, in this test we assume the difference could be 2 nodes in maximum (for example, upgrading Node A then upgrading Node B).<br /> In this case, movements are still minimized. Even in the worst case scenario, extra partition movements and mastership changes are still close to 0%.</p> + <p>Rolling upgrade is different from disabling nodes. Since nodes are reset one by one, in this test we assume the difference could be 2 nodes in maximum (for example, upgrading Node A then upgrading Node B).<br> In this case, movements are still minimized. Even in the worst case scenario, extra partition movements and mastership changes are still close to 0%.</p> <p>Note that in real production clusters, we can completely avoid partition movements while doing rolling upgrade, by enabling Delayed Rebalancing.</p> </section> <section> @@ -233,10 +246,10 @@ if (!nodeToPartitionMap.isEmpty()) { </section> <section> <h3 id="Algorithm_Performance">Algorithm Performance</h3> - <p>We compared CrushED with CRUSH algorithms using different instance numbers. The tests are executed multiple times and we recorded median computation time.<br /> CrushED does not cost much additional computation time for regular rebalancing. In some of the worst cases, 30% more runtime was observed, compared with CRUSH, but it is quicker than MultiRoundCRUSH.</p> + <p>We compared CrushED with CRUSH algorithms using different instance numbers. The tests are executed multiple times and we recorded median computation time.<br> CrushED does not cost much additional computation time for regular rebalancing. In some of the worst cases, 30% more runtime was observed, compared with CRUSH, but it is quicker than MultiRoundCRUSH.</p> <p>However, when there are down nodes since CrushED needs to run an additional consistent hashing based re-distribution, the computation time will be much longer. In some cases, we saw more than 3 times compared to CRUSH.</p> <p>With some <b>performance improvements</b>, such as using cache to avoid duplicate calculation, we achieved to greatly reduce CrushED's running time. According to our experiment, it is now close to MultiRound CRUSH.</p> - <p><img src="images/design/crushed/performance.png" alt="Example" /></p> + <p><img src="images/design/crushed/performance.png" alt="Example"></p> </section> </section> <section> @@ -252,15 +265,15 @@ if (!nodeToPartitionMap.isEmpty()) { </ol> <p><b>IdeaState SimpleFields Example</b></p> <div class="source"> - <pre><code>HELIX_ENABLED : "true" -IDEAL\_STATE\_MODE : "AUTO_REBALANCE" -REBALANCE\_MODE : "FULL\_AUTO" -REBALANCE_STRATEGY : "org.apache.helix.controller.rebalancer.strategy.CrushRebalanceStrategy" -MIN\_ACTIVE\_REPLICAS : "0" -NUM_PARTITIONS : "64" -REBALANCER\_CLASS\_NAME : "org.apache.helix.controller.rebalancer.DelayedAutoRebalancer" -REPLICAS : "1" -STATE\_MODEL\_DEF_REF : "LeaderStandby" + <pre><code>HELIX_ENABLED : "true" +IDEAL\_STATE\_MODE : "AUTO_REBALANCE" +REBALANCE\_MODE : "FULL\_AUTO" +REBALANCE_STRATEGY : "org.apache.helix.controller.rebalancer.strategy.CrushRebalanceStrategy" +MIN\_ACTIVE\_REPLICAS : "0" +NUM_PARTITIONS : "64" +REBALANCER\_CLASS\_NAME : "org.apache.helix.controller.rebalancer.DelayedAutoRebalancer" +REPLICAS : "1" +STATE\_MODEL\_DEF_REF : "LeaderStandby" </code></pre> </div> </section> @@ -333,7 +346,7 @@ STATE\_MODEL\_DEF_REF : "LeaderStan <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/download.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/download.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/download.html (original) +++ helix/site-content/1.0.2-docs/download.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -30,24 +36,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-download project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -120,7 +133,7 @@ <li><a href="./" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Apache Helix Downloads</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -151,15 +164,13 @@ <section> <h2 id="Release">Release</h2> <p>Release date: 06/10/2019 </p> - <p><a href="releasenotes/release-1.0.2.html">1.0.2 Release notes</a></p> - <a name="mirror"></a> + <p><a href="releasenotes/release-1.0.2.html">1.0.2 Release notes</a></p> <a name="mirror"></a> <section> <h3 id="Mirror">Mirror</h3> - <p> [if-any logo] <a href="[link]"> <img src="[logo]" align="right" border="0" alt="logo" /> </a> [end] The currently selected mirror is <b>[preferred]</b>. If you encounter a problem with this mirror, please select another mirror. If all mirrors are failing, there are <i>backup</i> mirrors (at the end of the mirrors list) that should be available. </p> + <p> [if-any logo] <a href="[link]"> <img src="[logo]" align="right" border="0" alt="logo"> </a> [end] The currently selected mirror is <b>[preferred]</b>. If you encounter a problem with this mirror, please select another mirror. If all mirrors are failing, there are <i>backup</i> mirrors (at the end of the mirrors list) that should be available. </p> <form action="[location]" method="get" id="SelectMirror" class="form-inline"> - Other mirrors: - <select name="Preferred" class="input-xlarge"> [if-any http] [for http] <option value="[http]">[http]</option> [end] [end] [if-any ftp] [for ftp] <option value="[ftp]">[ftp]</option> [end] [end] [if-any backup] [for backup] <option value="[backup]">[backup] (backup)</option> [end] [end] </select> - <input type="submit" value="Change" class="btn" /> + Other mirrors: <select name="Preferred" class="input-xlarge"> [if-any http] [for http] <option value="[http]">[http]</option> [end] [end] [if-any ftp] [for ftp] <option value="[ftp]">[ftp]</option> [end] [end] [if-any backup] [for backup] <option value="[backup]">[backup] (backup)</option> [end] [end] </select> + <input type="submit" value="Change" class="btn"> </form> <p> You may also consult the <a class="externalLink" href="http://www.apache.org/mirrors/">complete list of mirrors.</a> </p> </section> @@ -225,12 +236,12 @@ <pre>% pgpk -a KEYS % pgpv downloaded_file.asc</pre> </div> or - <br /> + <br> <div class="source"> <pre>% pgp -ka KEYS % pgp downloaded_file.asc</pre> </div> or - <br /> + <br> <div class="source"> <pre>% gpg --import KEYS % gpg --verify downloaded_file.asc</pre> @@ -311,7 +322,7 @@ <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/index.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/index.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/index.html (original) +++ helix/site-content/1.0.2-docs/index.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-index project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Helix 1.0.2 Documentation</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -231,7 +244,7 @@ <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/privacy-policy.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/privacy-policy.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/privacy-policy.html (original) +++ helix/site-content/1.0.2-docs/privacy-policy.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -30,24 +36,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-privacy-policy project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -120,7 +133,7 @@ <li><a href="./" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Privacy Policy</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -214,7 +227,7 @@ <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/quota_scheduling.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/quota_scheduling.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/quota_scheduling.html (original) +++ helix/site-content/1.0.2-docs/quota_scheduling.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-quota_scheduling project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="./" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Quota-based Task Scheduling</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -151,7 +164,7 @@ under the License. </div> <section> <h2 id="Introduction">Introduction</h2> - <p><img src="./images/quota_intro.png" alt="Intro" /></p> + <p><img src="./images/quota_intro.png" alt="Intro"></p> <p>Quota-based task scheduling is a feature addition to Helix Task Framework that enables users of Task Framework to apply the notion of categories in distributed task management.</p> </section> <section> @@ -200,7 +213,7 @@ under the License. <section> <h3 id="RuntimeJobDag_.28JobDagIterator.29">RuntimeJobDag (JobDagIterator)</h3> <p>This new component serves as an iterator for JobDAGs for the Controller. Previously, task assignment required the Controller to iterate through all jobs and their underlying tasks to determine whether there were any tasks that needed to be assigned and scheduled. This proved to be inefficient and did not scale with the increasing load we were putting on Task Framework. Each RuntimeJobDag records states, that is, it knows what task needs to be offered up to the Controller for scheduling. This saves the redundant computation for the Controller every time it goes through the TaskSchedulingStage of the Task pipeline.</p> - <p><img src="./images/quota_InstanceCapacityManager.jpeg" alt="Architecture" /></p> + <p><img src="./images/quota_InstanceCapacityManager.jpeg" alt="Architecture"></p> </section> </section> <section> @@ -209,10 +222,10 @@ under the License. <h3 id="How_it_works">How it works</h3> <p>Quota-based task scheduling works as follows. If a quota type is set, Task Framework will calculate a ratio against the sum of all quota config numbers for each quota type. Then it will apply that ratio to find the actual resource amount allotted to each quota type. Here is an example to illustrate this: Suppose the quota config is as follows:</p> <div class="source"> - <pre><code class="language-json">"QUOTA_TYPES":{ - "A":"2" - ,"B":"1" - ,"DEFAULT":"1" + <pre><code class="language-json">"QUOTA_TYPES":{ + "A":"2" + ,"B":"1" + ,"DEFAULT":"1" } </code></pre> </div> @@ -259,9 +272,9 @@ under the License. <div class="source"> <pre><code class="language-java">ClusterConfig clusterConfig = _manager.getConfigAccessor().getClusterConfig(CLUSTER_NAME); // Retrieve ClusterConfig clusterConfig.resetTaskQuotaRatioMap(); // Optional: you may want to reset the quota config before creating a new quota config -clusterConfig.setTaskQuotaRatio(DEFAULT_QUOTA_TYPE, 10); // Define the default quota (DEFAULT_QUOTA_TYPE = "DEFAULT") -clusterConfig.setTaskQuotaRatio("A", 20); // Define quota type A -clusterConfig.setTaskQuotaRatio("B", 10); // Define quota type B +clusterConfig.setTaskQuotaRatio(DEFAULT_QUOTA_TYPE, 10); // Define the default quota (DEFAULT_QUOTA_TYPE = "DEFAULT") +clusterConfig.setTaskQuotaRatio("A", 20); // Define quota type A +clusterConfig.setTaskQuotaRatio("B", 10); // Define quota type B _manager.getConfigAccessor().setClusterConfig(CLUSTER_NAME, clusterConfig); // Set the new ClusterConfig </code></pre> </div> @@ -269,17 +282,17 @@ _manager.getConfigAccessor().setClusterC <p>Upon setting the quota config in ClusterConfig, you will see the updated field in your ZooKeeper cluster config ZNode in the JSON format. See an example below:</p> <div class="source"> <pre><code class="language-json">{ - "id":"Example_Cluster" - ,"simpleFields":{ - "allowParticipantAutoJoin":"true" + "id":"Example_Cluster" + ,"simpleFields":{ + "allowParticipantAutoJoin":"true" } - ,"listFields":{ + ,"listFields":{ } - ,"mapFields":{ - "QUOTA_TYPES":{ - "A":"20" - ,"B":"10" - ,"DEFAULT":"10" + ,"mapFields":{ + "QUOTA_TYPES":{ + "A":"20" + ,"B":"10" + ,"DEFAULT":"10" } } } @@ -291,8 +304,8 @@ _manager.getConfigAccessor().setClusterC <div class="source"> <pre><code class="language-java">JobConfig.Builder jobBuilderA = new JobConfig.Builder().setCommand(JOB_COMMAND).setJobCommandConfigMap(_jobCommandMap) - .addTaskConfigs(taskConfigsA).setNumConcurrentTasksPerInstance(50).setJobType("A"); // Setting the job quota type as "A" -workflowBuilder.addJob("JOB_A", jobBuilderA); + .addTaskConfigs(taskConfigsA).setNumConcurrentTasksPerInstance(50).setJobType("A"); // Setting the job quota type as "A" +workflowBuilder.addJob("JOB_A", jobBuilderA); </code></pre> </div> </section> @@ -407,7 +420,7 @@ workflowBuilder.addJob("JOB_A" <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/recipes/lock_manager.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/recipes/lock_manager.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/recipes/lock_manager.html (original) +++ helix/site-content/1.0.2-docs/recipes/lock_manager.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-recipes-lock_manager project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="../" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Distributed Lock Manager</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -171,7 +184,7 @@ under the License. </ul> <p>Helix provides a simple and elegant solution to this problem. Simply specify the number of locks and Helix will ensure that above constraints are satisfied.</p> <p>To quickly see this working run the <code>lock-manager-demo</code> script where 12 locks are evenly distributed among three nodes, and when a node fails, the locks get re-distributed among remaining two nodes. Note that Helix does not re-shuffle the locks completely, instead it simply distributes the locks relinquished by dead node among 2 remaining nodes evenly.</p> - <hr /> + <hr> <section> <h3 id="Short_Version">Short Version</h3> <p>This version starts multiple threads within the same process to simulate a multi node deployment. Try the long version to get a better idea of how it works.</p> @@ -244,7 +257,7 @@ lock-group_9 localhost_12001 </code></pre> </div> - <hr /> + <hr> </section> </section> <section> @@ -284,11 +297,11 @@ lock-group_9 localhost_12001 } public void lock(Message m, NotificationContext context) { - System.out.println(" acquired lock:"+ lockName ); + System.out.println(" acquired lock:"+ lockName ); } public void release(Message m, NotificationContext context) { - System.out.println(" releasing lock:"+ lockName ); + System.out.println(" releasing lock:"+ lockName ); } } @@ -308,15 +321,15 @@ lock-group_9 localhost_12001 <div class="source"> <pre><code>public class LockProcess { public static void main(String args) { - String zkAddress= "localhost:2199"; - String clusterName = "lock-manager-demo"; + String zkAddress= "localhost:2199"; + String clusterName = "lock-manager-demo"; //Give a unique id to each process, most commonly used format hostname_port - String instanceName ="localhost_12000"; + String instanceName ="localhost_12000"; ZKHelixAdmin helixAdmin = new ZKHelixAdmin(zkAddress); //configure the instance and provide some metadata InstanceConfig config = new InstanceConfig(instanceName); - config.setHostName("localhost"); - config.setPort("12000"); + config.setHostName("localhost"); + config.setPort("12000"); admin.addInstance(clusterName, config); //join the cluster HelixManager manager; @@ -324,7 +337,7 @@ lock-group_9 localhost_12001 instanceName, InstanceType.PARTICIPANT, zkAddress); - manager.getStateMachineEngine().registerStateModelFactory("OnlineOffline", modelFactory); + manager.getStateMachineEngine().registerStateModelFactory("OnlineOffline", modelFactory); manager.connect(); Thread.currentThread.join(); } @@ -349,15 +362,15 @@ lock-group_9 localhost_12001 <div class="source"> <pre><code>public class LockProcess { public static void main(String args) { - String zkAddress= "localhost:2199"; - String clusterName = "lock-manager-demo"; + String zkAddress= "localhost:2199"; + String clusterName = "lock-manager-demo"; // . // . manager.connect(); HelixManager controller; controller = HelixControllerMain.startHelixController(zkAddress, clusterName, - "controller", + "controller", HelixControllerMain.STANDALONE); Thread.currentThread.join(); } @@ -437,7 +450,7 @@ lock-group_9 localhost_12001 <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/recipes/rabbitmq_consumer_group.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/recipes/rabbitmq_consumer_group.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/recipes/rabbitmq_consumer_group.html (original) +++ helix/site-content/1.0.2-docs/recipes/rabbitmq_consumer_group.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-recipes-rabbitmq_consumer_group project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="../" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>RabbitMQ Consumer Group</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -266,12 +279,12 @@ admin.addCluster(clusterName, true); // add state model definition StateModelConfigGenerator generator = new StateModelConfigGenerator(); -admin.addStateModelDef(clusterName, "OnlineOffline", +admin.addStateModelDef(clusterName, "OnlineOffline", new StateModelDefinition(generator.generateConfigForOnlineOffline())); -// add resource "topic" which has 6 partitions -String resourceName = "rabbitmq-consumer-group"; -admin.addResource(clusterName, resourceName, 6, "OnlineOffline", "AUTO_REBALANCE"); +// add resource "topic" which has 6 partitions +String resourceName = "rabbitmq-consumer-group"; +admin.addResource(clusterName, resourceName, 6, "OnlineOffline", "AUTO_REBALANCE"); </code></pre> </div> </section> @@ -288,35 +301,35 @@ admin.addResource(clusterName, resourceN StateMachineEngine stateMach = _manager.getStateMachineEngine(); ConsumerStateModelFactory modelFactory = new ConsumerStateModelFactory(_consumerId, _mqServer); -stateMach.registerStateModelFactory("OnlineOffline", modelFactory); +stateMach.registerStateModelFactory("OnlineOffline", modelFactory); _manager.connect(); </code></pre> </div> <p>Once the consumer has registered the state model and the controller is started, the consumer starts getting callbacks (onBecomeOnlineFromOffline) for the partition it needs to host. All it needs to do as part of the callback is to start consuming messages from the appropriate queue. Similarly, when the controller deallocates a partitions from a consumer, it fires onBecomeOfflineFromOnline for the same partition. As a part of this transition, the consumer will stop consuming from a that queue.</p> <div class="source"> - <pre><code>@Transition(to = "ONLINE", from = "OFFLINE") + <pre><code>@Transition(to = "ONLINE", from = "OFFLINE") public void onBecomeOnlineFromOffline(Message message, NotificationContext context) { - LOG.debug(_consumerId + " becomes ONLINE from OFFLINE for " + _partition); + LOG.debug(_consumerId + " becomes ONLINE from OFFLINE for " + _partition); if (_thread == null) { - LOG.debug("Starting ConsumerThread for " + _partition + "..."); + LOG.debug("Starting ConsumerThread for " + _partition + "..."); _thread = new ConsumerThread(_partition, _mqServer, _consumerId); _thread.start(); - LOG.debug("Starting ConsumerThread for " + _partition + " done"); + LOG.debug("Starting ConsumerThread for " + _partition + " done"); } } -@Transition(to = "OFFLINE", from = "ONLINE") +@Transition(to = "OFFLINE", from = "ONLINE") public void onBecomeOfflineFromOnline(Message message, NotificationContext context) throws InterruptedException { - LOG.debug(_consumerId + " becomes OFFLINE from ONLINE for " + _partition); + LOG.debug(_consumerId + " becomes OFFLINE from ONLINE for " + _partition); if (_thread != null) { - LOG.debug("Stopping " + _consumerId + " for " + _partition + "..."); + LOG.debug("Stopping " + _consumerId + " for " + _partition + "..."); _thread.interrupt(); _thread.join(2000); _thread = null; - LOG.debug("Stopping " + _consumerId + " for " + _partition + " done"); + LOG.debug("Stopping " + _consumerId + " for " + _partition + " done"); } } </code></pre> @@ -392,7 +405,7 @@ public void onBecomeOfflineFromOnline(Me <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/recipes/rsync_replicated_file_store.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/recipes/rsync_replicated_file_store.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/recipes/rsync_replicated_file_store.html (original) +++ helix/site-content/1.0.2-docs/recipes/rsync_replicated_file_store.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-recipes-rsync_replicated_file_store project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="../" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Near-Realtime Rsync Replicated File System</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -222,12 +235,12 @@ chmod +x * <section> <h4 id="Failover">Failover</h4> <p>When a master fails, a new slave will be promoted to master. If the previous master node is reachable, then the new master will flush all the changes from previous the master before taking up mastership. The new master will record the end transaction ID of the current generation and then start a new generation with sequence starting from 1. After this the master will begin accepting writes.</p> - <p><img src="../images/PFS-Generic.png" alt="Partitioned File Store" /></p> + <p><img src="../images/PFS-Generic.png" alt="Partitioned File Store"></p> </section> </section> <section> <h3 id="Rsync-based_Solution">Rsync-based Solution</h3> - <p><img src="../images/RSYNC_BASED_PFS.png" alt="Rsync based File Store" /></p> + <p><img src="../images/RSYNC_BASED_PFS.png" alt="Rsync based File Store"></p> <p>This application demonstrates a file store that uses rsync as the replication mechanism. One can envision a similar system where instead of using rsync, one can implement a custom solution to notify the slave of the changes and also provide an api to pull the change files.</p> <section> <h4 id="Concepts">Concepts</h4> @@ -334,7 +347,7 @@ chmod +x * <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/recipes/service_discovery.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/recipes/service_discovery.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/recipes/service_discovery.html (original) +++ helix/site-content/1.0.2-docs/recipes/service_discovery.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-recipes-service_discovery project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="../" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Service Discovery</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -379,7 +392,7 @@ END:Service discovery demo mode:NONE <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/recipes/task_dag_execution.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/recipes/task_dag_execution.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/recipes/task_dag_execution.html (original) +++ helix/site-content/1.0.2-docs/recipes/task_dag_execution.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-recipes-task_dag_execution project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="../" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Distributed Task Execution</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -181,14 +194,14 @@ under the License. <p>Each stage is represented as a Node along with the upstream dependency and desired parallelism. Each stage is modeled as a resource in Helix using OnlineOffline state model. As part of an Offline to Online transition, we watch the external view of upstream resources and wait for them to transition to the online state. See Task.java for additional info.</p> <div class="source"> <pre><code>Dag dag = new Dag(); -dag.addNode(new Node("filterImps", 10, "")); -dag.addNode(new Node("filterClicks", 5, "")); -dag.addNode(new Node("impClickJoin", 10, "filterImps,filterClicks")); -dag.addNode(new Node("impCountsByGender", 10, "filterImps")); -dag.addNode(new Node("impCountsByCountry", 10, "filterImps")); -dag.addNode(new Node("clickCountsByGender", 5, "impClickJoin")); -dag.addNode(new Node("clickCountsByCountry", 5, "impClickJoin")); -dag.addNode(new Node("report",1,"impCountsByGender,impCountsByCountry,clickCountsByGender,clickCountsByCountry")); +dag.addNode(new Node("filterImps", 10, "")); +dag.addNode(new Node("filterClicks", 5, "")); +dag.addNode(new Node("impClickJoin", 10, "filterImps,filterClicks")); +dag.addNode(new Node("impCountsByGender", 10, "filterImps")); +dag.addNode(new Node("impCountsByCountry", 10, "filterImps")); +dag.addNode(new Node("clickCountsByGender", 5, "impClickJoin")); +dag.addNode(new Node("clickCountsByCountry", 5, "impClickJoin")); +dag.addNode(new Node("report",1,"impCountsByGender,impCountsByCountry,clickCountsByGender,clickCountsByCountry")); </code></pre> </div> </section> @@ -389,7 +402,7 @@ Click counts per gender <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a> Modified: helix/site-content/1.0.2-docs/releasenotes/release-1.0.2.html URL: http://svn.apache.org/viewvc/helix/site-content/1.0.2-docs/releasenotes/release-1.0.2.html?rev=1900255&r1=1900254&r2=1900255&view=diff ============================================================================== --- helix/site-content/1.0.2-docs/releasenotes/release-1.0.2.html (original) +++ helix/site-content/1.0.2-docs/releasenotes/release-1.0.2.html Mon Apr 25 08:18:23 2022 @@ -1,7 +1,13 @@ <!DOCTYPE html> + + + + + + <!-- - Generated by Apache Maven Doxia at 2022-04-23 Rendered using Reflow Maven Skin 2.0.0-SNAPSHOT (https://andriusvelykis.github.io/reflow-maven-skin) + Generated by Apache Maven Doxia at 2022-04-25 Rendered using Reflow Maven Skin 2.0.0 (https://olamy.github.io/reflow-maven-skin) --> <html xml:lang="en" lang="en"> @@ -29,24 +35,31 @@ <![endif]--> - <script type="text/javascript"> - - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-3211522-12']); - _gaq.push(['_trackPageview']); - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - </head> + +<!-- Matomo --> +<script> + var _paq = window._paq = window._paq || []; + _paq.push(['disableCookies']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + + (function() { + var u="https://analytics.apache.org"; + _paq.push(['setTrackerUrl', u+'/matomo.php']); + _paq.push(['setSiteId', '15']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s); + })(); +</script> +<!-- End Matomo Code --> + </head> <body class="page-releasenotes-release-102 project-102-docs" data-spy="scroll" data-offset="60" data-target="#toc-scroll-target"> + <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> @@ -119,7 +132,7 @@ <li><a href="../" title="Release 1.0.2">Release 1.0.2</a></li> <li class="divider">/</li> <li>Release Notes for Apache Helix 1.0.2</li> - <li class="publishDate version-date pull-right">Last Published: 2022-04-23</li> + <li class="publishDate version-date pull-right">Last Published: 2022-04-25</li> </ul> </div> </header> @@ -257,7 +270,7 @@ <div class="span12"> <p class="pull-right"><a href="#">Back to top</a></p> <p class="copyright">Copyright ©2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</p> - <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> by <a href="https://andrius.velykis.lt" target="_blank" title="Andrius Velykis">Andrius Velykis</a>.</p> + <p><a href="https://github.com/olamy/reflow-maven-skin" title="Reflow Maven skin">Reflow Maven skin</a> maintained by <a href="https://twitter.com/olamy" target="_blank" title="Olivier Lamy">Olivier Lamy</a>.</p> <div class="row span16"><div>Apache Helix, Apache, the Apache feather logo, and the Apache Helix project logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div> <a href="https://helix.apache.org/1.0.2-docs/privacy-policy.html">Privacy Policy</a>
