上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析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 [email protected]
ssh-copy-id [email protected]
…..
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/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
- 延云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