"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6539],{15680:(e,n,t)=>{t.d(n,{xA:()=>u,yg:()=>f});var r=t(96540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach((function(n){o(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function s(e,n){if(null==e)return{};var t,r,o=function(e,n){if(null==e)return{};var t,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=r.createContext({}),c=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=c(e.components);return r.createElement(l.Provider,{value:n},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},g=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(t),g=o,f=p["".concat(l,".").concat(g)]||p[g]||d[g]||a;return t?r.createElement(f,i(i({ref:n},u),{},{components:t})):r.createElement(f,i({ref:n},u))}));function f(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var c=2;c<a;c++)i[c]=t[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,t)}g.displayName="MDXCreateElement"},3800:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>f,frontMatter:()=>s,metadata:()=>c,toc:()=>p});var r=t(58168),o=t(98587),a=(t(96540),t(15680)),i=["components"],s={id:"peons",title:"Peon service",sidebar_label:"Peon"},l=void 0,c={unversionedId:"design/peons",id:"design/peons",title:"Peon service",description:"\x3c!--",source:"@site/docs/latest/design/peons.md",sourceDirName:"design",slug:"/design/peons",permalink:"/docs/latest/design/peons",draft:!1,tags:[],version:"current",frontMatter:{id:"peons",title:"Peon service",sidebar_label:"Peon"},sidebar:"docs",previous:{title:"MiddleManager",permalink:"/docs/latest/design/middlemanager"},next:{title:"Indexer",permalink:"/docs/latest/design/indexer"}},u={},p=[{value:"Configuration",id:"configuration",level:2},{value:"HTTP endpoints",id:"http-endpoints",level:2},{value:"Running",id:"running",level:2}],d={toc:p},g="wrapper";function f(e){var n=e.components,t=(0,o.A)(e,i);return(0,a.yg)(g,(0,r.A)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"The Peon service is a task execution engine spawned by the MiddleManager. Each Peon runs a separate JVM and is responsible for executing a single task. Peons always run on the same host as the MiddleManager that spawned them."),(0,a.yg)("h2",{id:"configuration"},"Configuration"),(0,a.yg)("p",null,"For Apache Druid Peon configuration, see ",(0,a.yg)("a",{parentName:"p",href:"/docs/latest/configuration/#peon-query-configuration"},"Peon Query Configuration")," and ",(0,a.yg)("a",{parentName:"p",href:"/docs/latest/configuration/#additional-peon-configuration"},"Additional Peon Configuration"),"."),(0,a.yg)("p",null,"For basic tuning guidance for MiddleManager tasks, see ",(0,a.yg)("a",{parentName:"p",href:"/docs/latest/operations/basic-cluster-tuning#task-configurations"},"Basic cluster tuning"),"."),(0,a.yg)("h2",{id:"http-endpoints"},"HTTP endpoints"),(0,a.yg)("p",null,"Peons run a single task in a single JVM. The MiddleManager is responsible for creating Peons for running tasks.\nPeons should rarely run on their own."),(0,a.yg)("h2",{id:"running"},"Running"),(0,a.yg)("p",null,"The Peon should seldom run separately from the MiddleManager, except for development purposes."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"org.apache.druid.cli.Main internal peon <task_file> <status_file>\n")),(0,a.yg)("p",null,"The task file contains the task JSON object.\nThe status file indicates where the task status will be output."))}f.isMDXComponent=!0}}]);