LittleQ

爱好:写代码

刚接手个项目,从代码仓库里面直接clone下来,在idea里面运行的时候报错,但是直接在命令行用maven打包又没啥问题。所以我猜想这个错误应该只和idea这个ide有关,网上查了一圈发现并没有什么收获,后来参考一个正确的项目的结构配置把问题解决了,在这里记录一下.

问题特征就是几乎每一个类都会报标题那个错误,而且打开几个java文件,发现一片红,但是idea里面的以来显示jar包都导入了,但是就是无法识别,引入不了,直接打包没啥问题,但是想在Idea里面通过Tomcat里面来启动就会报错,最后也是查了很多资料没解决,在同事的帮助下解决了这个问题。

主要分两步

  • 项目结构不对

每一个Spring工程必须在Idea里面配置正确,不然有些路径的文件或者包可能读取不到,具体的看Project Structure里面的配置,可以找个正确的项目可以运行的参考参考,需要注意的地方是:

Modules: 这个地方的模块名和一些Source Roots还有web resource directories看看设置的有没有问题,还有Spring的配置,主要是路径这些配置

  • 打包问题

在idea里面打包有两个方式,一个是选war包,另一种是选exploded,这个要在Edit Configguration那看,记得要选第二种方式,即exploded,这个方式和第一个方式有啥不同:

1
2
3
4
# war
需要把这个包拷贝到tomcat服务器上,然后解压
# exploded
不需要拷贝解压,tomcat会直接读取我们项目的target里面的classes文件,做到调试可更新

由于本人经常在我的vps上下载东西上传到百度云,然后再下载到本地机器,平时的工作环境又是Ubuntu,官方没有提供百度盘的Linux版本,就算有如果不是非会员也很麻烦,限速很蛋疼,最快也就下300多k的速度.网上查了一下,虽然百度盘限速,但是不限下载线程,也就是说其实用浏览器去下载,百度官方限制你的单个http请求的速度,破解方法就是开多个线程,一般10个就够了,带宽够大可以再高点,只要机器扛得住。

安装步骤

需要安装一个软件以及一个chrome的插件

aria2

这个是Linux下面一个非常优秀的多线程下载工具,安装方法:

  • 安装aria2
1
sudo apt-get install aria2
  • 安装BaiduExporter

装了这个之后需要配合一个浏览器插件,因为百度盘的文件链接是不能直接下载的,需要安装下Chrome插件BaiduExporter,怎么安装Chrome插件就不细讲了,不懂的直接度娘。
备注: 如果是Mac用户可以参考这篇文章Aria2 - 可能是现在下载百度云资料速度最快的方式,由于主要讲Ubuntu下面的配置,这个就不多讲了.

  • 下载文件

安装好aria2以及BaiduExporter之后,我们以一个百度云里面的文件来做个测试:
下载文件链接
注意是勾选所需要下载的文件,然后会多出一个导出下载标签页,然后我们需要点列表中的导出下载,然后就会弹出一个框:
aria2下载链接框
把框里面的内容全部复制出来,直接丢到终端中执行,注意文件会保存到当前路径,如果你想保存到指定位置,还是先cd到指定目录吧.
下载的命令如下:

1
aria2c -c -s10 -k1M -x16 --enable-rpc=false -o 'Gantz.O.2016.720p.WEB-DL.AAC2.0.H.264 [MultiSub(Eng,Ita,Por,Rum,Swe,Tur)]v2.mkv' --header "User-Agent: netdisk;5.3.4.5;PC;PC-Windows;5.1.2600;WindowsBaiduYunGuanJia" --header "Referer: http://pan.baidu.com/disk/home" --header "Cookie: BDUSS=FDVnRtbnVaclhoR2dMLWdScHY2TlNFN1h3b3Qyb0stcXgtcXpyS0gtSFpXT3RZSVFBQUFBJCQAAAAAAAAAAAEAAAA7KQQU0KHHv7Tz0KG08wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANnLw1jZy8NYcD; pcsett=1489315049-753101e6547a834c2756fc96703e7839" "https://pcs.baidu.com/rest/2.0/pcs/file?method=download&app_id=250528&path=%2Fapps%2Fbypy%2FGantz.O.2016.720p.WEB-DL.AAC2.0.H.264%20%5BMultiSub(Eng%2CIta%2CPor%2CRum%2CSwe%2CTur)%5Dv2.mkv"

