大數據江湖之即席查詢與分析(下篇)--手把手教你搭建即席查詢與分析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 [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