"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7542],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>d});var r=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=r.createContext({}),u=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},l=function(e){var t=u(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=u(n),g=i,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return n?r.createElement(d,a(a({ref:t},l),{},{components:n})):r.createElement(d,a({ref:t},l))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=g;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:i,a[1]=s;for(var u=2;u<o;u++)a[u]=n[u];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},86905:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>u,toc:()=>p});var r=n(87462),i=n(63366),o=(n(67294),n(3905)),a=["components"],s={id:"streaming",title:"Streaming ingestion"},c=void 0,u={unversionedId:"ingestion/streaming",id:"ingestion/streaming",title:"Streaming ingestion",description:"\x3c!--",source:"@site/docs/29.0.1/ingestion/streaming.md",sourceDirName:"ingestion",slug:"/ingestion/streaming",permalink:"/docs/29.0.1/ingestion/streaming",draft:!1,tags:[],version:"current",frontMatter:{id:"streaming",title:"Streaming ingestion"},sidebar:"docs",previous:{title:"Known issues",permalink:"/docs/29.0.1/multi-stage-query/known-issues"},next:{title:"Supervisor",permalink:"/docs/29.0.1/ingestion/supervisor"}},l={},p=[],m={toc:p},g="wrapper";function d(e){var t=e.components,n=(0,i.Z)(e,a);return(0,o.kt)(g,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Apache Druid can consume data streams from the following external streaming sources:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Apache Kafka through the bundled ",(0,o.kt)("a",{parentName:"li",href:"/docs/29.0.1/ingestion/kafka-ingestion"},"Kafka indexing service")," extension."),(0,o.kt)("li",{parentName:"ul"},"Amazon Kinesis through the bundled ",(0,o.kt)("a",{parentName:"li",href:"/docs/29.0.1/ingestion/kinesis-ingestion"},"Kinesis indexing service")," extension.")),(0,o.kt)("p",null,"Each indexing service provides real-time data ingestion with exactly-once stream processing guarantee.\nTo use either of the streaming ingestion methods, you must first load the associated extension on both the Overlord and the MiddleManager. See ",(0,o.kt)("a",{parentName:"p",href:"/docs/29.0.1/configuration/extensions#loading-extensions"},"Loading extensions")," for more information."),(0,o.kt)("p",null,"Streaming ingestion is controlled by a continuously running ",(0,o.kt)("a",{parentName:"p",href:"/docs/29.0.1/ingestion/supervisor"},"supervisor"),".\nThe supervisor oversees the state of indexing tasks to coordinate handoffs, manage failures, and ensure that scalability and replication requirements are maintained.\nYou start a supervisor by submitting a JSON specification, often referred to as the supervisor spec, either though the Druid web console or using the ",(0,o.kt)("a",{parentName:"p",href:"/docs/29.0.1/api-reference/supervisor-api"},"Supervisor API"),"."))}d.isMDXComponent=!0}}]);