首页 > 代码库 > 大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

 

上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析Demo”啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货,目的只有一个,就是让每一个伙伴都能根据本篇向导搭建出一个“即席查询与分析Demo”。

        为了让各位伙伴能够尽快上手体验,所选案例就以上一篇中的“机动车缉查布控即席查询与分析”为例,上篇我们已经比较详尽的分析了用户需求,没好好听课的小伙伴赶紧把“大数据即席查询与分析(中篇)”再好好复习一下,这里不再赘述。需要特别强调是,为了尽量降低大家搭建Demo的门槛,主要是为了让大家充分了解到Demo搭建的过程;另外,请大家务必按照如下步骤严格执行,任何一个参数的问题都可能引起后续的问题。

 

一、原材料准备

硬件环境:大数据环境搭建,强烈建议使用物理机

如果实在没有条件,每个虚拟机配置不要低于4核,32G,否则严重影响效果。

本次Demo采用如下配置服务器3台

硬件配置项

详细信息

机器型号

IBM 3650 M3(某宝上2000大洋搞定)

CPU

2C*6核

内存

DDR3 64GB

数据盘

SAS盘 300G 6块裸盘挂载

Raid 配置

RAID 0

网卡

千兆网卡

交换机

TPLINK千兆普通交换机

软件环境:不必到处找了,下载地址:http://url.cn/42R4CG8

软件配置项

详细信息

操作系统

CentOS 6.6

hadoop版本

HDP 2.5

延云ydb版本

YDB 1.1.6

测试用例:

测试数据

详细信息

数据条数

1亿条

原始文本数据大小

5G

 

 

 

二、操作系统安装与配置

推荐安装Centos 6.5或6.6的操作系统(不要使用centos7哦),选择安装英文语言环境,安装桌面版(不要安装最简版)。

1.       配置机器名及hosts域名解析

规划三台机器为ydbmaster,ydbslave01, ydbslave02

在每台机器上按照相应名字修改:

hostname ydbmaster

vi /etc/sysconfig/network

vi /etc/hosts

切记hosts文件中 不要将localhost给注释掉,并且配置完毕后,执行下 hostname -f 看下 是否能识别出域名

2.       在每台机器上修改Ulimit配置

操作系统默认只能打开1024个文件,打开的文件超过这个数发现程序会有“too many open files”的错误,1024对于大数据系统来说显然是不够的,如果不设置,基本上整个大数据系统是“不可用的”,根本不能用于生产环境。

配置方法如下:

echo  "* soft    nofile  128000" >>/etc/security/limits.conf

echo  "* hard    nofile  128000" >>/etc/security/limits.conf

echo  "* soft    nproc  128000" >>/etc/security/limits.conf

echo  "* hard    nproc  128000" >>/etc/security/limits.conf

cat / etc /security/limits.conf

sed -i ‘s/1024/unlimited/‘/etc/security/limits.d/90-nproc.conf

cat /etc/security/limits.d/90-nproc.conf

ulimit -SHn 128000

ulimit -SHu 128000

3.       在每台机器上一定要禁用Swap

       在10~20年前一台服务器的内存非常有限,64m~128m,所以通过Swap可以将磁盘的一部分空间用于内存。但是现今我们的服务器内存普遍达到了64G以上,内存已经不再那么稀缺,但是内存的读取速度与磁盘的读取相差倍数太大,如果我们某段程序使用的内存映射到了磁盘上,将会对程序的性能造成非常严重的影响,甚至导致整个服务的瘫痪。

       禁用方法如下,让操作系统尽量不使用swap:

echo  "vm.swappiness=1" >>/etc/sysctl.conf

sysctl -p

sysctl -a|grep swappiness

4.       在每台机器上修改网络配置优化

echo  " net.core.somaxconn = 32768 " >>/etc/sysctl.conf

sysctl –p

sysctl -a|grep somaxconn

5.       在每台机器上配置SSH无密码登录

安装 Hadoop与Ambari均需要无密码登录

设置方法请参考如下命令:

ssh-keygen

cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

chmod 700 ~/.ssh

chmod 600 ~/.ssh/authorized_keys

ssh-copy-id root@ydbslave01

ssh-copy-id root@ydbslave02

…..

6.       在每台机器上关闭防火墙

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

chkconfig iptables off

/etc/init.d/iptables stop

service iptables stop

iptables –F

7.       在每台机器上修改setenforce与Umask配置

setenforce设置:

setenforce 0

sed -i ‘s/enabled=1/enabled=0/‘ /etc/yum/pluginconf.d/refresh-packagekit.conf

cat /etc/yum/pluginconf.d/refresh-packagekit.conf

Umask设置:

umask 0022

echo umask 0022 >>/etc/profile

