***************************************************** Summary ------- Generated at: 2015-04-21T09:17:08-07:00 Notes: 3 Binaries: 40 Archives: 1 Standards: 232 Apache Licensed: 98 Generated Documents: 0 JavaDocs are generated and so license header is optional Generated files do not required license headers 133 Unknown Licenses ******************************* Unapproved licenses: bin/check-env.sh bin/find-hive-dependency.sh bin/health-check.sh bin/kylin.sh bin/sample.sh bin/setenv.sh conf/kylin.properties conf/kylin_job_conf.xml docs/Installation/Hadoop Environment.md docs/Installation/How to generate install binaries.md docs/Installation/Installation.md docs/Installation/Multiple Kylin REST servers.md docs/Installation/Off Hadoop CLI Installation.md docs/Installation/On Hadoop CLI installation.md docs/Installation/On Hadoop Kylin installation using Docker.md docs/JobEngine/Design.md docs/MISC/FAQ on Kylin Installation and Usage.md docs/MISC/How to Contribute.md docs/MISC/Kylin Document Conventions.md docs/Operations/Advanced settings of Kylin environment.md docs/Operations/Export Kylin HBase data.md docs/Operations/Kylin Metadata Store.md docs/REST/Build Cube with Restful API.md docs/REST/How to consume Kylin REST API in javascript.md docs/REST/Kylin Restful API List.md docs/TechInside/Kylin 0.7 Lambda Architecture.md docs/TechInside/New meta data model structure.md docs/Test/Run Kylin test case with HBase Mini Cluster.md docs/Tutorial/How to use kylin remote jdbc driver.md docs/Tutorial/Kylin and Excel Tutorial.md docs/Tutorial/Kylin and Tableau Tutorial.md docs/Tutorial/Kylin Cube Build and Job Monitoring Tutorial.md docs/Tutorial/Kylin Cube Creation Tutorial.md docs/Tutorial/Kylin Cube Permission Grant Tutorial.md docs/Tutorial/Kylin ODBC Driver Tutorial.md docs/Tutorial/Kylin Web Tutorial.md docs/Tutorial/Quick play with a sample cube.md docs/website/_config-prod.yml docs/website/_config.yml docs/website/_includes/head.cn.html docs/website/_includes/head.html docs/website/_includes/header.cn.html docs/website/_includes/header.html docs/website/_layouts/default-cn.html docs/website/_layouts/default.html docs/website/_layouts/page.html docs/website/_layouts/post.html docs/website/_posts/2015-01-25-introduce-data-model.md docs/website/_sass/_base.scss docs/website/_sass/_layout.scss docs/website/_sass/_syntax-highlighting.scss docs/website/about/index.md docs/website/assets/css/font-awesome.min.css docs/website/assets/css/styles.css docs/website/assets/fonts/fontawesome-webfont.svg docs/website/assets/fonts/helveticaneue-webfont.css docs/website/assets/fonts/helveticaneue-webfont.svg docs/website/assets/fonts/helveticaneue_lt.css docs/website/assets/fonts/helveticaneue_lt.svg docs/website/assets/fonts/opensans-light-webfont.svg docs/website/assets/fonts/opensans-regular-webfont.svg docs/website/assets/js/bootstrap.min.js docs/website/assets/js/jquery-1.9.1.min.js docs/website/assets/js/main.js docs/website/BingSiteAuth.xml docs/website/blog/index.html docs/website/CNAME docs/website/community/index.html docs/website/css/main.scss docs/website/docs/index.html docs/website/docs/installation-content.html docs/website/docs/intro-content.html docs/website/download/index.md docs/website/feed.xml docs/website/google0f781a4ad9402c21.html docs/website/index.cn.md docs/website/index.md docs/website/README.md examples/ReleaseNotes.md examples/sample_cube/create_sample_tables.sql examples/test_case_data/localmeta/kylin.properties examples/test_case_data/localmeta/kylin_job_conf.xml examples/test_case_data/localmeta_v1/kylin.properties examples/test_case_data/minicluster/b-kylin/kylin.properties examples/test_case_data/minicluster/b-kylin/meta/kylin.properties examples/test_case_data/minicluster/kylin.properties examples/test_case_data/minicluster/kylin_job_conf.lzo_disabled.xml examples/test_case_data/minicluster/kylin_job_conf.lzo_enabled.xml examples/test_case_data/minicluster/kylin_job_conf.xml examples/test_case_data/sandbox/capacity-scheduler.xml examples/test_case_data/sandbox/core-site.xml examples/test_case_data/sandbox/hadoop-policy.xml examples/test_case_data/sandbox/hbase-policy.xml examples/test_case_data/sandbox/hbase-site.xml examples/test_case_data/sandbox/hdfs-site.xml examples/test_case_data/sandbox/hive-site.xml examples/test_case_data/sandbox/kylin.properties examples/test_case_data/sandbox/kylin_job_conf.xml examples/test_case_data/sandbox/mapred-site.xml examples/test_case_data/sandbox/yarn-site.xml examples/test_case_data/sandbox-hdp21/core-site.xml examples/test_case_data/sandbox-hdp21/hbase-site.xml examples/test_case_data/sandbox-hdp21/hdfs-site.xml examples/test_case_data/sandbox-hdp21/hive-site.xml examples/test_case_data/sandbox-hdp21/kylin.properties examples/test_case_data/sandbox-hdp21/kylin_job_conf.lzo_disabled.xml examples/test_case_data/sandbox-hdp21/kylin_job_conf.lzo_enabled.xml examples/test_case_data/sandbox-hdp21/kylin_job_conf.xml examples/test_case_data/sandbox-hdp21/mapred-site.xml examples/test_case_data/sandbox-hdp21/yarn-site.xml README.md script/build.sh script/compress.sh script/download-tomcat.sh script/package.sh script/prepare.sh webapp/.bowerrc webapp/.editorconfig webapp/.jshintrc webapp/app/css/AdminLTE-fonts.css webapp/app/css/AdminLTE.css webapp/app/htaccess.dist webapp/app/less/animation.less webapp/app/less/app.less webapp/app/less/build.less webapp/app/less/component.less webapp/app/less/home.less webapp/app/less/layout.less webapp/app/less/navbar.less webapp/Gruntfile.js webapp/README.md webapp/template/nginx_default.conf webapp/validate-commit-msg.js ******************************* Archives: + examples/test_case_data/minicluster/hbase-export.tar.gz ***************************************************** Files with Apache License headers will be marked AL Binary files (which do not require AL headers) will be marked B Compressed archives will be marked A Notices, licenses etc will be marked N !????? bin/check-env.sh !????? bin/find-hive-dependency.sh !????? bin/health-check.sh !????? bin/kylin.sh !????? bin/sample.sh !????? bin/setenv.sh !????? conf/kylin.properties !????? conf/kylin_job_conf.xml AL deploy/server.xml N DISCLAIMER !????? docs/Installation/Hadoop Environment.md !????? docs/Installation/How to generate install binaries.md !????? docs/Installation/Installation.md !????? docs/Installation/Multiple Kylin REST servers.md !????? docs/Installation/Off Hadoop CLI Installation.md B docs/Installation/off_cli_install_scene.png !????? docs/Installation/On Hadoop CLI installation.md !????? docs/Installation/On Hadoop Kylin installation using Docker.md B docs/Installation/on_cli_install_scene.png B docs/JobEngine/Class_Diagram.png !????? docs/JobEngine/Design.md !????? docs/MISC/FAQ on Kylin Installation and Usage.md !????? docs/MISC/How to Contribute.md !????? docs/MISC/Kylin Document Conventions.md !????? docs/Operations/Advanced settings of Kylin environment.md !????? docs/Operations/Export Kylin HBase data.md !????? docs/Operations/Kylin Metadata Store.md !????? docs/REST/Build Cube with Restful API.md !????? docs/REST/How to consume Kylin REST API in javascript.md !????? docs/REST/Kylin Restful API List.md !????? docs/TechInside/Kylin 0.7 Lambda Architecture.md B docs/TechInside/Kylin_0.7_Lambda_Architecture.png !????? docs/TechInside/New meta data model structure.md !????? docs/Test/Run Kylin test case with HBase Mini Cluster.md !????? docs/Tutorial/How to use kylin remote jdbc driver.md !????? docs/Tutorial/Kylin and Excel Tutorial.md !????? docs/Tutorial/Kylin and Tableau Tutorial.md !????? docs/Tutorial/Kylin Cube Build and Job Monitoring Tutorial.md !????? docs/Tutorial/Kylin Cube Creation Tutorial.md !????? docs/Tutorial/Kylin Cube Permission Grant Tutorial.md !????? docs/Tutorial/Kylin ODBC Driver Tutorial.md !????? docs/Tutorial/Kylin Web Tutorial.md !????? docs/Tutorial/Quick play with a sample cube.md !????? docs/website/_config-prod.yml !????? docs/website/_config.yml AL docs/website/_includes/footer.html !????? docs/website/_includes/head.cn.html !????? docs/website/_includes/head.html !????? docs/website/_includes/header.cn.html !????? docs/website/_includes/header.html !????? docs/website/_layouts/default-cn.html !????? docs/website/_layouts/default.html !????? docs/website/_layouts/page.html !????? docs/website/_layouts/post.html !????? docs/website/_posts/2015-01-25-introduce-data-model.md !????? docs/website/_sass/_base.scss !????? docs/website/_sass/_layout.scss !????? docs/website/_sass/_syntax-highlighting.scss !????? docs/website/about/index.md MIT docs/website/assets/css/animate.css AL docs/website/assets/css/bootstrap.min.css !????? docs/website/assets/css/font-awesome.min.css !????? docs/website/assets/css/styles.css B docs/website/assets/fonts/fontawesome-webfont.eot !????? docs/website/assets/fonts/fontawesome-webfont.svg B docs/website/assets/fonts/fontawesome-webfont.ttf B docs/website/assets/fonts/fontawesome-webfont.woff B docs/website/assets/fonts/FontAwesome.otf !????? docs/website/assets/fonts/helveticaneue-webfont.css B docs/website/assets/fonts/helveticaneue-webfont.eot !????? docs/website/assets/fonts/helveticaneue-webfont.svg B docs/website/assets/fonts/helveticaneue-webfont.ttf B docs/website/assets/fonts/helveticaneue-webfont.woff !????? docs/website/assets/fonts/helveticaneue_lt.css B docs/website/assets/fonts/helveticaneue_lt.eot !????? docs/website/assets/fonts/helveticaneue_lt.svg B docs/website/assets/fonts/helveticaneue_lt.ttf B docs/website/assets/fonts/helveticaneue_lt.woff B docs/website/assets/fonts/opensans-light-webfont.eot !????? docs/website/assets/fonts/opensans-light-webfont.svg B docs/website/assets/fonts/opensans-light-webfont.ttf B docs/website/assets/fonts/opensans-light-webfont.woff B docs/website/assets/fonts/opensans-regular-webfont.eot !????? docs/website/assets/fonts/opensans-regular-webfont.svg B docs/website/assets/fonts/opensans-regular-webfont.ttf B docs/website/assets/fonts/opensans-regular-webfont.woff B docs/website/assets/images/core.png B docs/website/assets/images/data.png B docs/website/assets/images/kylin_diagram.png B docs/website/assets/images/kylin_logo.jpg !????? docs/website/assets/js/bootstrap.min.js !????? docs/website/assets/js/jquery-1.9.1.min.js !????? docs/website/assets/js/main.js !????? docs/website/BingSiteAuth.xml !????? docs/website/blog/index.html !????? docs/website/CNAME !????? docs/website/community/index.html !????? docs/website/css/main.scss !????? docs/website/docs/index.html !????? docs/website/docs/installation-content.html !????? docs/website/docs/intro-content.html !????? docs/website/download/index.md B docs/website/fav.png B docs/website/favicon.ico !????? docs/website/feed.xml !????? docs/website/google0f781a4ad9402c21.html !????? docs/website/index.cn.md !????? docs/website/index.md N docs/website/LICENSE !????? docs/website/README.md !????? examples/ReleaseNotes.md !????? examples/sample_cube/create_sample_tables.sql !????? examples/test_case_data/localmeta/kylin.properties !????? examples/test_case_data/localmeta/kylin_job_conf.xml !????? examples/test_case_data/localmeta_v1/kylin.properties !????? examples/test_case_data/minicluster/b-kylin/kylin.properties !????? examples/test_case_data/minicluster/b-kylin/meta/kylin.properties A examples/test_case_data/minicluster/hbase-export.tar.gz !????? examples/test_case_data/minicluster/kylin.properties !????? examples/test_case_data/minicluster/kylin_job_conf.lzo_disabled.xml !????? examples/test_case_data/minicluster/kylin_job_conf.lzo_enabled.xml !????? examples/test_case_data/minicluster/kylin_job_conf.xml !????? examples/test_case_data/sandbox/capacity-scheduler.xml !????? examples/test_case_data/sandbox/core-site.xml !????? examples/test_case_data/sandbox/hadoop-policy.xml !????? examples/test_case_data/sandbox/hbase-policy.xml !????? examples/test_case_data/sandbox/hbase-site.xml !????? examples/test_case_data/sandbox/hdfs-site.xml !????? examples/test_case_data/sandbox/hive-site.xml !????? examples/test_case_data/sandbox/kylin.properties !????? examples/test_case_data/sandbox/kylin_job_conf.xml !????? examples/test_case_data/sandbox/mapred-site.xml !????? examples/test_case_data/sandbox/yarn-site.xml AL examples/test_case_data/sandbox-hdp21/capacity-scheduler.xml !????? examples/test_case_data/sandbox-hdp21/core-site.xml AL examples/test_case_data/sandbox-hdp21/hadoop-policy.xml !????? examples/test_case_data/sandbox-hdp21/hbase-site.xml !????? examples/test_case_data/sandbox-hdp21/hdfs-site.xml !????? examples/test_case_data/sandbox-hdp21/hive-site.xml AL examples/test_case_data/sandbox-hdp21/httpfs-site.xml !????? examples/test_case_data/sandbox-hdp21/kylin.properties !????? examples/test_case_data/sandbox-hdp21/kylin_job_conf.lzo_disabled.xml !????? examples/test_case_data/sandbox-hdp21/kylin_job_conf.lzo_enabled.xml !????? examples/test_case_data/sandbox-hdp21/kylin_job_conf.xml !????? examples/test_case_data/sandbox-hdp21/mapred-site.xml !????? examples/test_case_data/sandbox-hdp21/yarn-site.xml B kylin_architecture.png N LICENSE AL pom.xml !????? README.md !????? script/build.sh !????? script/compress.sh !????? script/download-tomcat.sh !????? script/package.sh !????? script/prepare.sh !????? webapp/.bowerrc !????? webapp/.editorconfig !????? webapp/.jshintrc !????? webapp/app/css/AdminLTE-fonts.css !????? webapp/app/css/AdminLTE.css B webapp/app/fonts/ODelI1aHBYDBqgeIAH2zlPytCVloACqnDHJwh-em2k8.woff2 B webapp/app/fonts/toadOcfmlt9b38dHJxOBGKUt5Ot5NIMarvNW-hkYWvT3rGVtsTkPsbDajuO5ueQw.woff2 !????? webapp/app/htaccess.dist B webapp/app/image/ajax-loader.gif B webapp/app/image/cube1.png B webapp/app/image/database.png B webapp/app/image/default_avatar.png B webapp/app/image/favicon.ico B webapp/app/image/forkme_right_red.png B webapp/app/image/Himg.png B webapp/app/image/icon_table.png B webapp/app/image/logo.png B webapp/app/image/table-icon.png B webapp/app/image/waiting.gif AL webapp/app/index.html AL webapp/app/js/app.js AL webapp/app/js/config.js AL webapp/app/js/controllers/access.js AL webapp/app/js/controllers/admin.js AL webapp/app/js/controllers/auth.js AL webapp/app/js/controllers/cube.js AL webapp/app/js/controllers/cubeAdvanceSetting.js AL webapp/app/js/controllers/cubeDimensions.js AL webapp/app/js/controllers/cubeEdit.js AL webapp/app/js/controllers/cubeFilter.js AL webapp/app/js/controllers/cubeModel.js AL webapp/app/js/controllers/cubeRefresh.js AL webapp/app/js/controllers/cubes.js AL webapp/app/js/controllers/cubeSchema.js AL webapp/app/js/controllers/index.js AL webapp/app/js/controllers/job.js AL webapp/app/js/controllers/page.js AL webapp/app/js/controllers/projectMeta.js AL webapp/app/js/controllers/projects.js AL webapp/app/js/controllers/query.js AL webapp/app/js/controllers/sourceMeta.js AL webapp/app/js/directives/directives.js AL webapp/app/js/factories/graph.js AL webapp/app/js/filters/filter.js AL webapp/app/js/listeners.js AL webapp/app/js/model/cubeConfig.js AL webapp/app/js/model/cubeDescModel.js AL webapp/app/js/model/cubeListModel.js AL webapp/app/js/model/cubesManager.js AL webapp/app/js/model/jobConfig.js AL webapp/app/js/model/jobListModel.js AL webapp/app/js/model/metaModel.js AL webapp/app/js/model/projectConfig.js AL webapp/app/js/model/projectModel.js AL webapp/app/js/model/tableConfig.js AL webapp/app/js/model/tableModel.js AL webapp/app/js/services/access.js AL webapp/app/js/services/admin.js AL webapp/app/js/services/auth.js AL webapp/app/js/services/cache.js AL webapp/app/js/services/cubeDesc.js AL webapp/app/js/services/cubes.js AL webapp/app/js/services/graph.js AL webapp/app/js/services/jobs.js AL webapp/app/js/services/kylinProperties.js AL webapp/app/js/services/message.js AL webapp/app/js/services/model.js AL webapp/app/js/services/ngLoading.js AL webapp/app/js/services/projects.js AL webapp/app/js/services/query.js AL webapp/app/js/services/tables.js AL webapp/app/js/services/tree.js AL webapp/app/js/services/users.js AL webapp/app/js/utils/utils.js !????? webapp/app/less/animation.less !????? webapp/app/less/app.less !????? webapp/app/less/build.less !????? webapp/app/less/component.less !????? webapp/app/less/home.less !????? webapp/app/less/layout.less !????? webapp/app/less/navbar.less AL webapp/app/partials/admin/admin.html AL webapp/app/partials/common/access.html AL webapp/app/partials/cubeDesigner/advanced_settings.html AL webapp/app/partials/cubeDesigner/data_model.html AL webapp/app/partials/cubeDesigner/dimensions.html AL webapp/app/partials/cubeDesigner/filter.html AL webapp/app/partials/cubeDesigner/incremental.html AL webapp/app/partials/cubeDesigner/info.html AL webapp/app/partials/cubeDesigner/measures.html AL webapp/app/partials/cubeDesigner/overview.html AL webapp/app/partials/cubes/cube_detail.html AL webapp/app/partials/cubes/cube_edit.html AL webapp/app/partials/cubes/cube_json_edit.html AL webapp/app/partials/cubes/cube_schema.html AL webapp/app/partials/cubes/cubes.html AL webapp/app/partials/directives/loading.html AL webapp/app/partials/directives/noResult.html AL webapp/app/partials/directives/pagination.html AL webapp/app/partials/directives/typeahead.html AL webapp/app/partials/footer.html AL webapp/app/partials/header.html AL webapp/app/partials/home.html AL webapp/app/partials/jobs/job_merge.html AL webapp/app/partials/jobs/job_refresh.html AL webapp/app/partials/jobs/job_steps.html AL webapp/app/partials/jobs/job_submit.html AL webapp/app/partials/jobs/jobs.html AL webapp/app/partials/login.html AL webapp/app/partials/projects/project_create.html AL webapp/app/partials/projects/project_detail.html AL webapp/app/partials/projects/project_table_tree.html AL webapp/app/partials/projects/projects.html AL webapp/app/partials/query/query.html AL webapp/app/partials/query/query_detail.html AL webapp/app/partials/tables/source_metadata.html AL webapp/app/partials/tables/source_table_tree.html !????? webapp/Gruntfile.js !????? webapp/README.md !????? webapp/template/nginx_default.conf !????? webapp/validate-commit-msg.js ***************************************************** Printing headers for files without AL header... ======================================================================= ==bin/check-env.sh ======================================================================= #!/bin/sh #by source if [ -z "$KYLIN_HOME" ] then echo 'please make sure KYLIN_HOME has been set' exit 1 else echo "KYLIN_HOME is set to ${KYLIN_HOME}" fi if [ -z "$(command -v hbase version)" ] then echo "Please make sure the user has the privilege to run hbase shell" exit 1 fi if [ -z "$(command -v hive --version)" ] then echo "Please make sure the user has the privilege to run hive shell" exit 1 fi if [ -z "$(command -v hadoop version)" ] then echo "Please make sure the user has the privilege to run hadoop shell" exit 1 fi ======================================================================= ==bin/find-hive-dependency.sh ======================================================================= #!/bin/sh hive_env=`hive -e set | grep 'env:CLASSPATH'` hive_classpath=`echo $hive_env | grep 'env:CLASSPATH' | awk -F '=' '{print $2}'` arr=(`echo $hive_classpath | cut -d ":" --output-delimiter=" " -f 1-`) hive_conf_path= hive_exec_path= for data in ${arr[@]} do result=`echo $data | grep -e 'hive-exec[0-9\.-]*jar'` if [ $result ] then hive_exec_path=$data fi result=`echo $data | grep 'hive/conf'` if [ $result ] then hive_conf_path=$data fi done hdp_home=`echo $hive_exec_path | awk -F '/hive/lib/' '{print $1}'` hcatalog=`find $hdp_home -name "hive-hcatalog-core[0-9\.-]*jar" 2>&1 | grep -m 1 -v 'Permission denied'` if [ -z "$hcatalog" ] then echo "hcatalog lib not found" exit 1 fi hive_dependency=${hive_conf_path}:${hdp_home}/hive/lib/*:${hcatalog} echo "hive dependency: $hive_dependency" export hive_dependency ======================================================================= ==bin/health-check.sh ======================================================================= #!/usr/bin/env bash ALERT="your@email.com" OUTPUT=$( curl --max-time 20 -# \ --data '{"sql":"select count(*) from test_kylin_fact","offset":0,"limit":50000,"acceptPartial":true,"project":"default"}' \ -H "Authorization:Basic QURNSU46S1lMSU4=" \ -H "Content-Type:application/json;charset=UTF-8" \ http://localhost:7070/kylin/api/query \ ) # ---------------------------------------------------------------------------- date if [[ $OUTPUT == *"results"* ]]; then echo "Good." else echo "Bad." TS_FILE=/tmp/kylin_healthmon_ts LAST_TS=`stat -c%Y $TS_FILE 2>/dev/null` CURR_TS=`date +%s` echo last: $LAST_TS echo curr: $CURR_TS if (( ${LAST_TS:-"0"} < $CURR_TS - 3600 )); then echo "Sending mail..." echo "Kylin Prod health check failed as of $(date)." | mail -s "KYLIN PROD DOWN" $ALERT if [ "$?" == "0" ]; then touch $TS_FILE fi fi fi ======================================================================= ==bin/kylin.sh ======================================================================= #!/bin/sh if [ $1 == "start" ] then dir=$(dirname ${0}) source ${dir}/check-env.sh tomcat_root=${dir}/../tomcat export tomcat_root #The location of all hadoop/hbase configurations are difficult to get. #Plus, some of the system properties are secretly set in hadoop/hbase shell command. #For example, in hdp 2.2, there is a system property called hdp.version, #which we cannot get until running hbase or hadoop shell command. # #To save all these troubles, we use hbase runjar to start tomcat. #In this way we no longer need to explicitly configure hadoop/hbase related classpath for tomcat, #hbase command will do all the dirty tasks for us: useSandbox=`cat ${KYLIN_HOME}/conf/kylin.properties | grep 'kylin.sandbox' | awk -F '=' '{print $2}'` spring_profile="default" if [ "$useSandbox" = "true" ] then spring_profile="sandbox" fi #retrive $hive_dependency source ${dir}/find-hive-dependency.sh #retrive $KYLIN_EXTRA_START_OPTS if [ -f "${dir}/setenv.sh" ] then source ${dir}/setenv.sh fi export HBASE_CLASSPATH_PREFIX=${tomcat_root}/bin/bootstrap.jar:${tomcat_root}/bin/tomcat-juli.jar:${tomcat_root}/lib/*:$HBASE_CLASSPATH_PREFIX export HBASE_CLASSPATH=$hive_dependency:${HBASE_CLASSPATH} export JAVA_OPTS="-Xms2048M -Xmx2048M -XX:MaxPermSize=512m" hbase ${JAVA_OPTS} ${KYLIN_EXTRA_START_OPTS} \ -Djava.util.logging.config.file=${tomcat_root}/conf/logging.properties \ -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \ -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true \ -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true \ -Djava.endorsed.dirs=${tomcat_root}/endorsed \ -Dcatalina.base=${tomcat_root} \ -Dcatalina.home=${tomcat_root} \ -Djava.io.tmpdir=${tomcat_root}/temp \ -Dkylin.hive.dependency=${hive_dependency} \ -Dspring.profiles.active=${spring_profile} \ org.apache.hadoop.util.RunJar ${tomcat_root}/bin/bootstrap.jar org.apache.catalina.startup.Bootstrap start > ${tomcat_root}/logs/kylin.log 2>&1 & echo $! > ${KYLIN_HOME}/pid & ======================================================================= ==bin/sample.sh ======================================================================= #!/bin/sh dir=$(dirname ${0}) source ${dir}/check-env.sh job_jar=`find ${KYLIN_HOME}/lib/ -name kylin-job*.jar` echo "Going to create sample tables in hive..." cd ${KYLIN_HOME}/sample_cube/data hive -f ${KYLIN_HOME}/sample_cube/create_sample_tables.sql || { exit 1; } echo "Sample hive tables are created successfully; Going to create sample cube..." cd ${KYLIN_HOME} hbase org.apache.hadoop.util.RunJar ${job_jar} org.apache.kylin.common.persistence.ResourceTool upload ${KYLIN_HOME}/sample_cube/metadata || { exit 1; } echo "Sample cube is created successfully in project 'learn_kylin'; Restart Kylin server or reload the metadata from web UI to see the change." ======================================================================= ==bin/setenv.sh ======================================================================= #!/bin/bash # uncomment following to for it to take effect # export KYLIN_JVM_SETTINGS="-Xms16g -Xmx16g -XX:MaxPermSize=512m -XX:NewSize=3g -XX:MaxNewSize=3g -XX:SurvivorRatio=4 -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=70 -XX:+DisableExplicitGC" # uncomment following to for it to take effect # export KYLIN_DEBUG_SETTINGS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -javaagent:${KYLIN_HOME}/lib/CustomAgent.jar -Dcom.ebay.lnp.rmiagent.port=8080" # uncomment following to for it to take effect # export KYLIN_LD_LIBRARY_SETTINGS="-Djava.library.path=/apache/hadoop/lib/native/Linux-amd64-64" export KYLIN_EXTRA_START_OPTS="" if [ ! -z "${KYLIN_JVM_SETTINGS}" ] then echo "KYLIN_JVM_SETTINGS is ${KYLIN_JVM_SETTINGS}" KYLIN_EXTRA_START_OPTS="${KYLIN_JVM_SETTINGS} ${KYLIN_EXTRA_START_OPTS}" else echo "KYLIN_JVM_SETTINGS is not set, using default jvm settings" fi if [ ! -z "${KYLIN_DEBUG_SETTINGS}" ] then echo "KYLIN_DEBUG_SETTINGS is ${KYLIN_DEBUG_SETTINGS}" KYLIN_EXTRA_START_OPTS="${KYLIN_DEBUG_SETTINGS} ${KYLIN_EXTRA_START_OPTS}" else echo "KYLIN_DEBUG_SETTINGS is not set, will not enable remote debuging" fi if [ ! -z "${KYLIN_LD_LIBRARY_SETTINGS}" ] then echo "KYLIN_LD_LIBRARY_SETTINGS is ${KYLIN_LD_LIBRARY_SETTINGS}" KYLIN_EXTRA_START_OPTS="${KYLIN_LD_LIBRARY_SETTINGS} ${KYLIN_EXTRA_START_OPTS}" else echo "KYLIN_LD_LIBRARY_SETTINGS is not set, lzo compression at MR and hbase might not work" fi ======================================================================= ==conf/kylin.properties ======================================================================= ## Config for Kylin Engine ## # List of web servers in use, this enables one web server instance to sync up with other servers. kylin.rest.servers=localhost:7070 # The metadata store in hbase kylin.metadata.url=kylin_metadata@hbase # The storage for final cube file in hbase kylin.storage.url=hbase # Temp folder in hdfs kylin.hdfs.working.dir=/tmp kylin.job.mapreduce.default.reduce.input.mb=500 # If true, job engine will not assume that hadoop CLI reside on the same server as it self # you will have to specify kylin.job.remote.cli.hostname, kylin.job.remote.cli.username and kylin.job.remote.cli.password kylin.job.run.as.remote.cmd=false # Only necessary when kylin.job.run.as.remote.cmd=true kylin.job.remote.cli.hostname= # Only necessary when kylin.job.run.as.remote.cmd=true kylin.job.remote.cli.username= # Only necessary when kylin.job.run.as.remote.cmd=true kylin.job.remote.cli.password= # Used by test cases to prepare synthetic data for sample cube kylin.job.remote.cli.working.dir=/tmp/kylin # Max count of concurrent jobs running kylin.job.concurrent.max.limit=10 # Time interval to check hadoop job status kylin.job.yarn.app.rest.check.interval.seconds=10 ## Config for Restful APP ## # database connection settings: ldap.server= ldap.username= ldap.password= ldap.user.searchBase= ldap.user.searchPattern= ldap.user.groupSearchBase= ldap.service.searchBase=OU= ldap.service.searchPattern= ldap.service.groupSearchBase= ======================================================================= ==conf/kylin_job_conf.xml ======================================================================= mapreduce.job.split.metainfo.maxsize -1 The maximum permissible size of the split metainfo file. The JobTracker won't attempt to read split metainfo files bigger than the configured value. No limits if set to -1. mapreduce.job.max.split.locations ======================================================================= ==docs/Installation/Hadoop Environment.md ======================================================================= ## Hadoop Environment Kylin requires you having access to a hadoop CLI, where you have full permissions to hdfs, hive, hbase and map-reduce. To make things easier we strongly recommend you starting with running Kylin on a hadoop sandbox, like . In the following tutorial we'll go with **Hortonworks Sandbox 2.1** and **Cloudera QuickStart VM 5.1**. To avoid permission issue, we suggest you using `root` account. The password for **Hortonworks Sandbox 2.1** is `hadoop` , for **Cloudera QuickStart VM 5.1** is `cloudera`. We also suggest you using bridged mode instead of NAT mode in your virtual box settings. Bridged mode will assign your sandbox an independent IP so that you can avoid issues like https://github.com/KylinOLAP/Kylin/issues/12 ### Start Hadoop Please make sure Hive, HDFS and HBase are available on our CLI machine. If you don't know how, here's a simple tutorial for hortonworks sanbox: Use ambari helps to launch hadoop: ambari-agent start ambari-server start With both command successfully run you can go to ambari homepage at (user:admin,password:admin) to check everything's status. **By default hortonworks ambari disables Hbase, you'll need manually start the `Hbase` service at ambari homepage.** ![start hbase in ambari](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/installation/starthbase.png) ======================================================================= ==docs/Installation/How to generate install binaries.md ======================================================================= ###Build from source > git clone https://github.com/KylinOLAP/Kylin.git > cd KylinOLAP/Kylin > sh script/package.sh In order to generate binary package, **maven** and **npm** are pre-requisites. ======================================================================= ==docs/Installation/Installation.md ======================================================================= Installation ------------ ### Prerequisites on hadoop### - Hadoop: 2.2.0.2.0.6.0-61 or above - Hive: 0.12.0.2.0.6.0-61 or above - HBase: 0.96.0.2.0.6.0-61-hadoop2 _Tested with Hortonworks HDP 2.1.3 and Cloudera Quickstart VM 5.1._ It is very easy to install Kylin for exploration/development. There are 3 installation scenarios: #### On-Hadoop-CLI installation #### If you are free to install Kylin on your hadoop CLI machine or Hadoop sandbox, this is the most convenient scenario, for it puts everything in a single machine. For a hands-on tutorial please visit [On-Hadoop-CLI installation](On Hadoop CLI installation.md). #### Dev Environment (Off-Hadoop-CLI Installation) #### This is typically for development environment setup. For a hands-on tutorial please visit [Off Hadoop CLI Installation (Dev Env Setup)](Off Hadoop CLI Installation.md). #### Docker Container #### With help from [SequenceIQ](http://sequenceiq.com/), there's docker container for Kylin (along with Hadoop, HBase and Hive) available now:[sequenceiq/docker-kylin](https://github.com/sequenceiq/docker-kylin). The only thing you will need to do is to pull the container from the official Docker repository to be up and running in few minutes. Features: - Size - Light weight compared to downloading and setting up HDP or CDH sandbox. - Cluster support - Supports multi node installation. - Fully Automated - No manual steps. One command does it all For a hands-on tutorial please visit [Kylin Docker installation](On Hadoop Kylin installation using Docker.md). ======================================================================= ==docs/Installation/Multiple Kylin REST servers.md ======================================================================= ### Multiple Kylin REST servers If you are running Kylin in a cluster or you have multiple Kylin REST server instances, please make sure you have the following property correctly configured in ${KYLIN_HOME}/conf/kylin.properties 1. kylin.rest.servers List of web servers in use, this enables one web server instance to sync up with other servers. 2. kylin.server.mode Make sure there is only one instance whose "kylin.server.mode" is set to "all" if there are multiple instances. ======================================================================= ==docs/Installation/Off Hadoop CLI Installation.md ======================================================================= Off Hadoop CLI Installation (Dev Env Setup) === Off-Hadoop-CLI installation is usually for **development use**. Developers want to run kylin test cases or applications at their development machine. The scenario is depicted as: ![Off-Hadoop-CLI-installation](off_cli_install_scene.png) The "Applications" here can be any unit cases running on your dev machine's IDE. By following this tutorial, you will be able to build kylin test cubes by running a specific test case, and you can further run other test cases against the cubes having been built. ## Environment on the Hadoop CLI ### Environment Kylin Rquires a properly setup hadoop environment to run. Please take a look [this](Hadoop Environment.md). ## Environment on the dev machine ### Install maven The latest maven can be found at , we create a symbolic so that `mvn` can be run anywhere. cd ~ wget http://apache.proserve.nl/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.tar.gz tar -xzvf apache-maven-3.2.3-bin.tar.gz ln -s /root/apache-maven-3.2.3/bin/mvn /usr/bin/mvn ### Compile First clone the Kylin project to your local: git clone https://github.com/KylinOLAP/Kylin.git Install Kylin artifacts to the maven repo mvn clean install -DskipTests ### Modify local configuration Local configuration must be modified to point to your hadoop sandbox (or CLI) machine. If you are using a Hortonworks sandbox, this section may be skipped. * In **examples/test_case_data/sandbox/kylin.properties** * Find `sandbox` and replace with your hadoop hosts * Find `kylin.job.remote.cli.username` and `kylin.job.remote.cli.password`, fill in the user name and password used to login hadoop cluster for hadoop command execution * In **examples/test_case_data/sandbox** * For each configuration xml file, find all occurrence of `sandbox` and replace with your hadoop hosts An alternative to the host replacement is updating your `hosts` file to resolve `sandbox` and `sandbox.hortonworks.com` to the IP of your sandbox machine. ======================================================================= ==docs/Installation/On Hadoop CLI installation.md ======================================================================= On Hadoop CLI installation === On-Hadoop-CLI installation is the most common way of installing Kylin. It can be used for demo use, or for those who want to host their own web site to provide Kylin service. The scenario is depicted as: ![On-Hadoop-CLI-installation](on_cli_install_scene.png) For normal use cases, the application in the above picture means Kylin Web, which contains a web interface for cube building, querying and all sorts of management. Kylin Web launches a query engine for querying and a cube build engine for building cubes. These two engines interact with the components in Hadoop CLI, like hive and hbase. Except for some prerequisite software installations, the core of Kylin installation is accomplished by running a single script. After running the script, you will be able to build sample cube and query the tables behind the cubes via a unified web interface. ### Environment Kylin Rquires a properly setup hadoop environment to run. Please take a look [this](Hadoop Environment.md). ### Install Kylin 1. Download latest Kylin binaries at http://kylin.incubator.apache.org/download/ 2. export KYLIN_HOME pointing to the extracted Kylin folder 3. Make sure the user has the privilege to run hadoop, hive and hbase cmd in shell. If you are not so sure, you can just run **bin/check-env.sh**, it will print out the detail information if you have some environment issues. 4. To start Kylin, simply run **bin/kylin.sh start** 5. To stop Kylin, simply run **bin/kylin.sh stop** > If you want to have multiple Kylin instances please refer to [this](Multiple Kylin REST servers.md) After Kylin started you can visit . The username/password is ADMIN/KYLIN. It's a clean Kylin homepage with nothing in there. To start with you can: 1. [Quick play with a sample cube](../Tutorial/Quick play with a sample cube.md) 2. [Create and Build your own cube](../Tutorial/Kylin Cube Creation Tutorial.md) Here's also a overview introduction on the website [Kylin Web Tutorial](../Tutorial/Kylin Web Tutorial.md) ======================================================================= ==docs/Installation/On Hadoop Kylin installation using Docker.md ======================================================================= On Hadoop Kylin installation using Docker === With help of SequenceIQ, we have put together a fully automated method of creating a Kylin cluster (along with Hadoop, HBase and Hive). The only thing you will need to do is to pull the container from the official Docker repository by using the commands listed below: ### Pre-Requisite 1. Docker (If you don't have Docker installed, follow this [link](https://docs.docker.com/installation/#installation)) 2. Minimum RAM - 4Gb (We'll be running Kylin, Hadoop, HBase & Hive) ### Installation ``` docker pull sequenceiq/kylin ``` Once the container is pulled you are ready to start playing with Kylin. Get the following helper functions from our Kylin GitHub [repository](https://github.com/sequenceiq/docker-kylin/blob/master/ambari-functions) - _(make sure you source it)._ ``` $ wget https://raw.githubusercontent.com/sequenceiq/docker-kylin/master/ambari-functions $ source ambari-functions ``` ``` $ kylin-deploy-cluster 3 ``` You can specify the number of nodes you'd like to have in your cluster (3 in this case). Once we installed all the necessary Hadoop services we'll build Kylin on top of it and then you can reach the UI on: ``` #Ambari Dashboard http://:8080 ``` Use `admin/admin` to login. Make sure HBase is running. ``` #Kylin Dashboard http://:7070 ``` The default credentials to login are: `ADMIN:KYLIN`. The cluster is pre-populated with sample data and is ready to build cubes as shown [here](../Tutorial/Kylin Cube Build and Job Monitoring Tutorial.md). ======================================================================= ==docs/JobEngine/Design.md ======================================================================= ## Job Engine Design > Purpose: The **Job Engine** is a coordinator which manage the tasks' life cycle and CRUD of the tasks. To be clearified, the **Job Engine** does not run the task itself, instead the task runs on hadoop(or whatever it depends). ### Executable ![Class Diagram](Class_Diagram.png) **Executable** is a top-level interface for all kinds of jobs or tasks. **AbstractExecutable** is a abstract implementation of **Executable**, it provides: 1. some getter and setter method 2. default implementation of **Executable**.execute() 3. life cycle method of an **Executable** and their default implementation **DefaultChainedExecutable** is an implementation of AbstractExecutable which contains a group of **Executable** ### ExecutableManager **ExecutableManager** provide the CRUD function for an **Executable** ### ExecutableDao **ExecutableDao** provide the access of the persistent object for Executable There are two persistent object for one **Executable** 1. **ExecutablePO** is to store the runnning parameters for the **Executable**, and once the **Executable** is submitted, **ExecutablePO** is unmodifiable. 2. **ExecutableOutputPO** is to store the running result for the **Executable**, for instance the current state, error log. ### DefaultScheduler **DefaultScheduler** is a coordinator for **Executable**s. There is a daemon thread call JobFetcher running periodically. It is responsible for scheduling the **Executable**s Note: there should always be only one instance running in the cluster. And it is configured using "kylin.server.mode" in the "kylin.properties", there are two modes "all" & "query", "all" means it will defaultly start the scheduler. So if there are multiple kylin instances, make sure there is only one instance whose "kylin.server.mode" is set to "all". ======================================================================= ==docs/MISC/FAQ on Kylin Installation and Usage.md ======================================================================= FAQ on Kylin Installation and Usage --- #### Some NPM error causes ERROR exit (中国大陆地区用户请特别注意此问题)? Check out https://github.com/KylinOLAP/Kylin/issues/35 #### Can't get master address from ZooKeeper" when installing Kylin on Hortonworks Sandbox Check out https://github.com/KylinOLAP/Kylin/issues/9. #### Install scripted finished in my virtual machine, but cannot visit via http://localhost:9080 Check out https://github.com/KylinOLAP/Kylin/issues/12. #### Map Reduce Job information can't display on sandbox deployment Check out https://github.com/KylinOLAP/Kylin/issues/40 #### Install Kylin on CDH 5.2 or Hadoop 2.5.x Check out discussion: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/kylin-olap/X0GZfsX1jLc/nzs6xAhNpLkJ ``` I was able to deploy Kylin with following option in POM. 2.5.0 2.5.0 0.98.6-hadoop2 3.4.5 0.13.1 My Cluster is running on Cloudera Distribution CDH 5.2.0. ``` #### Unable to load a big cube as HTable, with java.lang.OutOfMemoryError: unable to create new native thread HBase (as of writing) allocates one thread per region when bulk loading a HTable. Try reduce the number of regions of your cube by setting its "capacity" to "MEDIUM" or "LARGE". Also tweaks OS & JVM can allow more threads, for example see [this article](http://blog.egilh.com/2006/06/2811aspx.html). #### Failed to run BuildCubeWithEngineTest, saying failed to connect to hbase while hbase is active User may get this error when first time run hbase client, please check the error trace to see whether there is an error saying couldn't access a folder like "/hadoop/hbase/local/jars"; If that folder doesn't exist, create it. #### SUM(field) returns a negtive result while all the numbers in this field are > 0 If a column is declared as integer in Hive, the SQL engine (calcite) will use column's type (integer) as the data type for "SUM(field)", while the aggregated value on this field may exceed the scope of integer; in that case the cast will cause a negtive value be returned; The workround is, alter that column's type to BIGINT in hive, and then sync the table schema to Kylin (the cube doesn't need rebuild); Keep in mind that, always declare as BIGINT in hive for an integer column which would be used as a measure in Kylin; See hive number types: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-NumericTypes #### Why Kylin need extract the distinct columns from Fact Table before building cube? Kylin uses dictionary to encode the values in each column, this greatly reduce the cube's storage size. To build the dictionary, Kylin need fetch the distinct values for each column. #### Why Kylin calculate the HIVE table cardinality? The cardinality of dimensions is an important measure of cube complexity. The higher the cardinality, the bigger the cube, and thus the longer to build and the slower to query. Cardinality > 1,000 is worth attention and > 1,000,000 should be avoided at best effort. For optimal cube performance, try reduce high cardinality by categorize values or derive features. #### What is the difference between Kylin and Druid take a look at http://mail-archives.apache.org/mod_mbox/incubator-kylin-dev/201503.mbox/%3Ctencent_0DAD681A15F3B2F2379CADC9%40qq.com%3E ======================================================================= ==docs/MISC/How to Contribute.md ======================================================================= #### Setup Dev Env * Subscribe our developers' mail list via * Fork from [GitHub](https://github.com/apache/incubator-kylin) *staging* branch, it is the bug fix branch of master. * ... #### Making Changes * Discuss feature/enhancement/bug you plan to do in dev mail list, get consensus before you start. * Create a [JIRA](https://issues.apache.org/jira/browse/KYLIN) to describe your task * Make changes in your fork. * Write unit test to cover your change. #### Contribute The Work * Pull request to *staging* branch. * Committer review in terms of correctness, performance, design, coding style, test coverage. * Discuss and revise if necessary. * Committer merge code into *staging*. * After integration test, change merges into master. #### Wish List Some work items for new joiners. * Query Engine * Cache Calcite generated class, reduce delay into ms level and avoid full GC triggered by perm generation * [KYLIN-491](https://issues.apache.org/jira/browse/KYLIN-491) Derive meaningful cost in OLAP relational operator * Job Engine * [KYLIN-489](https://issues.apache.org/jira/browse/KYLIN-489) Tune HDFS & HBase parameters. Requires a hadoop cluster of 10+ nodes. * Fork some build step (build dictionary, create hbase table) as child process, better resource cleanup and easier troubleshooting. * Use DoubleDouble instead of BigDecimal during cube build. Expect better CPU performance. * ODBC/JDBC * Test Kylin remote JDBC with java report tools * [KYLIN-602](https://issues.apache.org/jira/browse/KYLIN-602) ODBC driver support excel * Implement ODBC async mode, streaming from Kylin and feeding to client * Benchmark * [KYLIN-487](https://issues.apache.org/jira/browse/KYLIN-487) Benchmark on standard dataset ======================================================================= ==docs/MISC/Kylin Document Conventions.md ======================================================================= Kylin Document Conventions ----- 1. Keep documentation in markdown files 2. In markdown files, try to use relative URI for document/image reference. 3. Never link to github wiki pages 4. Try not to simply list all docuemnts in one page. Instead, try to organize different documents into a "story", so that readers are presented deeper materials as they proceed. 5. Always keep documents updated 6. ... ======================================================================= ==docs/Operations/Advanced settings of Kylin environment.md ======================================================================= Advanced settings of Kylin environment ---- ### A. Enabling LZO compression LZO compression can be leveraged to compress the output of MR jobs, as well as hbase table storage, reducing the storage overhead. By default we do not enable LZO compression in Kylin because hadoop sandbox venders tend to not include LZO in their distributions due to license(GPL) issues. To enable LZO in Kylin, there are three steps: #### Make sure LZO is working in your environment we have a simple tool to test whether LZO is well installed and configured in your environment(we only test it on the hadoop CLI that you deployed Kylin), Just run `hbase org.apache.hadoop.util.RunJar kylin-job-latest.jar com.kylinolap.job.tools.LZOSupportnessChecker` If the program prints "LZO supported by current env? true", you're good to go. Otherwise you'll need to first install LZO properly. #### Modify kylin_job_conf.xml You'll need to stop Kylin first by running `${KYLIN_HOME}/bin/kylin.sh stop`, and then modify /etc ${KYLIN_HOME}/conf/kylin_job_conf.xml by uncommenting some configuration entries related to LZO compression. #### export KYLIN_LD_LIBRARY_PATH to carry your native library paths Before starting Kylin again, you'll need to uncomment KYLIN_LD_LIBRARY_PATH in ${KYLIN_HOME}/bin/setenv.sh to carry your LZO native library paths. Here's an example for hdp 2.1: export KYLIN_LD_LIBRARY_PATH=::/usr/lib/hadoop/lib/native/Linux-amd64-64:/usr/lib/hadoop/lib/native After exporting, you need to run `${KYLIN_HOME}/bin/kylin.sh start` to start Kylin again. Now Kylin will use LZO to compress MR outputs and hbase tables. ======================================================================= ==docs/Operations/Export Kylin HBase data.md ======================================================================= # Export Kylin HBase data Kylin persists all data (meta data and cube) in HBase; You may want to export the data sometimes for whatever purposes (backup, migration, troubleshotting etc); This page describes the steps to do this and also there is a Java app for you to do this easily; Steps: 1. Cleanup unused cubes to save storage space (be cautious on production!): run the following command in hbase CLI: ``` hbase org.apache.hadoop.util.RunJar /${KYLIN_HOME}/lib/kylin-job-(version).jar org.apache.kylin.job.hadoop.cube.StorageCleanupJob --delete true ``` 2. List all HBase tables, iterate and then export each Kylin table to HDFS; See https://hbase.apache.org/book/ops_mgt.html#export 3. Copy the export folder from HDFS to local file system, and then archive it; 4. (optional) Download the archive from Hadoop CLI to local; 5. Cleanup the export folder from CLI HDFS and local file system; Kylin provide the "ExportHBaseData.java" (currently only exist in "minicluster" branch) for you to do the step 2-5 in one run; Please ensure the correct path of "kylin.properties" has been set in the sys env; This Java uses the sandbox config by default; ======================================================================= ==docs/Operations/Kylin Metadata Store.md ======================================================================= Kylin organizes all of its metadata(including cube descriptions and instances, projects, inverted index description and instances, jobs, tables and dictionaries) as a hierarchy file system. However, Kylin uses hbase to store it, rather than normal file system. If you check your kylin configuration file(kylin.properties) you will find such a line: `# The metadata store in hbase` `kylin.metadata.url=kylin_metadata@hbase:sandbox.hortonworks.com:2181:/hbase-unsecure` This indicates that the metadata will be saved as a htable called `kylin_metadata`. You can scan the htable in hbase shell to check it out. # Backup Metadata Store Sometimes you need to backup the Kylin's Metadata Store from hbase to your disk file system. In such cases, assuming you're on the hadoop CLI(or sandbox) where you deployed Kylin, you can use: mkdir ~/meta_dump hbase org.apache.hadoop.util.RunJar ${KYLIN_HOME}/lib/kylin-job-x.x.x-SNAPSHOT-job.jar org.apache.kylin.common.persistence.ResourceTool copy ${KYLIN_HOME}/conf/kylin.properties ~/meta_dump to dump your metadata to your local folder ~/meta_dump. # Restore Metadata Store In case you find your metadata store messed up, and you want to restore to a previous backup: first clean up the metadata store: hbase org.apache.hadoop.util.RunJar ${KYLIN_HOME}/lib/kylin-job-x.x.x-SNAPSHOT-job.jar org.apache.kylin.common.persistence.ResourceTool reset then upload the backup metadata in ~/meta_dump to Kylin's metadata store: hbase org.apache.hadoop.util.RunJar ${KYLIN_HOME}/lib/kylin-job-x.x.x-SNAPSHOT-job.jar org.apache.kylin.common.persistence.ResourceTool copy ~/meta_dump ${KYLIN_HOME}/conf/kylin.properties ======================================================================= ==docs/REST/Build Cube with Restful API.md ======================================================================= ### 1. Authentication * Currently, Kylin uses [basic authentication](http://en.wikipedia.org/wiki/Basic_access_authentication). * Add `Authorization` header to first request for authentication * Or you can do a specific request by `POST http://localhost:7070/kylin/api/user/authentication` * Once authenticated, client can go subsequent requests with cookies. * Example ``` POST http://localhost:7070/kylin/api/user/authentication Authorization:Basic xxxxJD124xxxGFxxxSDF Content-Type: application/json;charset=UTF-8 ``` ### 2. Get details of cube. * `GET http://localhost:7070/kylin/api/cubes?cubeName={cube_name}&limit=15&offset=0` * Client can find cube segment date ranges in returned cube detail. * Example ``` GET http://localhost:7070/kylin/api/cubes?cubeName=test_kylin_cube_with_slr&limit=15&offset=0 Authorization:Basic xxxxJD124xxxGFxxxSDF Content-Type: application/json;charset=UTF-8 ``` ### 3. Then submit a build job of the cube. * `PUT http://localhost:7070/kylin/api/cubes/{cube_name}/rebuild` * For put request body detail please refer to [service doc](https://github.com/KylinOLAP/Kylin/wiki/Restful-Service-Doc). * `startTime` and `endTime` should be utc timestamp. * `buildType` can be `BUILD` or `MERGE`. `BUILD` is for building a new segment or refreshing an existing segment. `MERGE` is for merging multiple existing segments into one bigger segment. * This method will return a newly created job instance, in which the uuid is the identity of job to track job status. * Example ``` PUT http://localhost:7070/kylin/api/cubes/test_kylin_cube_with_slr/rebuild Authorization:Basic xxxxJD124xxxGFxxxSDF Content-Type: application/json;charset=UTF-8 { "startTime": 0, "endTime": 1388563200000, "buildType": "BUILD" } ``` ### 4. Track job status. * `GET http://localhost:7070/kylin/api/jobs/{job_uuid}` * Returned `job_status` represents current status of job. ### 5. If the job failed, you can resume the job. ======================================================================= ==docs/REST/How to consume Kylin REST API in javascript.md ======================================================================= Kylin securicty authorization is based on basic access authorization, so when you want to use API in your javascript,you need to involve the authorization info in http headers. ## Here is a demo show how to use Kylin Query API. ``` $.ajaxSetup({ headers: { 'Authorization': "Basic eWFu**********X***ZA==", 'Content-Type': 'application/json;charset=utf-8' } // use your own authorization code here }); var request = $.ajax({ url: "http://hostname/kylin/api/query", type: "POST", data: '{"sql":"select count(*) from SUMMARY;","offset":0,"limit":50000,"partial":true,"project":"test"}', dataType: "json" }); request.done(function( msg ) { alert(msg); }); request.fail(function( jqXHR, textStatus ) { alert( "Request failed: " + textStatus ); }); ``` For what is basic access authorization ,click here http://en.wikipedia.org/wiki/Basic_access_authentication ## Keypoint: 1. add basic access authorization info in heders. 2. use right ajax type and right data synax How to generate your authorization code (download and import "jquery.base64.js" from https://github.com/yckart/jquery.base64.js) ``` var authorizationCode = $.base64('encode', 'NT_USERNAME' + ":" + 'NT_PASSWORD'); $.ajaxSetup({ headers: { 'Authorization': "Basic " + authorizationCode, 'Content-Type': 'application/json;charset=utf-8' } }); ``` ======================================================================= ==docs/REST/Kylin Restful API List.md ======================================================================= ## Kylin Restful API List * QUERY * Login * Query * List queryable tables * CUBE * List cubes * Rebuild cube * Disable cube * Purge cube * Enable cube * JOB * Resume job * Discard job * Get job step log * Metadata * Get Hive Table * Get Hive Table (Extend Info) * Get Hive Tables * Load Hive Table * Wipe cache *** ### Login `POST /user/authentication` for example: ```sh curl -c /path/to/cookiefile.txt -X POST -H "Authorization: Basic XXXXXXXXX" -H 'Content-Type: application/json' http://:/kylin/api/user/authentication ``` If login successfully, the JSESSIONID will be saved into the cookie file; In the subsequent http requests, attach the cookie, for example: ```sh curl -b /path/to/cookiefile.txt -X PUT -H 'Content-Type: application/json' -d '{"startTime":'1423526400000', "endTime":'1423526400', "buildType":"BUILD"}' http://:/kylin/api/cubes/your_cube/rebuild ``` #### Header Authorization data encoded by basic auth. Header sample: Authorization:Basic {data} #### Response Sample ```sh Status: 200OK ``` ```sh { "userDetails":{ "password":null, "username":"sample", ======================================================================= ==docs/TechInside/Kylin 0.7 Lambda Architecture.md ======================================================================= Kylin 0.7 Lambda Architecture === Start from 0.7, Kylin adopts a [Lambda Architecture](http://en.wikipedia.org/wiki/Lambda_architecture) to support near real-time analysis from streaming input. * Data is separated into Young and Aged. * The young generation is batch loaded from streaming (e.g. every minute) and saved in a real-time storage with inverted index. * Aged generation is batch loaded from real-time storage to historic storage daily or hourly. Aged generation is stored as OLAP cube with pre-calculation. * A hybrid storage interface sits on top of the real-time and historic storage, and provides a view of complete data set for SQL queries. * The combination of inverted index and OLAP cube enables subsecond query latencies on near real-time data with huge history. ![Kylin 0.7 Lambda Architecture](Kylin_0.7_Lambda_Architecture.png) ======================================================================= ==docs/TechInside/New meta data model structure.md ======================================================================= #New meta data model structure Kylin is doing a round code refactor which will introduce the following two changes on meta data: * Abstract a "model_desc" layer from "cube_desc" Before define a cube, user will need firstly define a model ("model_desc"); The model defines which is the fact table, which are lookup tables and how they be joined; With the model be defined, when user define a cube ("cube_desc"), he/she only need to specify the table/column name for a dimension, as the join conditions have already been defined; This abstraction is to extend the meta data to fulfill non-cube queries (coming soon); * Support data tables from multiple hive databases; User has the case that tables are from multiple hive database, and the table name might be the same; To support this case Kylin will use the database name + table name as the unique name for tables; And user need to specify the database name (if it is not "default") in SQL when query Kylin. Here is a sample; the fact table "test_kylin_fact" is from default hive database, you don't need to specify the db name; while lookup table is from "edw", you need use "edw.test_cal_dt" in the query: select test_cal_dt.Week_Beg_Dt, sum(price) as c1, count(1) as c2 from test_kylin_fact inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='ABIN' ======================================================================= ==docs/Test/Run Kylin test case with HBase Mini Cluster.md ======================================================================= ## Run test case with HBase Mini Cluster Kylin is moving as many as possible unit test cases from sandbox to HBase mini cluster, so that user can run tests easily in local without a hadoop sandbox; Two maven profiles are created in the root pom.xml, "default" and "sandbox"; The default profile will startup a HBase Mini Cluster to prepare the test data and run the unit tests (the test cases that are not supported by Mini cluster have been added in the "exclude" list); If you want to keep using Sandbox to run test, just run: mvn test -P sandbox ### When use the "default" profile, Kylin will: * Startup a HBase minicluster and update KylinConfig with the dynamic HBase configurations; * Create Kylin metadata tables and import six example cube tables; * Import the hbase data from a tar ball from local: examples/test_case_data/minicluster/hbase-export.tar.gz (the hbase-export.tar.gz will be updated on complete of running BuildCubeWithEngineTest) * After all test cases be completed, shutdown minicluster and cleanup KylinConfig cache; ### To ensure Mini cluster can run successfully, you need: * Make sure JAVA_HOME is properly set; ======================================================================= ==docs/Tutorial/How to use kylin remote jdbc driver.md ======================================================================= ### Get JDBC jar Kylin JDBC jar file is under lib/ of binary package, named `kylin-jdbc-verion.jar`. ### Authentication Build on kylin authentication restful service. Supported parameters: * user : username * password : password * ssl: true/false. Default be false; If true, all the services call will use https. ### Connection URL format: ``` jdbc:kylin://:/ ``` * If "ssl" = true, the "port" should be Kylin server's HTTPS port; * If "port" is not specified, the driver will use default port: HTTP 80, HTTPS 443; * The "kylin_project_name" must be specified and user need ensure it exists in Kylin server; ### 1. Query with Statement ``` Driver driver = (Driver) Class.forName("org.apache.kylin.jdbc.Driver").newInstance(); Properties info = new Properties(); info.put("user", "ADMIN"); info.put("password", "KYLIN"); Connection conn = driver.connect("jdbc:kylin://localhost:7070/kylin_project_name", info); Statement state = conn.createStatement(); ResultSet resultSet = state.executeQuery("select * from test_table"); while (resultSet.next()) { assertEquals("foo", resultSet.getString(1)); assertEquals("bar", resultSet.getString(2)); assertEquals("tool", resultSet.getString(3)); } ``` ### 2. Query with PreparedStatement Supported prepared statement parameters: * setString * setInt * setShort * setLong * setFloat * setDouble * setBoolean * setByte * setDate * setTime * setTimestamp ======================================================================= ==docs/Tutorial/Kylin and Excel Tutorial.md ======================================================================= Kylin and Excel Tutorial === For now our ODBC driver has not yet finished supporting Excel, watch the mail list for updates. ======================================================================= ==docs/Tutorial/Kylin and Tableau Tutorial.md ======================================================================= Kylin and Tableau Tutorial === > There are some limitations of Kylin ODBC driver with Tableau, please read carefully this instruction before you try it. > * Only support "managed" analysis path, Kylin engine will raise exception for un-excepted dimension or metric > * Please always select Fact Table first, then add lookup tables with correct join condition (defined join type in cube) > * Do not try to join between fact tables or lookup tables; > * You can try to use high cardinality dimensions like seller id as Tableau Filter, but the engine will only return limited seller id in Tableau's filter now. > More detail information or any issue, please contact Kylin Team: `kylinolap@gmail.com` ### Step 1. Install ODBC Driver Refer to wiki page [Kylin ODBC Driver Tutorial](Kylin ODBC Driver Tutorial.md). ### Step 2. Connect to Kylin Server > We recommended to use Connect Using Driver instead of Using DSN since Tableau team will not manage your DSN on Tableau Servers. **The snapshots are a little bit outdated because at that time Kylin ues port 9080 as default port, for new comers please use the new default port 7070** Connect Using Driver: Select "Other Database(ODBC)" in the left panel and choose KylinODBCDriver in the pop-up window. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tableau_tutorial/1%20odbc.png) Enter your Sever location and credentials: server host, port, username and password. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tableau_tutorial/2%20serverhost.jpg) Click "Connect" to get the list of projects that you have permission to access. See details about permission in [Kylin Cube Permission Grant Tutorial](Kylin Cube Permission Grant Tutorial.md). Then choose the project you want to connect in the drop down list. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tableau_tutorial/3%20project.jpg) Click "Done" to complete the connection. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tableau_tutorial/4%20done.jpg) ### Step 3. Using Single Table or Multiple Tables > Limitation > * Must select FACT table first > * Do not support select from lookup table only > * The join condition must match within cube definition **Select Fact Table** Select `Multiple Tables`. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tableau_tutorial/5%20multipleTable.jpg) Then click `Add Table...` to add a fact table. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tableau_tutorial/6%20facttable.jpg) ======================================================================= ==docs/Tutorial/Kylin Cube Build and Job Monitoring Tutorial.md ======================================================================= Kylin Cube Build and Job Monitoring Tutorial === ### Cube Build First of all, make sure that you have authority of the cube you want to build. 1. In `Cubes` page, click the `Action` drop down button in the right of a cube column and select operation `Build`. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/1%20action-build.png) 2. There is a pop-up window after the selection. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/2%20pop-up.png) 3. Click `END DATE` input box to choose end date of this incremental cube build. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/3%20end-date.png) 4. Click `Submit` to send request. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/4%20submit.png) ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/4.1%20success.png) After submit the request successfully, you will see the job just be created in the `Jobs` page. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/5%20jobs-page.png) 5. To discard this job, just click the `Discard` button. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/6%20discard.png) ### Job Monitoring In the `Jobs` page, click the job detail button to see detail information show in the right side. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/7%20job-steps.png) The detail information of a job provides a step-by-step record to trace a job. You can hover a step status icon to see the basic status and information. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/8%20hover-step.png) Click the icon button show in each step to see the details: `Parameters`, `Log`, `MRJob`, `EagleMonitoring`. * Parameters ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/9%20parameters.png) ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/cube_build_job_monitor/9%20parameters-d.png) * Log ======================================================================= ==docs/Tutorial/Kylin Cube Creation Tutorial.md ======================================================================= Kylin Cube Creation Tutorial === ### I. Create a Project 1. Go to `Query` page in top menu bar, then click `Manage Projects`. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/1%20manage-prject.png) 2. Click the `+ Project` button to add a new project. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/2%20%2Bproject.png) 3. Fulfill the following form and click `submit` button to send a request. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/3%20new-project.png) 4. After success, there will be a notification show in the bottom. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/3.1%20pj-created.png) ### II. Sync up a Table 1. Click `Tables` in top bar and then click the `+ Sync` button to load hive table metadata. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/4%20%2Btable.png) 2. Enter the table names and click `Sync` to send a request. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/5%20hive-table.png) ### III. Create a Cube To start with, click `Cubes` in top bar.Then click `+Cube` button to enter the cube designer page. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/6%20%2Bcube.png) **Step 1. Cube Info** Fill up the basic information of the cube. Click `Next` to enter the next step. You can use letters, numbers and '_' to name your cube (Notice that space in name is not allowed). ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/7%20cube-info.png) **Step 2. Dimensions** 1. Set up the fact table. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/8%20dim-factable.png) 2. Click `+Dimension` to add a new dimension. ======================================================================= ==docs/Tutorial/Kylin Cube Permission Grant Tutorial.md ======================================================================= Kylin Cube Permission Grant Tutorial === In `Cubes` page, double click the cube row to see the detail information. Here we focus on the `Access` tab. Click the `+Grant` button to grant permission. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/14%20+grant.png) There are four different kinds of permissions for a cube. Move your mouse over the `?` icon to see detail information. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/15%20grantInfo.png) There are also two types of user that a permission can be granted: `User` and `Role`. `Role` means a group of users who have the same role. ### 1. Grant User Permission * Select `User` type, enter the username of the user you want to grant and select the related permission. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/16%20grant-user.png) * Then click the `Grant` button to send a request. After the success of this operation, you will see a new table entry show in the table. You can select various permission of access to change the permission of a user. To delete a user with permission, just click the `Revoke` button. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/tutorial/16%20user-update.png) ### 2. Grant Role Permission * Select `Role` type, choose a group of users that you want to grant by click the drop down button and select a permission. * Then click the `Grant` button to send a request. After the success of this operation, you will see a new table entry show in the table. You can select various permission of access to change the permission of a group. To delete a group with permission, just click the `Revoke` button. ======================================================================= ==docs/Tutorial/Kylin ODBC Driver Tutorial.md ======================================================================= Kylin ODBC Driver Tutorial === > We provide Kylin ODBC driver to enable data access from ODBC-compatible client applications. > Both 32-bit version or 64-bit version driver are available. > Tested Operation System: Windows 7, Windows Server 2008 R2 > Tested Application: Tableau 8.0.4 and Tableau 8.1.3 ## Prerequisites 1. Microsoft Visual C++ 2012 Redistributable * For 32 bit Windows or 32 bit Tableau Desktop: Download: [32bit version](http://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe) * For 64 bit Windows or 64 bit Tableau Desktop: Download: [64bit version](http://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe) 2. ODBC driver internally gets results from a REST server, make sure you have access to one ## Installation 1. Uninstall existing Kylin ODBC first, if you already installled it before 2. Download the attached driver installer at [KylinOLAP/odbc-driver/exe](https://github.com/KylinOLAP/odbc-driver/tree/master/exe), run it. * For 32 bit Tableau Desktop: Please install KylinODBCDriver (x86).exe * For 64 bit Tableau Desktop: Please install KylinODBCDriver (x64).exe 3. Both drivers already be installed on Tableau Server, you properly should be able to publish to there without issues ## Use ODBC compatible applications 1. [Kylin and Tableau Tutorial](Kylin and Tableau Tutorial.md) 2. [Kylin and Excel Tutorial](Kylin and Excel Tutorial.md) ## Bug Report Open github issue here ======================================================================= ==docs/Tutorial/Kylin Web Tutorial.md ======================================================================= Kylin Web Tutorial === > **Supported Browsers** > Windows: Google Chrome, FireFox > Mac: Google Chrome, FireFox, Safari ## 1. Access & Login Host to access: http://your_sandbox_ip:7070/kylin Login with username/password: ADMIN/KYLIN ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/web%20tutorial/1%20login.png) ## 2. Available Hive Tables in Kylin Although Kylin will using SQL as query interface and leverage Hive metadata, kylin will not enable user to query all hive tables since it's a pre-build OLAP (MOLAP) system so far. To enable Table in Kylin, it will be easy to using "Sync" function to sync up tables from Hive. ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/web%20tutorial/2%20tables.png) ## 3. Kylin OLAP Cube > To make cubes availabe you'll have to create them first [Kylin Cube Creation Tutorial](Kylin Cube Creation Tutorial.md) Kylin's OLAP Cubes are pre-calculation datasets from Star Schema Hive tables, Here's the web management interface for user to explorer, manage all cubes.Go to `Cubes` Menu, it will list all cubes available in system: ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/web%20tutorial/3%20cubes.png) To explore more detail about the Cube * Form View: ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/web%20tutorial/4%20form-view.png) * SQL View (Underline Hive Query to generate the cube): ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/web%20tutorial/5%20sql-view.png) * Visualization (Showing the Star Schema behind of this cube): ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/web%20tutorial/6%20visualization.png) * Access (Grant user/role privileges, Grant operation only open to Admin in beta): ![](https://raw.githubusercontent.com/KylinOLAP/kylinolap.github.io/master/docs/web%20tutorial/7%20access.png) ## 4. Write and Execute SQL on web >> To make queries availabe you'll have to create are build cubes first [Kylin Cube Creation Tutorial](Kylin Cube Creation Tutorial.md) and [Kylin Cube Build and Job Monitoring Tutorial](Kylin Cube Build and Job Monitoring Tutorial.md) ======================================================================= ==docs/Tutorial/Quick play with a sample cube.md ======================================================================= ### Quick start with sample cube Kylin provides a script for you to create a sample Cube; the script will also create three sample hive tables: 1. Run ${KYLIN_HOME}/bin/sample.sh ; Restart kylin server to flush the caches; 2. Logon Kylin web, select project "learn_kylin"; 3. Select the sample cube "kylin_sales_cube", click "Actions" -> "Build", pick up a date later than 2014-01-01 (to cover all 10000 sample records); 4. Check the build progress in "Jobs" tab, until 100%; 5. Execute SQLs in the "Query" tab, for example: select part_dt, sum(price) as total_selled, count(distinct seller_id) as sellers from kylin_sales group by part_dt order by part_dt 6. You can verify the query result and compare the response time with hive; #### What's next After cube being built, you might need to: 1. [Query the cube via web interface](Kylin Web Tutorial.md) 2. [Query the cube via ODBC](Kylin ODBC Driver Tutorial.md) 3. [Grant permission to cubes](Kylin Cube Permission Grant Tutorial.md) ======================================================================= ==docs/website/_config-prod.yml ======================================================================= # kylin.apache.org baseurl: "" noindex: 0 # Make sure this gets indexed by Google ======================================================================= ==docs/website/_config.yml ======================================================================= # Site settings title: kylin.io email: dev@kylin.incubator.apache.org description: Apache Kylin Home baseurl: "" # the subpath of your site, e.g. /blog/ url: "http://kyli.io" # the base hostname & protocol for your site twitter_username: ApacheKylin github_username: KylinOLAP encoding: UTF-8 # Build settings markdown: kramdown # Permalinks, default is pretty permalink: pretty # Multiple Languages Plugin gems: ['jekyll-multiple-languages'] # Supported Languages languages: ['en','cn'] language_default: 'en' # If a post of default language not set `no_fill_default_content` to true # Its content will use to replace if the corresponding content of other languages is not exist. # fill_default_content: true ======================================================================= ==docs/website/_includes/head.cn.html ======================================================================= Apache Kylin | {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} ======================================================================= ==docs/website/_includes/head.html ======================================================================= Apache Kylin | {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} ======================================================================= ==docs/website/_includes/header.cn.html ======================================================================= ======================================================================= ==docs/website/_includes/header.html ======================================================================= ======================================================================= ==docs/website/_layouts/default-cn.html ======================================================================= {% include head.cn.html %} {% include header.cn.html %}
{{ content }}
{% include footer.html %} ======================================================================= ==docs/website/_layouts/default.html ======================================================================= {% include head.html %} {% include header.html %}
{{ content }}
{% include footer.html %} ======================================================================= ==docs/website/_layouts/page.html ======================================================================= --- layout: default ---

