"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[49],{3905:(t,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>f});var r=n(7294);function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?o(Object(n),!0).forEach((function(e){a(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function l(t,e){if(null==t)return{};var n,r,a=function(t,e){if(null==t)return{};var n,r,a={},o=Object.keys(t);for(r=0;r<o.length;r++)n=o[r],e.indexOf(n)>=0||(a[n]=t[n]);return a}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(r=0;r<o.length;r++)n=o[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(a[n]=t[n])}return a}var p=r.createContext({}),s=function(t){var e=r.useContext(p),n=e;return t&&(n="function"==typeof t?t(e):i(i({},e),t)),n},d=function(t){var e=s(t.components);return r.createElement(p.Provider,{value:e},t.children)},u="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var n=t.components,a=t.mdxType,o=t.originalType,p=t.parentName,d=l(t,["components","mdxType","originalType","parentName"]),u=s(n),m=a,f=u["".concat(p,".").concat(m)]||u[m]||c[m]||o;return n?r.createElement(f,i(i({ref:e},d),{},{components:n})):r.createElement(f,i({ref:e},d))}));function f(t,e){var n=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var p in e)hasOwnProperty.call(e,p)&&(l[p]=e[p]);l.originalType=t,l[u]="string"==typeof t?t:a,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},9906:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>p,default:()=>f,frontMatter:()=>l,metadata:()=>s,toc:()=>u});var r=n(7462),a=n(3366),o=(n(7294),n(3905)),i=["components"],l={id:"thrift",title:"Thrift"},p=void 0,s={unversionedId:"development/extensions-contrib/thrift",id:"development/extensions-contrib/thrift",title:"Thrift",description:"\x3c!--",source:"@site/docs/26.0.0/development/extensions-contrib/thrift.md",sourceDirName:"development/extensions-contrib",slug:"/development/extensions-contrib/thrift",permalink:"/docs/26.0.0/development/extensions-contrib/thrift",draft:!1,tags:[],version:"current",frontMatter:{id:"thrift",title:"Thrift"}},d={},u=[{value:"LZO Support",id:"lzo-support",level:2},{value:"Thrift Parser",id:"thrift-parser",level:2}],c={toc:u},m="wrapper";function f(t){var e=t.components,n=(0,a.Z)(t,i);return(0,o.kt)(m,(0,r.Z)({},c,n,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"To use this Apache Druid extension, ",(0,o.kt)("a",{parentName:"p",href:"/docs/26.0.0/development/extensions#loading-extensions"},"include")," ",(0,o.kt)("inlineCode",{parentName:"p"},"druid-thrift-extensions")," in the extensions load list."),(0,o.kt)("p",null,"This extension enables Druid to ingest thrift compact data online (",(0,o.kt)("inlineCode",{parentName:"p"},"ByteBuffer"),") and offline (SequenceFile of type ",(0,o.kt)("inlineCode",{parentName:"p"},"<Writable, BytesWritable>")," or LzoThriftBlock File)."),(0,o.kt)("p",null,"You may want to use another version of thrift, change the dependency in pom and compile yourself."),(0,o.kt)("h2",{id:"lzo-support"},"LZO Support"),(0,o.kt)("p",null,"If you plan to read LZO-compressed Thrift files, you will need to download version 0.4.19 of the ",(0,o.kt)("a",{parentName:"p",href:"https://mvnrepository.com/artifact/com.hadoop.gplcompression/hadoop-lzo/0.4.19"},"hadoop-lzo JAR")," and place it in your ",(0,o.kt)("inlineCode",{parentName:"p"},"extensions/druid-thrift-extensions")," directory."),(0,o.kt)("h2",{id:"thrift-parser"},"Thrift Parser"),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Field"),(0,o.kt)("th",{parentName:"tr",align:null},"Type"),(0,o.kt)("th",{parentName:"tr",align:null},"Description"),(0,o.kt)("th",{parentName:"tr",align:null},"Required"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"type"),(0,o.kt)("td",{parentName:"tr",align:null},"String"),(0,o.kt)("td",{parentName:"tr",align:null},"This should say ",(0,o.kt)("inlineCode",{parentName:"td"},"thrift")),(0,o.kt)("td",{parentName:"tr",align:null},"yes")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"parseSpec"),(0,o.kt)("td",{parentName:"tr",align:null},"JSON Object"),(0,o.kt)("td",{parentName:"tr",align:null},"Specifies the timestamp and dimensions of the data. Should be a JSON parseSpec."),(0,o.kt)("td",{parentName:"tr",align:null},"yes")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"thriftJar"),(0,o.kt)("td",{parentName:"tr",align:null},"String"),(0,o.kt)("td",{parentName:"tr",align:null},"path of thrift jar, if not provided, it will try to find the thrift class in classpath. Thrift jar in batch ingestion should be uploaded to HDFS first and configure ",(0,o.kt)("inlineCode",{parentName:"td"},"jobProperties")," with ",(0,o.kt)("inlineCode",{parentName:"td"},'"tmpjars":"/path/to/your/thrift.jar"')),(0,o.kt)("td",{parentName:"tr",align:null},"no")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"thriftClass"),(0,o.kt)("td",{parentName:"tr",align:null},"String"),(0,o.kt)("td",{parentName:"tr",align:null},"classname of thrift"),(0,o.kt)("td",{parentName:"tr",align:null},"yes")))),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Batch Ingestion example - ",(0,o.kt)("inlineCode",{parentName:"li"},"inputFormat")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"tmpjars")," should be set.")),(0,o.kt)("p",null,"This is for batch ingestion using the HadoopDruidIndexer. The inputFormat of inputSpec in ioConfig could be one of ",(0,o.kt)("inlineCode",{parentName:"p"},'"org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat"')," and ",(0,o.kt)("inlineCode",{parentName:"p"},"com.twitter.elephantbird.mapreduce.input.LzoThriftBlockInputFormat"),". Be careful, when ",(0,o.kt)("inlineCode",{parentName:"p"},"LzoThriftBlockInputFormat")," is used, thrift class must be provided twice."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'{\n  "type": "index_hadoop",\n  "spec": {\n    "dataSchema": {\n      "dataSource": "book",\n      "parser": {\n        "type": "thrift",\n        "jarPath": "book.jar",\n        "thriftClass": "org.apache.druid.data.input.thrift.Book",\n        "protocol": "compact",\n        "parseSpec": {\n          "format": "json",\n          ...\n        }\n      },\n      "metricsSpec": [],\n      "granularitySpec": {}\n    },\n    "ioConfig": {\n      "type": "hadoop",\n      "inputSpec": {\n        "type": "static",\n        "inputFormat": "org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat",\n        // "inputFormat": "com.twitter.elephantbird.mapreduce.input.LzoThriftBlockInputFormat",\n        "paths": "/user/to/some/book.seq"\n      }\n    },\n    "tuningConfig": {\n      "type": "hadoop",\n      "jobProperties": {\n        "tmpjars":"/user/h_user_profile/du00/druid/test/book.jar",\n        // "elephantbird.class.for.MultiInputFormat" : "${YOUR_THRIFT_CLASS_NAME}"\n      }\n    }\n  }\n}\n')))}f.isMDXComponent=!0}}]);