上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析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的更多相关文章

  1. 手把手教你搭建 ELK 实时日志分析平台

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...

  2. 大数据初级笔记二:Hadoop入门之Hadoop集群搭建

    Hadoop集群搭建 把环境全部准备好,包括编程环境. JDK安装 版本要求: 强烈建议使用64位的JDK版本,这样的优势在于JVM的能够访问到的最大内存就不受限制,基于后期可能会学习到Spark技术 ...

  3. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  4. 大数据学习系列之八----- Hadoop、Spark、HBase、Hive搭建环境遇到的错误以及解决方法

    前言 在搭建大数据Hadoop相关的环境时候,遇到很多了很多错误.我是个喜欢做笔记的人,这些错误基本都记载,并且将解决办法也写上了.因此写成博客,希望能够帮助那些搭建大数据环境的人解决问题. 说明: ...

  5. java读取大文件内容到Elasticsearch分析(手把手教你java处理超大csv文件)

    现在需要快算分析一个2g的csv文件: 基于掌握的知识,使用java按行读取文件,批量导入数据到es, 然后利用es强大的聚合能力分析数据,2个小时搞定! package com.example.de ...

  6. 【大数据】Linux下Storm(0.9版本以上)的环境配置和小Demo

    一.引言: 在storm发布到0.9.x以后,配置storm将会变得简单很多,也就是只需要配置zookeeper和storm即可,而不再需要配置zeromq和jzmq,由于网上面的storm配置绝大部 ...

  7. 大数据:Hadoop(JDK安装、HDFS伪分布式环境搭建、HDFS 的shell操作)

    所有的内容都来源与 Hadoop 官方文档 一.Hadoop 伪分布式安装步骤 1)JDK安装 解压:tar -zxvf jdk-7u79-linux-x64.tar.gz -C ~/app 添加到系 ...

  8. 大数据之虚拟机配置和环境准备及hadoop集群搭建

    一.VMnet1和VMnet8路由器 VMware-workstation软件选择默认安装时,会自动创建VMnet1和VMnet8路由器设备.(安装失败使用CCleaner清理vm软件) VMnet1 ...

  9. 利用django框架,手把手教你搭建数据可视化系统(一)

    如何使用django去构建数据可视化的 web,可视化的结果可以呈现在web上. 使用django的MTV模型搭建网站 基础铺垫-MTV模型 Created with Raphaël 2.1.0Req ...

随机推荐

  1. python3基础13(format的使用)

    #!/usr/bin/env python# -*- coding:utf-8 -*- from string import Templatedict={'name':'python','age':2 ...

  2. 光标显示样式 css 中 cursor 属性使用

    记录一下 cursor 的各种样式,方便自己查找.之前用到不常用的每次去 百度 或 Google 找不如自己记录下好找些. cursor光标类型 auto default none context-m ...

  3. 在android开发中如何使用JavaMail程序

    javaMail,是提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Microsoft  ...

  4. C#中RichTextBox字体不统一(中英文)

    this.richTextBox1.Font = new System.Drawing.Font("微软雅黑", 12F);// new System.Drawing.Font(& ...

  5. gcc常用参数列举

    [参数详解] -c    只激活预处理,编译,和汇编,也就是他只把程序做成obj文件  例子用法:  gcc -c hello.c  他将生成.o的obj文件    -S  只激活预处理和编译,就是指 ...

  6. OpenGL学习 Our First OpenGL Program

    This shows you how to create the main window with the book’s application framework and how to render ...

  7. 如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity

    代码的环复杂度(Cyclomatic complexity,有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 在软件测试的概念里, ...

  8. PHP获取系统时间不对的解决办法(转载)

    原地址:https://blog.csdn.net/u012124764/article/details/51450958 使用PHP获取系统时间,发现时间不对,是因为PHP默认的时区是UTC,应该将 ...

  9. Android(java)学习笔记141:Android下的逐帧动画(Drawable Animation)

    1. 帧动画: 帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一 ...

  10. ABI与编译器:ABI是由内核和工具链定义和实现的

    http://book.51cto.com/art/201412/460857.htm <Linux系统编程(第2版)>第1章入门和基本概念,这一章着眼于Linux系统编程的基础概念并从程 ...