{{ page.title }}

{{ content }}
======================================================================= ==docs/website/_layouts/post.html ======================================================================= --- layout: default ---

{{ page.title }}

{{ content }}
======================================================================= ==docs/website/_posts/2015-01-25-introduce-data-model.md ======================================================================= --- layout: post title: "Introduce Data Model of Cube Designer" date: 2015-01-25 22:28:00 author: Luke Han categories: blog --- ### Background In previous version (before v0.6.4), Kylin introduced a GUI tool called Cube Designer for user (we called this role as __Cube Modeler__) to architect OLAP Cube with dimensions, measures and other settings. It works well for most of the features but still not user friendly yet: 1. A user has to add dimension one by one, considering there are 20+ even 50+ dimensions, the entire process is really boring. 2. Each dimension requires define join condition between fact table and lookup table which even already be defined in previous dimensions many times. 3. Less validation check, especially for Hierarchy and Derived dimension, there are many exceptions in further steps which blocked many people to save the cube definition without any idea about the issue. 4. Save/Next buttons are confusing user to click which one for real next step or just save current dimension settings ### Data Model of Cube Designer With the feedback from our internal users and external community, we have came up one idea and would like to introduce a new concept (widely known in Data Warehouse and Business Intelligence domain): Data Model: a data model organises data elements and standardises how the data elements relate to one another.[Wikipedia](http://en.wikipedia.org/wiki/Data_model). In Kylin, it using [Star Schema](http://en.wikipedia.org/wiki/Star_schema) as Data Model, which is the simplest style of data warehouse schema. The star schema consists of a few "fact tables" (possibly only one, justifying the name) referencing any number of "dimension tables". It actually already there behind dimensions and measures and now just come to first step to define the relationship between different tables before create each dimension. Now (after v0.6.4), to create a cube will follow below steps: 1. Define data model first: pick up one fact table and then add other lookup tables (with their join conditions). The data mode must be presents as Star Schema. 2. Then add dimensions, since all join conditions already presented in data model, each dimension could be more easy to create, just need to know what's kind of type: normal, hierarchy and derived (will have another blog to introduce them). There's also one helper called _Auto Generator_ to help generate many dimensions within simple clicks. 3. Then define measures and others as previous cube designer did ### Benefits 1. A data model is very easy to communicate between different roles and teams. Most of cases it just mapping to real database table relationship, like from Hive tables 2. More easy to create dimensions and measures based on the data model 3. Friendly error message with enhanced validation check when save cube ### What's Next After this refactor, Kylin is now be able to introduce more powerful features, the major idea is to using different storages to serve same data model: * __Logical Model__: A Data Model presents logical data structure like Star Schema beyond data tables with more business meaning * __Physical Model__: define how the underlying data to be stored in persistent system, like HBase. There are already two of them: MOLAP (current Kylin version) and InvertedIndex (coming with 0.7.x release). And it also easy to extend to support others without change the Logical Model. * A new GUI of Cube Designer to support above is on the way. ======================================================================= ==docs/website/_sass/_base.scss ======================================================================= /** * Reset some basic elements */ body, h1, h2, h3, h4, h5, h6, p, blockquote, pre, hr, dl, dd, ol, ul, figure { margin: 0; padding: 0; } /** * Basic styling */ body { font-family: $base-font-family; font-size: $base-font-size; line-height: $base-line-height; font-weight: 300; color: $text-color; background-color: $background-color; -webkit-text-size-adjust: 100%; } /** * Set `margin-bottom` to maintain vertical rhythm */ h1, h2, h3, h4, h5, h6, p, blockquote, pre, ul, ol, dl, figure, %vertical-rhythm { margin-bottom: $spacing-unit / 2; } /** * Images */ img { max-width: 100%; vertical-align: middle; } /** ======================================================================= ==docs/website/_sass/_layout.scss ======================================================================= /** * Site header */ .site-header { border-top: 5px solid $grey-color-dark; border-bottom: 1px solid $grey-color-light; min-height: 56px; // Positioning context for the mobile navigation icon position: relative; } .site-title { font-size: 26px; line-height: 56px; letter-spacing: -1px; margin-bottom: 0; float: left; &, &:visited { color: $grey-color-dark; } } .site-nav { float: right; line-height: 56px; .menu-icon { display: none; } .page-link { color: $text-color; line-height: $base-line-height; // Gaps between nav items, but not on the first one &:not(:first-child) { margin-left: 20px; } } @include media-query($on-palm) { position: absolute; top: 9px; right: 30px; background-color: $background-color; border: 1px solid $grey-color-light; border-radius: 5px; ======================================================================= ==docs/website/_sass/_syntax-highlighting.scss ======================================================================= /** * Syntax highlighting styles */ .highlight { background: #fff; @extend %vertical-rhythm; .c { color: #998; font-style: italic } // Comment .err { color: #a61717; background-color: #e3d2d2 } // Error .k { font-weight: bold } // Keyword .o { font-weight: bold } // Operator .cm { color: #998; font-style: italic } // Comment.Multiline .cp { color: #999; font-weight: bold } // Comment.Preproc .c1 { color: #998; font-style: italic } // Comment.Single .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special .gd { color: #000; background-color: #fdd } // Generic.Deleted .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific .ge { font-style: italic } // Generic.Emph .gr { color: #a00 } // Generic.Error .gh { color: #999 } // Generic.Heading .gi { color: #000; background-color: #dfd } // Generic.Inserted .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific .go { color: #888 } // Generic.Output .gp { color: #555 } // Generic.Prompt .gs { font-weight: bold } // Generic.Strong .gu { color: #aaa } // Generic.Subheading .gt { color: #a00 } // Generic.Traceback .kc { font-weight: bold } // Keyword.Constant .kd { font-weight: bold } // Keyword.Declaration .kp { font-weight: bold } // Keyword.Pseudo .kr { font-weight: bold } // Keyword.Reserved .kt { color: #458; font-weight: bold } // Keyword.Type .m { color: #099 } // Literal.Number .s { color: #d14 } // Literal.String .na { color: #008080 } // Name.Attribute .nb { color: #0086B3 } // Name.Builtin .nc { color: #458; font-weight: bold } // Name.Class .no { color: #008080 } // Name.Constant .ni { color: #800080 } // Name.Entity .ne { color: #900; font-weight: bold } // Name.Exception .nf { color: #900; font-weight: bold } // Name.Function .nn { color: #555 } // Name.Namespace .nt { color: #000080 } // Name.Tag .nv { color: #008080 } // Name.Variable .ow { font-weight: bold } // Operator.Word .w { color: #bbb } // Text.Whitespace .mf { color: #099 } // Literal.Number.Float .mh { color: #099 } // Literal.Number.Hex .mi { color: #099 } // Literal.Number.Integer .mo { color: #099 } // Literal.Number.Oct ======================================================================= ==docs/website/about/index.md ======================================================================= --- layout: default title: About ---