看看下载结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[#99b455 2.2GiB/2.2GiB(99%) CN:10 DL:148KiB ETA:1 *** Download Progress Summary as of Sat Mar 11 19:12:58 2017 *** 
================================================
[#99b455 2.2GiB/2.2GiB(99%) CN:10 DL:92KiB ETA:48s]
FILE: /home/anonymous/Gantz.O.2016.720p.WEB-DL.AAC2.0.H.264 [MultiSub(Eng,Ita,Por,Rum,Swe,Tur)]v2.mkv
------------------------------------------------

[#99b455 2.2GiB/2.2GiB(99%) CN:1 DL:19KiB ETA:13
03/11 19:13:57 [NOTICE] Download complete: /home/anonymous/Gantz.O.2016.720p.WEB-DL.AAC2.0.H.264 [MultiSub(Eng,Ita,Por,Rum,Swe,Tur)]v2.mkv

Download Results:
gid |stat|avg speed |path/URI
======+====+===========+=======================================================
99b455|OK | 1.2MiB/s|/home/anonymous/Gantz.O.2016.720p.WEB-DL.AAC2.0.H.264 [MultiSub(Eng,Ita,Por,Rum,Swe,Tur)]v2.mkv

Status Legend:
(OK):download completed.

**备注:**简单说明一下命令行里面的命令s10指下载的线程数为10.开始速度均值为2Mb/s,后面快完成的时候会慢下来,均速大概1.2Mb/s.

熟悉了怎么使用git,在基本了解了git的原理的基础上,要解决一些办法其实是知道一些方案的,只是有时候我们对git的众多命令记得不是那么熟。其实常用的一些场景也就那么几个,出了问题也一般就那些,记录一下,方便日后查找。

merge错了分支

有时候我们在自己的分支A上开发了一段时间,然后我们想把B分支merge到我们的分支A上,然后测试完没啥问题就把此次的结果一起merge到master上。但是在操作的时候不小心把master先merge到了分支A,如果再去merge分支B,那按照正常的流程,只能先把第一次的merge冲突解完了然后才能去merge分支B,然后再解冲突。这样就完全乱了,如何撤销某次merge呢,即让各个分支回到merge之前的状态?

  • reset直接重置到merge之前的版本号

此方法比较暴力,即抛弃掉merge之前那个版本号之后的所有提交,如果你在merge之后没有做什么其他的操作,可以直接简单一点,舍弃掉后面的所有提交,不会产生新的commit.

1
2
git checkout branch-A
git reset --hard <merge前的版本号>

**备注:**其实reset的意思就是用把当前分支的指针设置为你制定的那个版本号,以此达到还原或者说撤销目的。

  • git revert 撤销之前的merge操作

如果你在merge错了之后并没有立即发现,然后又提交了几次,然后才发现合并错了,这个时候就不能重置舍弃掉merge后面的提交了,可以使用revert只撤销掉merge那次的变更,此次操作会产生一个commit.

1
git revert -m <用1或2指定需要保留的主线> <需要撤销的合并的sha版本号>

备注: 分支的编号一般是按时间顺序决定的,parent分支是1,后面的那个分支是2.这个方法比较绕,一般不会用这个。

  • git revert一般做法

一般我们的解决办法其实只是处理我们弄错了的分支,因为虽然我们合并错了,但是master,分支B都是好的,没有多余的提交的,我么你只需要把分支A的问题搞定就行了,此操作也会产生一个新的commit:

1
git revert <merge操作的版本号>

Git仓库无权限

这个问题会经常出现,就算是很多用了好几年的程序员,有时候在出现这个问题的时候也不知道怎么解决,一般也就是去网上查一下,然后照着帖子里面弄一下,如果可以了,就再也不管了,如果不行,就接着找,试下一个方法,反正就这么一直试,试到后面总会莫名奇妙的解决了。如果实在不行可能就放大招重装系统或者git了。其实出现这个问题的根本原因就是ssh私钥和公钥的问题,要么是找不到,要么是找到了文件的权限不对.所以在出现这个问题的时候就知道怎么解决了.
首先得说明一下下面的两个命令的区别:

1
2
sudo git pull	// 读取的配置文件为/root/.ssh/id_rsa
git pull // 读取的配置文件为~/.ssh/id_rsa

可以试一下有什么区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
debug1: identity file /home/anonymous/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /home/anonymous/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/anonymous/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/anonymous/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/anonymous/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/anonymous/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/anonymous/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/anonymous/.ssh/id_ed25519-cert type -1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0

不同权限加载的文件是不一样的,所以为了知道问题出在哪,首先你得知道在和git仓库同步代码的时候加载的是哪个地方的秘钥文件.
知道了加载哪个地方的文件之后,还有一个很重要的问题需要知道,秘钥文件的权限必须是600,很多时候可能关键的问题还是因为秘钥文件的权限不对

切换相关

切换有很多,主要是分支切换,版本切换以及文件的切换

  • 不同分支间文件切换
1
git checkout <branch_name> -- <paths>

尝鲜使用了一段时间的fedroa,大概使用了一个月吧,之前一直是使用的Ubuntu 16.04,想着和服务器上的CentOS尽量保持一致就装了个Fedroa 25最为日常开发机器,大概用了一个月就放弃了,说句实话,不是很好用,引用一句在stackoverflow上的答案吧,我觉得确实说的很有道理,问题大概是Ubuntu和Fedroa有什么区别,我相信很多同时用过这两个系统的人都可能会问这个问题,那就是作为桌面开发机来说,到底选那个,或者又说这两者都是桌面环境的Linux,哪个更适合作为日常开发使用?

1
Ubuntu的使命是使Linux对人更友好,更易于交互

其实你都不可否认,Ubuntu应该是目前为止非常稳定的一个Linux桌面开发环境,这句话在我使用了一个月的Fedroa之后感受尤为深刻。

虽然也能用。碰到了各种问题,花了很多的时间,所以想记下来这些解决的笔记。

系统Fedroa 25 64bit,以下操作都是在此基础上,其他系统仅做参考。可以先把源设置成阿里的源,那个源比较快。

mysqldb-python

安装mysqldb报错,错误信息如下:

1
2
gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory
error: command 'gcc' failed with exit status 1

解决方案在stackoverflow上,链接为:
http://stackoverflow.com/questions/34624428/g-error-usr-lib-rpm-redhat-redhat-hardened-cc1-no-that-file-and-directory

vim

fedora直接安装vim是会失败的,这个实在是太操蛋了解决方案,先更新系统自带vi,然后才能装.
好不容易装好了之后发现,vim里面的东西没有办法用鼠标选中复制到剪贴板,解决方案:
http://vi.stackexchange.com/questions/84/how-can-i-copy-text-to-the-system-clipboard-from-vim

右键菜单打开终端

之前用Ubuntu一直没觉得这个功能有多么贴心,直到Fedroa中右键菜单没了这个才发现没了这个功能好麻烦,有时候就像在当前目录打开一个终端,还必须打开一个然后一路cd到当前目录,解决方案:
right clik open terminnal

启动栏快捷键

有时候需要把常用的一些应用固定在左侧启动栏,但是有些解压的软件好像无法Add favourate,此时可以手动编辑

1
~/.local/share/applications

下面的xxxx.desktop文件,照着写一个就行.
然后写完了可以用系统自带命令验证一下:

1
desktop-file-install xxx.desktop

sougo中文输入法

中文社区有源:https://www.fdzh.org/blog/2015/10/18/fedora-sougoupinyin/

同步盘

公司把所有外网的网盘封了,内部提供的网盘是ownCloud,安装客户端程序:
地址:https://software.opensuse.org/download/package?project=isv:ownCloud:desktop&package=owncloud-client

取消左下角托盘

TopIcons

1
dnf install gnome-tweak-tool

然后照着github上来:
https://github.com/phocean/TopIcons-plus

fedroa截屏

The default behaviour when pressing the PrintScreen key is to automatically place your screenshot in the Pictures folder in your home directory (i.e. “~/Pictures”). The click and the flash mean that the screenshot has been taken, so just check the Pictures folder for your screenshot.

Other than just the “Print Screen’ key, which saves your whole Desktop to the Pictures folder, GNOME3 also has the following shortcuts enabled by default for screenshot actions:

PrintScreen – Takes a screenshot of your entire desktop and saves it to the Pictures folder.

1
2
3
4
5
6
Alt + PrintScreen -- Saves a screenshot of the focused window to the Pictures Folder
Shift + PrintScreen -- Lets you select an area of the screen, and saves to the Pictures Folder
Ctrl + PrintScreen -- Takes a screenshot of your entire desktop and copies it to the clipboard.
Ctrl + Alt + PrintScreen -- copies a screenshot of the focused window to the clipboard.
Ctrl + Shift + PrintScreen -- Lets you select an area of the screen, and copies it to the clipboard.
Ctrl + Shift + Alt + R -- Records a Screencast) of your entire desktop and saves it to your Videos folder.

fedroa ssh server

安装完之后执行:

1
systemctl start sshd

安装mysql

这个最蛋疼,装完了还有一堆配置非常的麻烦。
https://www.if-not-true-then-false.com/2010/install-mysql-on-fedora-centos-red-hat-rhel/
如果无法初始化用户的密码,可以在mysql中试试下面的命令:

1
2
update user set authentication_string=password('Root@123') where user='root' and host='localhost';
FLUSH PRIVILEGES;

**备注:**其实可以多折腾一下,但是说实话吧,这个系统的桌面版真的不好用,装个软件非常不方便,尤其是mysql.

基本上每次在不同的机器上使用MySQLdb-python包都会出莫名奇妙的问题,总结一下,基本上就是fedora,ubuntu,centos这三个系统上的各种问题,其他系统我没有试过,所以以上是使用的前提。

前段时间折腾fedora上安装这个特别麻烦,主要是安装mysql比较麻烦,而且好不容易安装好了,设置密码也非常麻烦,本来就是本机做个简单的测试,太简单的密码还不让过,反正吧,用起来挺麻烦的。后来我就不折腾了,又换回了ubuntu了。
问题就出在这里,之前一直是用的virtualenv虚拟python环境做项目开发,python环境一直都是直接放在当前项目目录下的,所以有些项目我都放在公共的单独目录,以前一直用ubuntu,系统没变过,所以重装系统了虚拟环境都没啥问题,项目都可以直接运行。直到这次把系统从fedora切回ubuntu终于出现了问题,具体为:明明安装并且识别了MySQLdb-python,但是运行项目就报错,开始是由于没有安装mysql报错:

1
ImportError: libmysqlclient.so.18: cannot open shared object file: No such file or directory

然后安装mysql,装好了之后再运行还是报错,网上

服务器上用virtualenv部署安装matplotlib,始终无法安装,错误日志如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
freetype: no  [The C/C++ header for freetype2 (ft2build.h)

could not be found. You may need to install the

development package.]

png: no [pkg-config information for 'libpng' could not

be found.]

qhull: yes [pkg-config information for 'qhull' could not be

found. Using local copy.]

安装缺失依赖:

1
sudo yum install freetype

之后重新安装还是不行,彻底解决方案为:

1
sudo yum -y install freetype freetype-devel libpng-devel

在有些时候,想要控制hql执行的mapper,reducer个数,reducer设置过少,会导致每个reducer要处理的数据过多,这样可能会导致OOM异常,如果reducer设置过多,则会导致产生很多小文件,这样对任务的执行以及集群都不太好.通常情况下这两个参数都不需要手动设置,Hive会根据文件的大小和任务的情况自动计算,但是某些特殊情况下可能需要进行调优,下面列举两个常用的调优场景看看这两个参数在调优的时候都是怎么用的:

设置reducer个数

reducer个数最直接的影响是hql执行完之后生成的文件个数,假设你的任务有n个reducer,那么最后可能会生成的文件肯定至少有n个,前提是你没有设置合并小文件,这个有什么用处呢?最简单的一个用处是我们在hive里面经常会调第三方接口来获取数据,例如解密之内的,假设接口不限速,我们在udf里面调接口的时候会发现特别慢,感觉直接select很快,但是把查询结果insert到一个表保存就很慢,这个原因就在于数据请求线程太少了。
在hadoop里面,一个文件至少会起一个mapper,如果你的文件很小(默认1G起一个mapper),那就完了,整个任务就一直是一个个来请求接口的,所以非常的慢。那如果想加快接口的调用呢?其实也简单,把文件分成几个小文件,假设分成了10个小文件,那么再次调接口就会快很多了,10线程和单线程的差别还是非常大的。
具体的语句也就两句话,记住,划分小文件还得保证每个文件尽量大小一样。

1
2
3
4
5
6
7
set mapred.reduce.tasks=50;
insert into table xxx
select
*
from
xxx
distribute by rand();

**备注:**第一个set设置的就是最后你要生成的文件个数,后面的distribute by rand()保证了记录随机分配到50个文件,不管里数据量有多小,最后这50个文件的大小应该是一致的.

动态分区产生小文件

有些场景会产生大量的文件,比如动态分区插入,或者两个比较大的表做join,对于大表做join,我没有细测,但是我发现我用一个很小的表(大概70M),去join一个很大的表(大概400G),由于Hive在处理小表join大表的时候会做优化,左边的表会都加载到内存里面,然后分发到各个节点和大表做join,这样最后就会在大表所在的节点产生最终的结果,后果就是会原来大表的那些文件现在都变成小文件了,小文件太多其实对性能还是有影响的,这个其实可以最后用一个reducer来合并小文件。
主要说一下动态分区产生小文件问题,这是个很有意思的问题,动态分区好用,但是为啥会产生这么多小文件。原因就在于,假设动态分区初始有N个mapper,那么最后生成了m个分区,最终会有多少个文件生成呢?答案是N*m,是的,每一个mapper会生成m个文件,就是每个分区都会对应一个文件,这样的话你算一下。所以小文件就会成倍的产生。怎么解决这个问题,通常处理方式也是像上面那样,让数据尽量聚到一个reducer里面,因为有时候虽然动态分区不会产生reducer,但是也就意味着最后没有进行文件合并,我们也可以用distribute by rand()这句来保证数据聚类到相同的reducer。

DataTables这个插件功能非常强大,也很灵活,所以这里介绍一下几个项目里用到的常用操作,基本使用可以参考上一篇DataTables使用样例

改变列渲染方式

有时候需要给某些列单独渲染,或者在已有基础上增加一点特效,类似于状态之类的,比如:
改变列渲染模式
像这种可能状态列可能就是个0,1,2枚举值,需要根据不同的枚举值显示不同的效果,普通情况下当然就是显示数字了,现在假设状态列返回True/False代表激活/未激活,实现效果的部分具体代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var myTable = $('#dynamic-table').DataTable({
"bDestroy": true,
//"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "xxxxx",
"fnServerData": function (sSource, aoData, fnCallback) {
$.ajax({
'dataType': 'json',
'type': 'POST',
'url': sSource,
'data': aoData,
'success': fnCallback
});
},
"columnDefs": [
{
"render": function (data, type, row) {
if (data == true) {
return '<span class="label label-sm label-success">激活</span>'
} else {
return '<span class="label label-sm label-inverse">未激活</span>'
}
},
"targets": 2
}
],

参数解释:

参数 含义
data 单元格的实际值,这里为0/1,即True/False
targets 指定的是哪一列,下标从0开始,即你指定了哪一列,data就是那一列的值了
row 表格一行的值

最后的效果就像上面那样了。

单元格填充控件

有时候表格的元素是控件而不是简单的字符串填充,并且这个控件还必须有对应的事件监听,这个时候也可以使用上面的方法同样来实现,现在假设我要给表格的最后一列添加两个按钮,这两个按钮可以操作这行的元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var edit_str =
'<div class="hidden-sm hidden-xs btn-group">' +
'<button id="edit" class="btn btn-xs btn-success">' +
'<i class="ace-icon fa fa-pencil-square-o bigger-120"></i>' +
'</button>' +
'<button id="delete" class="btn btn-xs btn-danger">' +
'<i class="ace-icon fa fa-trash-o bigger-120"></i>' +
'</button>' +
'</div>'

//initiate dataTables plugin
var myTable = $('#dynamic-table').DataTable({
bAutoWidth: false,
"columnDefs": [
{
"render": function (data, type, row) {
row.edit = edit_str // 往每一行最后一列添加一个属性,即一列
if (data == true) {
return '<span class="label label-sm label-success">激活</span>'
} else {
return '<span class="label label-sm label-inverse">未激活</span>'
}
},
"targets": 2
}
],

看一下最后的显示效果:
单元格填充控件
进一步需要给这两个按钮添加操作,例如编辑按钮可以编辑状态,删除按钮会删除这一行,注意我们添加的两个按钮的id分别为edit,delete,表格的id为dynamic-table:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$('#dynamic-table tbody').on('click', 'button#edit', function () {
var data = myTable.row($(this).parents('tr')).data();

$.ajax({
url: "xxx",
type: "POST",
dataType: "json",
data: data
}).done(function (resp) {
if (resp.ret == true) {
myTable.ajax.reload();
} else {
alert("编辑失败!")
}
}).fail(function () {
alert("网络错误!")
});
});


$('#dynamic-table tbody').on('click', 'button#delete', function () {
var data = myTable.row($(this).parents('tr')).data();

var title_msg;
var text_msg;
$.ajax({
type: "post",
url: "xxxx",
dataType: "json",
data: data,
success: function (resp) {
if (resp.ret) {
alert("成功删除!");
myTable.ajax.reload();
}
} else {
alert("删除失败!");
}
}
});
})

最近貌似用Kylin来搭建OLAP数据分析已经成为了大多数公司采取的做法了,这个东西搭建起来还有些=麻烦,因为它需要你先配置好Hadoop,Hive,Hbase这三个东西,任何一个配置的不对的话可能会出问题,下面介绍一下我的安装和配置过程

环境准备

主要是依赖的环境的一些版本

1
2
3
4
5
6
OS: Ubuntu 16.04 64bit
Java: 1.7.0_40
Hive: 2.1.0
Hadoop: 2.6.4
Hbase: 0.98.22-hadoop2
Kylin: 1.5.4.1

**备注:**这里Hbase并没有用官方的1.x版本,而是采用了Kylin官方建议的0.98版本,因为我第一次安装的时候由于hbase的问题而失败了,所以就换了一个低版本的,你在安装的时候也可以使用最新版,但是如果安装不成功,可以考虑采纳官方建议的组合版本

安装步骤

Hadoop,Hive,Hbase的安装这里就不讲了,可以参考我以前的文章,我采用的都是本地为分布式运行模式,去Kylin官方下载最新版本:

1
sudo tar -xvf apache-kylin-1.5.4.1-bin.tar.gz -C /usr/dev

解压好了,然后就是配置环境变量了,注意我都配置在/etc/profile这个文件里面了,主要是有些时候环境变量读取不到,所以干脆来个最狠的,直接全局配置了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
### 大数据相关
## Hbase
export HBASE_HOME=/usr/dev/hbase-1.2.3
export HBASE_CONF_DIR=${HBASE_HOME}/conf

## Hadoop
export HADOOP_HOME=/usr/dev/hadoop-2.6.4
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop

## Hive
export HIVE_HOME=/usr/dev/apache-hive-2.1.0-bin
export HCAT_HOME=${HIVE_HOME}/hcatalog
export HIVE_CONF=${HIVE_HOME}/conf

## Kylin
export KYLIN_HOME=/usr/dev/apache-kylin-1.5.4.1-bin

上面的目录如果不一致,改成你自己对应的目录,然后source /etc/profile使配置生效。

配置Kylin

配置Kylin使用Hive的数据库名

1
2
3
cd ${KYLIN_HOME}/conf
vim kylin.properties
kylin.job.hive.database.for.intermediatetable=kylin_middle

然后记得要手动在Hive中创建数据库kylin_middle.

然后创建一个目录并赋给当前用户权限,假设当前用户为anonymous:

1
2
hadoop fs -mkdir /kylin
hadoop fs -chown -R anonymous:anonymous /kylin

然后检测一下Kylin的环境变量:

1
2
cd ${KYLIN_HOME}/bin
./check-env.sh

如果你的系统也报错:

1
2
3
4
5
6
KYLIN_HOME is set to /usr/dev/apache-kylin-1.5.4.1-bin
cat:无效选项 -- 1
Try 'cat --help' for more information.
-mkdir: Not enough arguments: expected 1 but got 0
Usage: hadoop fs [generic options] -mkdir [-p] <path> ...
failed to create , Please make sure the user has right to access

那可能也是由于sh调用的问题,需要把所有sh脚本里面的sh替换成bash,我这里用sed命令来替换:

1
sed -i 's/`sh /`bash /g' *.sh

这样就把所有的替换了,并且替换结果也直接写回文件了.然后运行环境检测脚本

1
./check-env.sh

如果没报什么错误,就可以正式运行了,记得先把hadoop hbase服务启动
然后再启动kylin

1
./kylin.sh start

然后访问127.0.0.1:7070/kylin
第一次会有点儿慢,需要在hbase中创建表,稍微等大概10s就会弹出登陆界面
ADMIN/KYLIN登陆就可以了

测试运行

官方也提供了官方测试例子,如果你可以顺利登入系统,那么在${KYLIN_HOME}/bin下面有个测试脚本sample.sh,运行这个脚本

1
2
3
4
cd ${KYLIN_HOME}/bin
./sample.sh
./kylin.sh stop
./kylin.sh start

一次执行上面三个命令,运行成功之后重新进入系统或者刷新即可,会有一个learn_kylin工程,你只需要在Model里面Actions里面Build这个Cube即可,然后在Monitor里面可以看编译的进度,只有到100%才说明你编译成功,双击可以查看每一步的编译具体步骤,可以查看具体的日志,如果你编译失败了,可以查看具体的日志,直到编译成功为止,然后在Insight里面可以写sql查询:

1
select part_dt,sum(price) from kylin_sales group by part_dt;

可以看看这句,这个放到hive里面起码要30s,但是这个在Kylin里面基本就秒出结果了,Kylin提供的是sql接口,下一节讲一讲怎么集成上层的多维分析工具。

单机安装OLAP Kylin多维数据分析工具,Kylin依赖Hadoop,Hive,Hbase这三个,之前安装过前面两个,所以只用装一个Hbase就可以了,也是单机/伪分布式这种模式

系统环境

1
2
3
4
5
OS: Ubuntu 16.04 LTS 64bit
JDK: 1.7.0_40
Hadoop:hadoop-2.6.4
➜ Blog git:(master) ✗ whoami
anonymous

安装步骤

首先去官网Hbase下载地址,可以下载编译好的hbase-1.2.3-bin.tar.gz,也可以下载源码自己编译,我下载源码版hbase-1.2.3-src.tar.gz自己编译的,其他的应该都一样,下载之后解压编译:

1
2
3
tar -xvf hbase-1.2.3-src.tar.gz -C /usr/dev
cd /user/dev/hbase-1.2.3
mvn package -Dmaven.test.skip=true # 跳过单元测试,不然测试时间会非常长

配置hbase,当前目录默认是/usr/dev/hbase-1.2.3.

单机版

先编辑conf/hbase-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<property>
<name>hbase.rootdir</name>
//这里设置让HBase存储文件的地方
<value>file:///tmp/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
//这里设置让HBase存储内建zookeeper文件的地方
<value>/tmp/zookeeper</value>
</property>
</configuration>

然后启动hbase:

1
./bin/start-hbase.sh

看看是否成功启动:

1
2
3
4
➜  hbase-1.2.3 jps
22228 Jps
2738 Main
21914 HMaster

如果有HMaster就说明启动成功了,然后可以访问web界面了:

1
http://127.0.0.1:16010/

**注:**不同的版本可能端口号不一致,具体的如果访问不了,网上查一下看看你的版本是那个端口号.

伪分布式

先把hbase停掉./bin/stop-hbase.sh,然后修改conf/hbase-env.sh文件:

1
HBASE_MANAGE_XK=true

然后重新修改conf/hbase-site.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>
<property>
<name>hbase.rootdir</name>
//这里设置让HBase存储文件的地方
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
//这里设置让HBase存储内建zookeeper文件的地方
<value>/tmp/zookeeper</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>

**注:**上面的hbase.rootdir配置的hdfs路径以及端口要和/usr/dev/hadoop-2.6.4/etc/hadoop/core-site.xml一致:

1
2
3
4
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>

然后再次启动hbase,出现如下报错情况:

1
2
3
4
5
6
7
8
9
10
localhost: +======================================================================+
localhost: | Error: JAVA_HOME is not set |
localhost: +----------------------------------------------------------------------+
localhost: | Please download the latest Sun JDK from the Sun Java web site |
localhost: | > http://www.oracle.com/technetwork/java/javase/downloads |
localhost: | |
localhost: | HBase requires Java 1.7 or later. |
localhost: +======================================================================+
starting master, logging to /usr/dev/hbase-1.2.3/bin/../logs/hbase-anonymous-master-anonymous.out
starting regionserver, logging to /usr/dev/hbase-1.2.3/bin/../logs/hbase-anonymous-1-regionserver-anonymous.out

出现这个问题一般是配置的问题,可以直接在环境变量文件里面强制配置一下,编辑conf/hbase-env.sh文件,把原来的注释解解掉,改成下面这样:

1
export JAVA_HOME=/usr/dev/jdk1.7.0_40

然后记得得先把本机的hadoop伪分布式集群启动:

1
2
3
4
cd /usr/dev/hadoop-2.6.4
./sbin/start-dfs.sh
./sbin/start-yarn.sh
./sbin/mr-jobhistory-daemon.sh start historyserver

然后才能启动hbase

1
2
cd /usr/dev/hbase-1.2.3
./bin/start-hbase.sh

查看一下是否启动成功:

1
2
3
4
5
6
7
8
9
10
11
12
➜  hbase-1.2.3 jps
26874 HRegionServer
24854 SecondaryNameNode
26087 HQuorumPeer
25125 NodeManager
24529 NameNode
26160 HMaster
24671 DataNode
2738 Main
25312 JobHistoryServer
25008 ResourceManager
27040 Jps

看到如果有HMaster以及HRegionServer说明启动成功.
**注:**如果又类似这种提示:

1
regionserver running as process 23997. Stop it first.

可以直接先kill掉:

1
sudo kill -9 23997

启动成功之后也会看到hdfs目录:

1
hdfs dfs -ls /hbase
0%