8.       在每台机器上修改检查/proc/sys/vm/overcommit_memory的配置值

如果为2,建议修改为0,否则有可能会出现,明明机器可用物理内存很多,但jvm确申请不了内存的情况。

9.       在每台机器上修改语言环境配置

先修改机器的语言环境

#vi /etc/sysconfig/i18n

LANG="en_US.UTF-8"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"

然后配置环境变量为utf8

echo "exportLANG="en_US.UTF-8 " >> ~/.bashrc

source ~/.bashrc

export|grep LANG

10.   配置时间同步

集群时间必须同步,不然会有严重问题

参考资料如下:http://www.linuxidc.com/Linux/2009-02/18313.htm

11.   环境变量

请大家千万不要在公共的环境变量配置Hadoop,Hive,Spark等环境变量,极可能产生相互冲突。

12.   请检查盘符,不要含有中文

尤其是ambari,有些时候,我们使用U盘或移动硬盘复制软件,但是这个移动硬盘挂载点是中文路径,这样在安装ambari的时候会出现问题,一定要注意这个问题.

13.   在每台机器上检查磁盘空间,使用率不得超过90%

默认Yarn会为每台机器保留10%的空间,如果剩余空间较少,Yarn就会停掉这些机器上的进程,并出现Containerreleased on a *lost* node错误。

14.   在每台机器上配置关键日志要定时清理,避免磁盘爆满

如可以编辑crontab -e每小时,清理一次日志,尤其是hadoop日志,特别占用磁盘空间

0 */1 * * * find/var/log/hadoop/hdfs -type f -mmin +1440 |grep -E "\.log\." |xargs rm–rf

 

三、Hadoop安装与配置

考虑到原版Hadoop安装配置门槛较高,本次我们使用Hortonworks公司的HDP、Ambari来搭建Hadoop环境。

 

从Hortonworks官方下载HDP与HDP-UTILS

http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.5.0.0/HDP-2.5.0.0-centos6-rpm.tar.gz

http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.21/repos/centos6/HDP-UTILS-1.1.0.21-centos6.tar.gz

http://public-repo-1.hortonworks.com/ambari/centos6/2.x/updates/2.4.1.0/ambari-2.4.1.0-centos6.tar.gz

 

准备好系统安装盘.iso文件或者系统yum源

配置示例:

mkdir -p/opt/ydbsoftware/centosyum

mount -o loop/opt/ydbsoftware/CentOS-6.6-x86_64-bin-DVD1.iso /opt/ydbsoftware/centosyum

 

从http://url.cn/42R4CG8获取

 

  • 延云YDB
  • 延云优化过的Spark(原版Spark有很多bug哦,以后会写相关专题)
  • JDK1.8
技术分享

 

技术分享
解压spark1.6.3_hadoop2.7.3.tar.gz,解压ya100.1.x.x.zip

解压后一定要放在/opt/ydbsoftware目录下

注意观察,如下三个目录是否存在

/opt/ydbsoftware/spark1.6.3_hadoop2.7.3

/opt/ydbsoftware/jdk1.8.0_60

/opt/ydbsoftware/ya100/bin

 

1.       安装JDK

将安装包中的JDK安装到/opt/ydbsoftware/jdk1.8.0_60

分发到每台机器上,且路径统一为/opt/ydbsoftware/jdk1.8.0_60

2.       软件上传到服务器

确认将全部软件已经上传到/opt/ydbsoftware目录下,不能随意更改/opt/ydbsoftware路径。

3.       配置HTTP服务(在解压后的目录执行)

cd /opt/ydbsoftware

nohup python -m SimpleHTTPServer &

4.       配置YUM源

备份旧的YUM源

cd /etc/yum.repos.d

mkdir -p bak

mv *.repo bak/

 

配置ambari源与本地系统源,每台机器都要配置,ambari.repo文件名不得更改,本地系统源很重要,一定要配置

配置示例如下:

cat << EOF >/etc/yum.repos.d/ambari.repo

[centoslocal]

name=centoslocal

baseurl=http://ydbmaster:8000/centosyum

gpgcheck=0

[AMBARI]

name=AMBARI

baseurl=http://ydbmaster:8000/AMBARI-2.4.1.0/centos6/2.4.1.0-22

gpgcheck=0

[HDP]

name=HDP

baseurl=http://ydbmaster:8000/HDP/centos6

gpgcheck=0

[HDP-UTILS]

name=HDP-UTILS

baseurl=http://ydbmaster:8000/HDP-UTILS-1.1.0.21/repos/centos6

gpgcheck=0

EOF

5.       安装与配置ambari-server(只需要在一台机器安装)

yum cleanall

yum makecache

yum repolist

yum installambari-server

6.       配置Ambari

ambari-server setup

除JDK需单独指定外,都默认

技术分享

