##前言

Kylin的官网上,关于安装部分,只有寥寥数语,但是很多人在安装Kylin的时候,都遇到各种问题。那么这个到底是什么情况呢? 原因很简单:Kylin的check-env.sh,有点弱。很多时候,用户在安装kylin时候,并没有花太多时间去准备基础环境,匆匆忙忙就开始安装了,然后依赖于check-env.sh来检查环境,以为通过了就肯定没事。最后就陷入各种莫名其妙的错误,无法自拔。

##前提条件

Kylin的安装关键,并不在Kylin本身,而是在基础环境。Kylin依赖4大组件,hdfs,hive,hbase和zookeeper。Kylin能不能正常运行,和上述4大组件是否运行正常,以及是否能够在安装Kylin的主机上,以客户端方式正常访问,有着莫大的关系。

  1. 和hdfs的关系
    kylin依赖于hdfs存储数据,所以kylin要有hdfs的写权限,必须有/kylin目录
  2. 和hive的关系
    kylin需要在hive里建表,所以必须有hive的建表权限
  3. 和yarn的关系
    kylin的作业都是map reduce作业,是通过yarn管理的。kylin会读取yarn中作业的状态,以判断作业的状态。yarn的history log如果没有配好,会导致kylin无法找到单步作业运行的正确状态,结果无法转到下一步。

##安装步骤

环境检查

#hdfs检查
#使用hadoop命令,检查集群上的配置
hadoop fs -ls /kylin #检查是否有kylin目录
hadoop fs -ls /user/history #检查是否有history目录
#hive检查
#使用hive或者beeline登录集群

应用安装

  1. 下载最新的包,这个没有问题。
cd /usr/local/bin
wget http://apache.fayea.com/kylin/apache-kylin-1.6.0/apache-kylin-1.6.0-cdh5.7-bin.tar.gz
tar zxvf apache-kylin-1.6.0-cdh5.7-bin.tar.gz
  1. 执行检查程序
# /usr/local/bin/apache-kylin-1.6.0-cdh5.7-bin/bin.check-env.sh

提示permission denied的错误。原来此处要用hadoop用户,才能在hdfs上创建目录。别看你是系统管理员,一样权限不足。解决的方法是:

```
su - hdfs
/usr/local/bin/apache-kylin-1.6.0-cdh5.7-bin/bin.check-env.sh
```

这次就检查通过了。

kylin的文档,真的不怎么样,所以只能自己去找答案.

踩坑之用户管理

Kylin的用户管理,居然没有文档,只有一个很简单的faq里,很隐晦的提了一句。 Kylin采用多种方式管理用户。最简单的是自己在配置文件里管理用户。用户名是明文,密码是经过encode的密文。 具体的配置文件为:/opt/apache-kylin-2.0.0-bin/tomcat/webapps/kylin/WEB-INF/classes/kylinSecurity.xml 要修改的地方在:

<beans profile="testing">
        <util:list id="adminAuthorities"
                   value-type="org.springframework.security.core.authority.SimpleGrantedAuthority">
            <value>ROLE_ADMIN</value>
            <value>ROLE_MODELER</value>
            <value>ROLE_ANALYST</value>
        </util:list>
        <util:list id="modelerAuthorities"
                   value-type="org.springframework.security.core.authority.SimpleGrantedAuthority">
            <value>ROLE_MODELER</value>
            <value>ROLE_ANALYST</value>
        </util:list>
        <util:list id="analystAuthorities"
                   value-type="org.springframework.security.core.authority.SimpleGrantedAuthority">
            <value>ROLE_ANALYST</value>
        </util:list>

        <bean class="org.springframework.security.core.userdetails.User" id="adminUser">
            <constructor-arg value="ADMIN"/>
            <constructor-arg
                    value="$2a$10$o3ktIWsGYxXNuUWQiYlZXOW5hWcqyNAFQsSSCSEWoC/BRVMAUjL32"/>
            <constructor-arg ref="adminAuthorities"/>
        </bean>
        <bean class="org.springframework.security.core.userdetails.User" id="modelerUser">
            <constructor-arg value="MODELER"/>
            <constructor-arg
                    value="$2a$10$o3ktIWsGYxXNuUWQiYlZXOW5hWcqyNAFQsSSCSEWoC/BRVMAUjL32"/>
<!--
                    value="$2a$10$Le5ernTeGNIARwMJsY0WaOLioNQdb0QD11DwjeyNqqNRp5NaDo2FG"/>
-->
            <constructor-arg ref="modelerAuthorities"/>
        </bean>
        <bean class="org.springframework.security.core.userdetails.User" id="analystUser">
            <constructor-arg value="ANALYST"/>
            <constructor-arg
                    value="$2a$10$o3ktIWsGYxXNuUWQiYlZXOW5hWcqyNAFQsSSCSEWoC/BRVMAUjL32"/>
<!--
                    value="$2a$10$s4INO3XHjPP5Vm2xH027Ce9QeXWdrfq5pvzuGr9z/lQmHqi0rsbNi"/>
-->
            <constructor-arg ref="analystAuthorities"/>
        </bean>

        <bean id="kylinUserAuthProvider"
              class="org.apache.kylin.rest.security.KylinAuthenticationProvider">
            <constructor-arg>
                <bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
                    <property name="userDetailsService">
                        <bean class="org.springframework.security.provisioning.InMemoryUserDetailsManager">
                            <constructor-arg>
                                <util:list
                                        value-type="org.springframework.security.core.userdetails.User">
                                    <ref bean="adminUser"></ref>
                                    <ref bean="modelerUser"></ref>
                                    <ref bean="analystUser"></ref>
                                </util:list>
                            </constructor-arg>
                        </bean>
                    </property>
                    <property name="passwordEncoder" ref="passwordEncoder"></property>
                </bean>
            </constructor-arg>
        </bean>

        <!-- user auth -->
        <bean id="passwordEncoder"
              class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

        <scr:authentication-manager alias="testingAuthenticationManager">
            <!-- do user ldap auth -->
            <scr:authentication-provider ref="kylinUserAuthProvider"></scr:authentication-provider>
        </scr:authentication-manager>
    </beans>