"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[6903],{15680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>y});var r=a(96540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)a=i[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),u=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(a),g=n,y=p["".concat(l,".").concat(g)]||p[g]||d[g]||i;return a?r.createElement(y,o(o({ref:t},c),{},{components:a})):r.createElement(y,o({ref:t},c))}));function y(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:n,o[1]=s;for(var u=2;u<i;u++)o[u]=a[u];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}g.displayName="MDXCreateElement"},97532:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var r=a(58168),n=(a(96540),a(15680));const i={title:"Introduction",hide_title:!0,sidebar_position:1},o=void 0,s={unversionedId:"intro",id:"intro",title:"Introduction",description:"What is Apache Superset?",source:"@site/docs/intro.mdx",sourceDirName:".",slug:"/intro",permalink:"/docs/intro",draft:!1,editUrl:"https://github.com/apache/superset/edit/master/docs/docs/intro.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Introduction",hide_title:!0,sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Quickstart",permalink:"/docs/quickstart"}},l={},u=[{value:"What is Apache Superset?",id:"what-is-apache-superset",level:2},{value:"Video Overview",id:"video-overview",level:4},{value:"Features",id:"features",level:4},{value:"Backend Technology",id:"backend-technology",level:4}],c={toc:u},p="wrapper";function d(e){let{components:t,...a}=e;return(0,n.yg)(p,(0,r.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"what-is-apache-superset"},"What is Apache Superset?"),(0,n.yg)("p",null,"Apache Superset is a modern, enterprise-ready business intelligence web application. It\nis fast, lightweight, intuitive, and loaded with options that make it easy for users of all skill\nsets to explore and visualize their data, from simple pie charts to highly detailed deck.gl\ngeospatial charts."),(0,n.yg)("p",null,"Here are a ",(0,n.yg)("strong",{parentName:"p"},"few different ways you can get started with Superset"),":"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"Try a ",(0,n.yg)("a",{parentName:"li",href:"/docs/quickstart"},"Quickstart deployment"),", powered by ",(0,n.yg)("a",{parentName:"li",href:"https://docs.docker.com/compose/"},"Docker Compose")),(0,n.yg)("li",{parentName:"ul"},"Install Superset ",(0,n.yg)("a",{parentName:"li",href:"/docs/installation/installing-superset-from-pypi/"},"from PyPI")),(0,n.yg)("li",{parentName:"ul"},"Deploy Superset ",(0,n.yg)("a",{parentName:"li",href:"/docs/installation/running-on-kubernetes"},"with Kubernetes")),(0,n.yg)("li",{parentName:"ul"},"Download the ",(0,n.yg)("a",{parentName:"li",href:"https://dist.apache.org/repos/dist/release/superset/"},"source code from Apache Foundation's website"))),(0,n.yg)("h4",{id:"video-overview"},"Video Overview"),(0,n.yg)("p",null,(0,n.yg)("a",{parentName:"p",href:"https://user-images.githubusercontent.com/64562059/234390129-321d4f35-cb4b-45e8-89d9-20ae292f34fc.mp4"},"https://user-images.githubusercontent.com/64562059/234390129-321d4f35-cb4b-45e8-89d9-20ae292f34fc.mp4")),(0,n.yg)("h4",{id:"features"},"Features"),(0,n.yg)("p",null,"Superset provides:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"An intuitive interface for visualizing datasets and crafting interactive dashboards"),(0,n.yg)("li",{parentName:"ul"},"A wide array of beautiful visualizations to showcase your data"),(0,n.yg)("li",{parentName:"ul"},"Code-free visualization builder to extract and present datasets"),(0,n.yg)("li",{parentName:"ul"},"A world-class SQL IDE for preparing data for visualization, including a rich metadata browser"),(0,n.yg)("li",{parentName:"ul"},"A lightweight semantic layer which empowers data analysts to quickly define custom dimensions and metrics"),(0,n.yg)("li",{parentName:"ul"},"Out-of-the-box support for ",(0,n.yg)("a",{parentName:"li",href:"/docs/databases/installing-database-drivers/"},"most SQL-speaking databases")),(0,n.yg)("li",{parentName:"ul"},"Seamless, in-memory asynchronous caching and queries"),(0,n.yg)("li",{parentName:"ul"},"An extensible security model that allows configuration of very intricate rules on who can access which product features and datasets."),(0,n.yg)("li",{parentName:"ul"},"Integration with major authentication backends (database, OpenID, LDAP, OAuth, REMOTE_USER, etc)"),(0,n.yg)("li",{parentName:"ul"},"The ability to add custom visualization plugins"),(0,n.yg)("li",{parentName:"ul"},"An API for programmatic customization"),(0,n.yg)("li",{parentName:"ul"},"A cloud-native architecture designed from the ground up for scale")),(0,n.yg)("h4",{id:"backend-technology"},"Backend Technology"),(0,n.yg)("p",null,"Superset is cloud-native and designed to be highly available. It was designed to scale out to large,\ndistributed environments and works very well inside containers. While you can easily test drive\nSuperset on a modest setup or simply on your laptop, there\u2019s virtually no limit around scaling out\nthe platform."),(0,n.yg)("p",null,"Superset is also cloud-native in the sense that it is flexible and lets you choose the:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"Web server (Gunicorn, Nginx, Apache),"),(0,n.yg)("li",{parentName:"ul"},"Metadata database engine (PostgreSQL, MySQL, MariaDB),"),(0,n.yg)("li",{parentName:"ul"},"Message queue (Celery, Redis, RabbitMQ, SQS, etc.),"),(0,n.yg)("li",{parentName:"ul"},"Results backend (Redis, S3, Memcached, etc.),"),(0,n.yg)("li",{parentName:"ul"},"Caching layer (Redis, Memcached, etc.)")),(0,n.yg)("p",null,"Superset also works well with ",(0,n.yg)("a",{parentName:"p",href:"/docs/installation/event-logging/"},"event-logging"),"\nservices like StatsD, NewRelic, and DataDog."),(0,n.yg)("p",null,"Superset is currently run at scale at many companies. For example, Superset is run in Airbnb\u2019s\nproduction environment inside Kubernetes and serves 600+ daily active users viewing over 100K charts\na day."),(0,n.yg)("p",null,"You can find a partial list of industries and companies embracing Superset\n",(0,n.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/blob/master/RESOURCES/INTHEWILD.md"},"on this page in GitHub"),"."))}d.isMDXComponent=!0}}]);