1. 程式人生 > >大數據江湖之即席查詢與分析(下篇)--手把手教你搭建即席查詢與分析Demo

大數據江湖之即席查詢與分析(下篇)--手把手教你搭建即席查詢與分析Demo

dmi 安裝centos 用戶 author sla repo 相關 中文 plugin

上篇小弟分享了幾個“即席查詢與分析”的典型案例,引起了不少共鳴,好多小夥伴迫不及待地追問我們:說好的“手把手教你搭建即席查詢與分析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/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