7.       启动ambari-server

ambari-server start

然后就可以打开http://xx.xx.xx.xx:8080 安装hadoop了

默认用户名与密码均为admin

8.       开始创建集群

技术分享

技术分享

9.       配置HDP源

选择HDP版本为HDP2.5

技术分享

技术分享

10.   部署的机器列表与登录私钥配置

 技术分享

11.   部署Ambari-Agent

技术分享

如有警告,要注意处理

 技术分享

12.   选择安装部署服务

 技术分享

服务分配

技术分享

技术分享

13.   配置HDFS

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

14.    配置YARN

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

15.    配置MapReduce

 技术分享

16.    配置ZooKeeper

技术分享

技术分享

17.    AmbariMetrics 配置

 技术分享

18.    完成HDP部署

技术分享

技术分享

技术分享

技术分享

技术分享

 

四、YDB安装与配置

1.       安装YDB

ln -s /opt/ydbsoftware/spark1.6.3_hadoop2.7.3/opt/ydbsoftware/spark

cd /opt/ydbsoftware/ya100/bin

sh ./hdp_install.sh

2.       通过Ambari配置YDB 

技术分享

技术分享

技术分享

 

A配置:基本配置

技术分享

B组配置:环境路径配置

技术分享

C配置:存储相关路径配置

技术分享

开始安装

技术分享

安装完毕

技术分享

检查YDB是否启动成功

技术分享

在这里可以看到每台机器的健康状态,内存使用情况等,如果有异常这里会有提示,红色表示是比较严重的错误,紫色表示警告,其他颜色可以忽略。

正常没有错误的页面是这样的:

技术分享

状态异常状态是这样的:

 技术分享

至此,基础环境已经搭建完毕,开始导入数据。

 

五、数据导入

1.       YDB自带伪造数据jar包,生成比较简单的本次Demo测试数据

hadoopfs -mkdir /data/example/jiaotong_txt/

hadoop jar./lib/ydb-1.1.6-pg.jar

cn.net.ycloud.ydb.server.reader.kafka.importexample.YdbJiaotong500000 /data/example/jiaotong_txt/1yi.txt

技术分享

 

2.  链接JDBC客户端

sh bin/conn.sh

 技术分享

3.  创建HIVE外部表,并将伪造的txt文件导入HIVE表

hphm为号牌号码,kkbh为卡口编号,jgsj为经过时间,jgsk为经过时刻,quyu为卡口位置

create external tablejiaotong_txt(

hphm  string,

kkbh  bigint,

jgsj  bigint,

jgsk  bigint,

quyu  string

)

row format delimited fieldsterminated by ‘,‘

stored as

INPUTFORMAT‘cn.net.ycloud.ydb.handle.YdbCombineInputFormat‘OUTPUTFORMAT‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat‘

location‘/data/example/jiaotong_txt‘

TBLPROPERTIES(‘ydb.combine.input.format.raw.format‘=‘org.apache.hadoop.mapred.TextInputFormat‘

);

 技术分享

4.  创建YDB表,额外定义两列‘_str’的列,用于Groupby等操作,YDB中的分词数据类型不能Groupby

 

/*ydb.pushdown(‘->‘)*/

create table jiaotong_ydb(

hphm_str string,

hphm  chepai,

kkbh  tlong,

jgsj  tlong,

jgsk  tlong,

quyu_str  string,

quyu  simpletext

)

/*(‘<-‘)pushdown.ydb*/ ;

技术分享

5.  向YDB表导入数据,本次测试机有其他测试在跑,导入时间不具备参考价值

insert overwrite tableydbpartion

select ‘jiaotong_ydb‘, ‘1yi‘,‘‘,

YROW(

‘hphm_str‘ , hphm ,

‘hphm‘     , hphm ,

‘kkbh‘     , kkbh ,

‘jgsj‘     , jgsj ,

‘jgsk‘     , jgsk ,

‘quyu_str‘ , quyu ,

‘quyu‘     , quyu

)

from jiaotong_txt;

 技术分享

6.  验证YDB中的数据

成对的/*ydb.pushdown(‘->‘)*/,/*(‘<-‘)pushdown.ydb*/,是YDB特殊标识

 

/*ydb.pushdown(‘->‘)*/

selectcount(*) from jiaotong_ydb

whereydbpartion = ‘1yi‘

/*(‘<-‘)pushdown.ydb*/;

 

/*ydb.pushdown(‘->‘)*/

selecthphm_str,hphm,kkbh,jgsj,jgsk,quyu_str,quyu from jiaotong_ydb

where ydbpartion = ‘1yi‘order by jgsj desc limit 10

/*(‘<-‘)pushdown.ydb*/ ;

 技术分享

技术分享

六、机动车缉查布控即席查询与分析的典型场景