About Kylin

Video on Youtube: Apache Kylin

Apache Kylin, which is a distributed and scalable OLAP engine built on Hadoop to support extremely large datasets, developed and contributed by eBay Inc to open source community on Oct 1, 2014 and has been Apache Incubator Project since Nov 25, 2014. Refer to announcement on eBay Tech Blog for more detail: Announcing Kylin: Extreme OLAP Engine for Big Data

======================================================================= ==docs/website/assets/css/font-awesome.min.css ======================================================================= /*! * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} ======================================================================= ==docs/website/assets/css/styles.css ======================================================================= @font-face { font-family: 'HelveticaNeueLight'; src: url('../fonts/helveticaneue_lt.eot'); src: url('../fonts/helveticaneue_lt.eot') format('embedded-opentype'), url('../fonts/helveticaneue_lt.woff') format('woff'), url('../fonts/helveticaneue_lt.ttf') format('truetype'), url('../fonts/helveticaneue_lt.svg#HelveticaNeueLight') format('svg'); } @font-face { font-family: 'HelveticaNeueRegular'; src: url('../fonts/helveticaneue-webfont.eot'); src: url('../fonts/helveticaneue-webfont.eot') format('embedded-opentype'), url('../fonts/helveticaneue-webfont.woff') format('woff'), url('../fonts/helveticaneue-webfont.ttf') format('truetype'), url('../fonts/helveticaneue-webfont.svg#HelveticaNeueRegular') format('svg'); } /*@font-face { font-family: 'open_sanslight'; src: url('../fonts/opensans-light-webfont.eot'); src: url('../fonts/opensans-light-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/opensans-light-webfont.woff') format('woff'), url('../fonts/opensans-light-webfont.ttf') format('truetype'), url('../fonts/opensans-light-webfont.svg#open_sanslight') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'open_sansregular'; src: url('../fonts/opensans-regular-webfont.eot'); src: url('../fonts/opensans-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/opensans-regular-webfont.woff') format('woff'), url('../fonts/opensans-regular-webfont.ttf') format('truetype'), url('../fonts/opensans-regular-webfont.svg#open_sansregular') format('svg'); font-weight: normal; font-style: normal; } */ html { font-size: 100%; } body { font-size: 14px; font-size: 0.9375rem; font-family: 'Open sans', 'HelveticaNeueRegular', Arial, sans-serif; color: #666666; font-weight: 400; padding: 0; } .topspace { margin-top: 40px; ======================================================================= ==docs/website/assets/fonts/fontawesome-webfont.svg ======================================================================= ======================================================================= ==docs/website/assets/fonts/helveticaneue-webfont.css ======================================================================= @font-face { font-family: 'HelveticaNeueRegular'; src: url('helveticaneue-webfont.eot'); src: url('helveticaneue-webfont.eot') format('embedded-opentype'), url('helveticaneue-webfont.woff') format('woff'), url('helveticaneue-webfont.ttf') format('truetype'), url('helveticaneue-webfont.svg#HelveticaNeueRegular') format('svg'); } ======================================================================= ==docs/website/assets/fonts/helveticaneue-webfont.svg ======================================================================= Created by FontForge 20110222 at Thu Mar 6 12:16:42 2014 By Orthosie Webhosting Copyright (c) 1981, 1982, 1983, 1989 and 1993, Linotype Library GmbH or its affiliated Linotype-Hell companies. All rights reserved. The digitally encoded machine readable software for producing the Typefaces licensed to you is now the property of Heidelberger Druckmaschinen AG and its licensors, and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Heidelberger Druckmaschinen AG. Copyright (c) 1988, 1990, 1993 Adobe Systems Incorporated. All Rights Reserved. Created by FontForge 20110222 at Tue Mar 25 18:21:03 2014 By Orthosie Webhosting Copyright (c) 1988, 1990 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a registered trademark of Linotype AG and/or its subsidiaries. ======================================================================= ==docs/website/assets/fonts/opensans-light-webfont.svg ======================================================================= ======================================================================= ==docs/website/assets/fonts/opensans-regular-webfont.svg ======================================================================= ======================================================================= ==docs/website/assets/js/bootstrap.min.js ======================================================================= /*! * Bootstrap v3.2.0 (http://getbootstrap.com) * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('