"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5723],{3905:(t,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>f});var r=n(67294);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},u=function(t){var e=s(t.components);return r.createElement(p.Provider,{value:e},t.children)},d="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,u=l(t,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(p,".").concat(m)]||d[m]||c[m]||o;return n?r.createElement(f,i(i({ref:e},u),{},{components:n})):r.createElement(f,i({ref:e},u))}));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[d]="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"},43923:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>p,default:()=>f,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var r=n(87462),a=n(63366),o=(n(67294),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/29.0.1/development/extensions-contrib/thrift.md",sourceDirName:"development/extensions-contrib",slug:"/development/extensions-contrib/thrift",permalink:"/docs/29.0.1/development/extensions-contrib/thrift",draft:!1,tags:[],version:"current",frontMatter:{id:"thrift",title:"Thrift"}},u={},d=[{value:"LZO Support",id:"lzo-support",level:2},{value:"Thrift Parser",id:"thrift-parser",level:2}],c={toc:d},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/29.0.1/configuration/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}}]);