"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5251],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(67294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var u=n.createContext({}),l=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=l(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,u=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=l(r),g=i,f=c["".concat(u,".").concat(g)]||c[g]||p[g]||a;return r?n.createElement(f,o(o({ref:t},d),{},{components:r})):n.createElement(f,o({ref:t},d))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=g;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[c]="string"==typeof e?e:i,o[1]=s;for(var l=2;l<a;l++)o[l]=r[l];return n.createElement.apply(null,o)}return n.createElement.apply(null,r)}g.displayName="MDXCreateElement"},85263:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>f,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var n=r(87462),i=r(63366),a=(r(67294),r(3905)),o=["components"],s={id:"getting-started",title:"Getting started with Apache Druid"},u=void 0,l={unversionedId:"operations/getting-started",id:"operations/getting-started",title:"Getting started with Apache Druid",description:"\x3c!--",source:"@site/docs/27.0.0/operations/getting-started.md",sourceDirName:"operations",slug:"/operations/getting-started",permalink:"/docs/27.0.0/operations/getting-started",draft:!1,tags:[],version:"current",frontMatter:{id:"getting-started",title:"Getting started with Apache Druid"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Single-server Quickstart and Tutorials",id:"single-server-quickstart-and-tutorials",level:2},{value:"Deploying a Druid cluster",id:"deploying-a-druid-cluster",level:2},{value:"Operating Druid",id:"operating-druid",level:2},{value:"Need help with Druid?",id:"need-help-with-druid",level:2}],p={toc:c},g="wrapper";function f(e){var t=e.components,r=(0,i.Z)(e,o);return(0,a.kt)(g,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"overview"},"Overview"),(0,a.kt)("p",null,"If you are new to Druid, we recommend reading the ",(0,a.kt)("a",{parentName:"p",href:"/docs/27.0.0/design/"},"Design Overview")," and the ",(0,a.kt)("a",{parentName:"p",href:"/docs/27.0.0/ingestion/"},"Ingestion Overview")," first for a basic understanding of Druid."),(0,a.kt)("h2",{id:"single-server-quickstart-and-tutorials"},"Single-server Quickstart and Tutorials"),(0,a.kt)("p",null,"To get started with running Druid, the simplest and quickest way is to try the ",(0,a.kt)("a",{parentName:"p",href:"/docs/27.0.0/tutorials/"},"single-server quickstart and tutorials"),"."),(0,a.kt)("h2",{id:"deploying-a-druid-cluster"},"Deploying a Druid cluster"),(0,a.kt)("p",null,"If you wish to jump straight to deploying Druid as a cluster, or if you have an existing single-server deployment that you wish to migrate to a clustered deployment, please see the ",(0,a.kt)("a",{parentName:"p",href:"/docs/27.0.0/tutorials/cluster"},"Clustered Deployment Guide"),"."),(0,a.kt)("h2",{id:"operating-druid"},"Operating Druid"),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"/docs/27.0.0/configuration/"},"configuration reference")," describes all of Druid's configuration properties."),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"/docs/27.0.0/api-reference/"},"API reference")," describes the APIs available on each Druid process."),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"/docs/27.0.0/operations/basic-cluster-tuning"},"basic cluster tuning guide")," is an introductory guide for tuning your Druid cluster."),(0,a.kt)("h2",{id:"need-help-with-druid"},"Need help with Druid?"),(0,a.kt)("p",null,"If you have questions about using Druid, please reach out to the ",(0,a.kt)("a",{parentName:"p",href:"https://druid.apache.org/community/"},"Druid user mailing list or other community channels"),"!"))}f.isMDXComponent=!0}}]);