以下典型场景在“大数据江湖之即席查询与分析(中篇)”中有过详细的讲解与分析,这里不再赘述,直接给出实现方法。

1.  重点/指定车辆行车轨迹即席查询与分析

with tmp as (

/*ydb.pushdown(‘->‘)*/

selecthphm,kkbh,jgsj,jgsk,quyu from jiaotong_ydb

where ydbpartion = ‘1yi‘ andhphm=‘广K66457‘ order by jgsj desc /*(‘<-‘)pushdown.ydb*/

)

select hphm, kkbh, jgsj,jgsk, quyu

from tmp order by jgsj desclimit 10;

 技术分享

2.  同行车辆即席查询与分析

with tmp as (

/*ydb.pushdown(‘->‘)*/

select hphm, jgsj, kkbh fromjiaotong_ydb

where  ydbpartion = ‘1yi‘ and

( (jgsj like ‘([201607200902TO 201607201102])‘ and kkbh=57230)

or (jgsj like ‘([201607200847TO 201607201047])‘ and kkbh=30895)

or (jgsj like ‘([201607200812TO 201607201012])‘ and kkbh=29479)  )

/*(‘<-‘)pushdown.ydb*/

)

select * from (

select tmp.hphm, count(*) asrows, size(collect_set(tmp.kkbh)) as dist_kkbh

, concat_ws(‘#‘,sort_array(collect_set(concat_ws(‘,‘,tmp.jgsj,tmp.kkbh)))) as detail

from tmp group by tmp.hphm )tmp2

where tmp2.dist_kkbh>=2order by dist_kkbh desc limit 10;

 技术分享

3.  区域碰撞分析

with tmp as (

/*ydb.pushdown(‘->‘)*/

select hphm,jgsj,quyu fromjiaotong_ydb

where ydbpartion = ‘1yi‘ and

( (jgsj like ‘([201607200902TO 201607201102])‘ and quyu=‘光华路汇统花园‘)

or (jgsj like ‘([201607200847TO 201607201047])‘ and quyu=‘东明路鑫兆雅园‘)

or (jgsj like ‘([201607200812TO 201607201012])‘ and quyu=‘川巷路城市月光‘)  )

/*(‘<-‘)pushdown.ydb*/

)

select

tmp.hphm, count(*) as rows,size(collect_set(tmp.quyu)) as dist_quyu, concat_ws(‘#‘,sort_array(collect_set(concat_ws(‘,‘,tmp.jgsj,tmp.quyu))))as detail

from tmp group by tmp.hphmorder by dist_quyu desc limit 10;

 技术分享

4.  昼伏夜出、落脚点分析

with tmp as (

/*ydb.pushdown(‘->‘)*/

select jgsk,jgsj,quyu fromjiaotong_ydb where ydbpartion = ‘1yi‘ and hphm=‘广K66457‘

/*(‘<-‘)pushdown.ydb*/

)

select

tmp.jgsk, count(*) as rows,size(collect_set(tmp.quyu)) as dist_quyu, concat_ws(‘#‘,sort_array(collect_set(concat_ws(‘,‘,tmp.jgsj,tmp.quyu))))as detail

from tmp group by tmp.jgskorder by dist_quyu desc limit 10;

 技术分享

5.  陌生车辆分析

with tmp as (

/*ydb.pushdown(‘->‘)*/

select hphm,jgsj,quyu fromjiaotong_ydb

where ydbpartion = ‘1yi‘ and( quyu=‘光华路汇统花园‘ and jgsj<=201607201002 )

/*(‘<-‘)pushdown.ydb*/

)

select * from (

select tmp.hphm, count(*) asrows, max(tmp.jgsj) as max_jgsj

, size(collect_set(tmp.jgsj))as dist_jgsj, concat_ws(‘#‘,sort_array(collect_set(concat_ws(‘,‘,tmp.jgsj))))as detail

from tmp group by tmp.hphm )tmp2

wheretmp2.max_jgsj>201604111705 order by tmp2.dist_jgsj asc limit 10;

 技术分享

       至此即完成了手把手教你搭建即席查询与分析Demo,举出的几个典型场景来抛砖引玉,更多场景请小伙伴们自行发挥。没有搭建成功或者遇到问题的小伙伴,请加QQ群求助或交流:171465049(验证口令为vv8086的csdn博客)或在此给我评论留言。

       本次Demo的重点在于讲解Demo环境的搭建过程,所测试出的性能并不是最优的,“即席查询与分析性能调优”这部分我会出系列文章跟大家深入探讨,一步一步来教大家如何实现“万亿秒查”。这里先贴出一张YDB与SparkSQL和Parquet的性能对比,供大家参考!

技术分享

 转 http://blog.csdn.net/vv8086/article/details/57085744

大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo