第一章 impala的安裝
通過本地yum源進行安裝impala
所有cloudera軟件下載地址
http://archive.cloudera.com/cdh5/cdh/5/
http://archive.cloudera.com/cdh5/
1、impala的介紹
imala基本介紹
impala是cloudera提供的一款高效率的sql查詢工具,提供實時的查詢效果,官方測試性能比hive快10到100倍,其sql查詢比sparkSQL還要更加快速,號稱是當前大數據領域最快的查詢sql工具,impala是參照谷歌的新三篇論文(Caffeine、Pregel、Dremel)當中的Dremel實現而來,其中舊三篇論文分別是(BigTable,GFS,MapReduce)分別對應我們即將學的HBase和已經學過的HDFS以及MapReduce
impala是基於hive並使用內存進行計算,兼顧數據倉庫,具有實時,批處理,多並發等優點
impala與hive的關系
impala是基於hive的大數據分析查詢引擎,直接使用hive的元數據庫metadata,意味着impala元數據都存儲在hive的metastore當中,並且impala兼容hive的絕大多數sql語法。所以需要安裝impala的話,必須先安裝hive,保證hive安裝成功,並且還需要啟動hive的metastore服務
impala的優點
1、 impala比較快,非常快,特別快,因為所有的計算都可以放入內存當中進行完成,只要你內存足夠大
2、 擯棄了MR的計算,改用C++來實現,有針對性的硬件優化
3、 具有數據倉庫的特性,對hive的原有數據做數據分析
4、支持ODBC,jdbc遠程訪問
impala的缺點:
1、基於內存計算,對內存依賴性較大
2、改用C++編寫,意味着維護難度增大
3、基於hive,與hive共存亡,緊耦合
4、穩定性不如hive,不存在數據丟失的情況
impala的架構以及查詢計划
Impala的架構模塊:
- impala-server ==>啟動的守護進程,執行我們的查詢計划 從節點,官方建議與所有的datanode裝在一起,可以通過hadoop的短路讀取特性實現數據的快速查詢
- impala-statestore ==》 狀態存儲區 主節點
- impalas-catalog ==》元數據管理區 主節點
查詢執行
impalad分為frontend和backend兩個層次, frondend用java實現(通過JNI嵌入impalad), 負責查詢計划生成, 而backend用C++實現, 負責查詢執行。
frontend生成查詢計划分為兩個階段:
(1)生成單機查詢計划,單機執行計划與關系數據庫執行計划相同,所用查詢優化方法也類似。
(2)生成分布式查詢計划。 根據單機執行計划, 生成真正可執行的分布式執行計划,降低數據移動, 盡量把數據和計算放在一起。
上圖是SQL查詢例子, 該SQL的目標是在三表join的基礎上算聚集, 並按照聚集列排序取topN。
impala的查詢優化器支持代價模型: 利用表和分區的cardinality,每列的distinct值個數等統計數據, impala可估算執行計划代價, 並生成較優的執行計划。 上圖左邊是frontend查詢優化器生成的單機查詢計划, 與傳統關系數據庫不同, 單機查詢計划不能直接執行, 必須轉換成如圖右半部分所示的分布式查詢計划。 該分布式查詢計划共分成6個segment(圖中彩色無邊框圓角矩形), 每個segment是可以被單台服務器獨立執行的計划子樹。
impala支持兩種分布式join方式, 表廣播和哈希重分布:
表廣播方式保持一個表的數據不動, 將另一個表廣播到所有相關節點(圖中t3);
哈希重分布的原理是根據join字段哈希值重新分布兩張表數據(譬如圖中t1和t2)。
分布式計划中的聚集函數分拆為兩個階段執行。第一步針對本地數據進行分組聚合(Pre-AGG)以降低數據量, 並進行數據重分步, 第二步, 進一步匯總之前的聚集結果(mergeAgg)計算出最終結果。
與聚集函數類似, topN也是分為兩個階段執行, (1)本地排序取topN,以降低數據量; (2) merge sort得到最終topN結果。
Backend從frontend接收plan segment並執行, 執行性能非常關鍵,impala采取的查詢性能優化措施有向量執行。 一次getNext處理一批記錄, 多個操作符可以做pipeline。LLVM編譯執行, CPU密集型查詢效率提升5倍以上。IO本地化。 利用HDFS short-circuit local read功能,實現本地文件讀取Parquet列存,相比其他格式性能最高提升5倍。
2、impala的安裝環境准備
需要提前安裝好hadoop,hive,這二個框架,並且hive需要在所有的impala安裝的節點上面都要有,因為impala需要引用hive的依賴包,hadoop的框架需要支持C程序訪問接口,查看下圖,如果有該路徑下有這么些文件,就證明支持C接口 .
3、下載impala的所有依賴包
由於impala沒有提供tar包供我們進行安裝,只提供了rpm包,所以我們在安裝impala的時候,需要使用rpm包來進行安裝,rpm包只有cloudera公司提供了,所以我們去cloudera公司網站進行下載rpm包即可,但是另外一個問題,impala的rpm包依賴非常多的其他的rpm包,可以一個個的將依賴找出來,也可以將所有的rpm包下載下來,制作成我們本地yum源來進行安裝。我們這里就選擇制作我們本地的yum源來進行安裝
,所以首先我們需要下載到所有的rpm包,下載地址如下
http://archive.cloudera.com/cdh5/repo-as-tarball/5.14.0/cdh5.14.0-centos6.tar.gz
下載好了之后,保留下,留作備用
4、掛載磁盤
由於我們下載的tar包非常大,大概5個G,解壓之后也最少需要5個G的空間,而我們的虛擬機磁盤有限,不夠用了,所以我們可以為我們的虛擬機掛載一塊磁盤,專門用於存儲我們的tar包
第一步:虛擬機關機新增磁盤
在我們的虛擬機關機的狀態下,在VMware當中新增一塊磁盤
第二步:開機之后進行磁盤掛載
分區,格式化,掛載新磁盤
磁盤掛載
df -lh
fdisk -l
#開始分區
fdisk /dev/sdb #這個命令執行后依次輸 n p 1 回車 回車 w
fdisk -l
#格式化我們的分區
mkfs -t ext4 -c /dev/sdb1 #格式化我們的分區
mkdir /data02
#將我們的分區掛載到/data02目錄下
mount -t ext4 /dev/sdb1 /data02
df -lh
#將我們的掛載磁盤設置開機啟動,避免開機之后掛載的磁盤就沒了
echo "/dev/sdb1 /data02 ext4 defaults 0 0" >> /etc/fstab
掛載完成之后,記得重新啟動node03機器上面的mysql服務,datanode服務,nodemanager服務,zookeeper服務
啟動mysql的服務命令:
/etc/init.d/mysqld start
5、上傳壓縮包並解壓
將我們5個G的壓縮文件上傳/data02(自己的目錄下)目錄下,並進行解壓
#將我們5個G的壓縮文件上傳/data02(自己的目錄下)目錄下,並進行解壓
cd /data02/
tar -zxvf cdh5.14.0-centos6.tar.gz
6、制作本地yum源
鏡像源是centos當中下載相關軟件的地址,我們可以通過制作我們自己的鏡像源指定我們去哪里下載impala的rpm包,這里我們使用httpd這個軟件來作為服務端,啟動httpd的服務來作為我們鏡像源的下載地址
這里我們選用第三台機器作為鏡像源的服務端
node03機器上執行以下命令
#node03機器上執行以下命令
yum -y install httpd
service httpd start
cd /etc/yum.repos.d
vim localimp.repo
[localimp]
name=localimp
baseurl=http://node03/cdh5.14.0/
gpgcheck=0
enabled=1
創建apache httpd的讀取鏈接
ln -s /data02/cdh/5.14.0 /var/www/html/cdh5.14.0
頁面訪問本地yum源,出現這個界面表示本地yum源制作成功
node03/cdh5.14.0
將制作好的localimp配置文件發放到所有需要安裝impala的節點上去
#將制作好的localimp配置文件發放到所有需要安裝impala的節點上去
cd /etc/yum.repos.d/
scp localimp.repo node02:$PWD
scp localimp.repo node01:$PWD
注意:如果需要使用httpd來代理rpm的倉庫,發布成為一個http的服務訪問
一定要禁用linux的selinux服務
vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
7、開始安裝impala
安裝規划
服務名稱 | node01 | node02 | node03 |
---|---|---|---|
impala-catalog | 不安裝 | 不安裝 | 安裝 |
impala-state-store | 不安裝 | 不安裝 | 安裝 |
impala-server | 安裝 | 安裝 | 安裝 |
主節點node03執行以下命令進行安裝
yum install impala -y
yum install impala-server -y
yum install impala-state-store -y
yum install impala-catalog -y
yum install impala-shell -y
從節點node01與node02安裝以下服務
yum install impala-server -y
8、所有節點配置impala
第一步:修改hive-site.xml
node03 機器修改hive-site.xml內容如下
hive-site.xml配置
vim /export/servers/hive-1.1.0-cdh5.14.0/conf/hive-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node03.hadoop.com:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node03.hadoop.com</value>
</property>
-------------------------------------------------------------------------------------------------
#修改部分內容
-------------------------------------------------------------------------------------------------
<property>
<name>hive.metastore.uris</name>
<value>thrift://node03.hadoop.com:9083</value>
</property>
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>3600</value>
</property>
-------------------------------------------------------------------------------------------------
#修改部分內容
-------------------------------------------------------------------------------------------------
</configuration>
第二步:將hive的安裝包發送到node02與node01機器上
在 node03
機器上面執行
cd /export/servers/
scp -r hive-1.1.0-cdh5.14.0/ node02:$PWD
scp -r hive-1.1.0-cdh5.14.0/ node01:$PWD
第三步:node03啟動hive的metastor服務
啟動hive的metastore服務
node03
機器啟動hive的metastore服務
cd /export/servers/hive-1.1.0-cdh5.14.0
nohup bin/hive --service metastore &
nohup bin/hive -- service hiveserver2 &
有兩個RunJar表示啟動成功
:
注意:一定要保證mysql的服務正常啟動,否則metastore的服務不能夠啟動
第四步:所有hadoop節點修改hdfs-site.xml添加以下內容
所有節點創建文件夾
mkdir -p /var/run/hdfs-sockets
修改所有節點的hdfs-site.xml
添加以下配置,修改完之后重啟hdfs
集群生效
vim /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml
添加到文件末尾:
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/run/hdfs-sockets/dn</value> <!--/var/run/hdfs-socket為目錄,dn為文件-->
</property>
<property>
<name>dfs.client.file-block-storage-locations.timeout.millis</name>
<value>10000</value>
</property>
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>
注意:root用戶不需要這一步操作了,實際工作當中普通用戶需要這一步操作
#創建文件夾
/var/run/hdfs-sockets/
#給這個文件夾賦予權限,例如如果我們用的是普通用戶,那就直接賦予普通用戶的權限
#例如:
chown -R hadoop:hadoop /var/run/hdfs-sockets/
因為我這里直接用的root用戶,所以不需要賦權限了
第五步:重啟hdfs
重啟hdfs文件系統
node01
服務器上面執行以下命令
cd /export/servers/hadoop-2.6.0-cdh5.14.0/
sbin/stop-dfs.sh
sbin/start-dfs.sh
第六步:創建hadoop與hive的配置文件的連接
impala
的配置目錄為:
/etc/impala/conf
這個路徑下面需要把core-site.xml,hdfs-site.xml以及hive-site.xml拷貝到這里來,但是我們這里使用軟連接的方式會更好
所有節點
執行以下命令創建鏈接到impala
配置目錄下來
ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
ln -s /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
ln -s /export/servers/hive-1.1.0-cdh5.14.0/conf/hive-site.xml /etc/impala/conf/hive-site.xml
第七步:修改impala的配置文件
所有節點修改impala默認配置
所有節點
更改impala
默認配置文件以及添加mysql的連接驅動包
vim /etc/default/impala
IMPALA_CATALOG_SERVICE_HOST=node03
IMPALA_STATE_STORE_HOST=node03
所有節點
創建mysql
的驅動包的軟連接
ln -s /export/servers/hive-1.1.0-cdh5.14.0/lib/mysql-connector-java-5.1.38.jar
/usr/share/java/mysql-connector-java.jar
所有節點修改bigtop的java路徑
所有節點
修改bigtop的java_home路徑
vim /etc/default/bigtop-utils
export JAVA_HOME=/export/servers/jdk1.8.0_141
第八步:啟動impala服務
啟動impala服務
主節點node03
啟動以下三個服務進程
service impala-state-store start
service impala-catalog start
service impala-server start
從節點啟動node01
與node02
啟動impala-server
service impala-server start
查看impala
進程是否存在
ps -ef | grep impala
注意:啟動之后所有關於impala的日志默認都在/var/log/impala 這個路徑下,node03
機器上面應該有三個進程,node02
與node01
機器上面只有一個進程,如果進程個數不對,去對應目錄下查看報錯日志
瀏覽器頁面訪問:
訪問impalad的管理界面
訪問statestored的管理界面
訪問catalog的管理界面
下一篇計划:impala使用教程