公司最近在搞presto,主要是分析一下presto和hive的查詢大數據量的性能對比:html
我先把個人對比圖拿出來(50條數據左右)針對同一條sql(select * from employee where eid = 1203)java
hive的查詢,下面有時間:4.436snode
presto的查詢: 0.02smysql
查詢效率比爲 4.436 / 0.02 === 2021linux
Presto是Facebook開發的數據查詢引擎,可對250PB以上的數據進行快速地交互式分析。【百度】web
個人理解就沒那麼深了。我認爲presto是一個分佈式搜索引擎。爲了加快查詢效率,應對大數據量的查詢而產生的:presto不是傳統意義上的數據庫,sql
Presto被設計爲數據倉庫和數據分析產品:數據分析、大規模數據彙集和生成報表。這些工做常常一般被認爲是線上分析處理操做。數據庫
Presto是FaceBook開源的一個開源項目。Presto在FaceBook誕生,而且由FaceBook內部工程師和開源社區的工程師公共維護和改進。apache
扯了那麼多,你們應該對presto有點簡單的認識了,那就看看怎麼應用吧centos
既然要對比hive和presto的性能問題,那就要面臨hadoop環境搭建的問題:下面我簡單搭建一下hadoop的單機環境,做爲這次的測試環境,
準備軟件:連接地址 連接:http://pan.baidu.com/s/1eSaUnYU 密碼:5yrg
hadoop-2.6.0.tar
apache-hive-2.1.1
presto-server-0.100.tar
jdk-8u151-linux-x64.tar
注意:其實還須要準備mysql,可是在centos7中默認是Mariadb ,和mysql差很少,直接用這個也行
基本軟件準備好,開始安,安裝我分爲兩部分:
1.安裝的準備工做(ssh 防火牆,主機名,jdk等配置)
2.軟件的安裝(mysql,hadoop,hive,presto的安裝配置)
1> 我是單機測試:因此要把防火牆關閉,防止端口訪問不了的問題
centos7的命令是:
systemctl stop firewalld
systemctl disable firewalld ---禁止防火強開啓啓動
setenforce 0 -- 關閉selinux
修改/etc/selinux/config ,設定 SELINUX=disabled --測底關閉selinux
2> 建立用戶(無所謂,爲了更正式我寫上了,通常用root權限太大,防止出錯,沒法恢復)
建立用戶hive,並以/home/hive 做爲全部組件的Home,java例外
3> ssh的免密登陸(單機無所謂,集羣要分批拷貝到slave機器上)
確保是在/home/hive目下,執行如下命令
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys
4>修改hosts文件:
5> jdk的安裝(爲啥要用jdk8會在最後講解錯誤的時候解釋,耐心點,日後看)
把jdk8放在/usr/local下:解壓便可(因爲我在原有集羣上改的,jdk的名字還保留原來的,只是把解壓後的jdk8的文件放在這個文件夾裏面了,這樣不影響我原來集羣的運行)
tar -zxvf jdk-8u151-linux-x64.tar.gz
6>修改/etc/profile 讓環境變量java生效: 執行此命令 source /etc/profile (最後也就安裝那麼多東西)
至此,安裝前的準備工做已經準備完畢:
先安裝mysql | 或者mariaDB(centos默認帶有的。我直接用這個了)
第一步:
yum -y install MariaDB-client MariaDB-server MariaDB-devel
第二步:開啓服務:
service mysql start
第三步:設置密碼:(默認無密碼)
mysqladmin -u root password ‘888888’
鏈接數據庫:成功以下:
關於受權問題我就不扯了。想玩的去找度娘。安裝到這沒問題的話就完成30%了,繼續加油,搞起來!!!!!
下面安裝hadoopl了(興奮。。。。)
把hadoop2.6 上傳到/opt下 以下圖:(我把其餘軟件也放在這了,下面就不說了)
1> 解壓hadoop:
2> 在profile中配置hadoop的HADOOP_HOME PATH等,而後source /etc/profile生效
3> 設置hadoop的一些配置文件
先建立一些目錄,在core-site.xml hdfs-site,xml中配置要使用:
mkdir -p /home/hadoop/hadoop/tmp
mkdir -p /home/hadoop/hadoop/hdfs
mkdir -p /home/hadoop/hadoop/hdfs/data
mkdir -p /home/hadoop/ hadoop/hdfs/name
3.1》進入到hadoop目錄中 進入到 $HADOOP_HOME/etc/hadoop中:
修改hadoop_env.sh,yarn-env.sh,mapred-env.sh 加上JAVA_HOME的路徑 export JAVA_HOME=/usr/local/jdk1.7.0_79
3.2》 配置hadoop的四大金剛(core | hdfs | yarn | mapred ).xml文件
配置core
1 <configuration> 2 3 <property> 4 <name>fs.defaultFS</name> 5 <value>hdfs://hive:9001</value> 6 <description>HDFS的URI,文件系統://namenode標識:端口號,默認是9000</description> 7 </property> 8 <property> 9 <name>hadoop.tmp.dir</name> 10 <value>/home/hadoop/hadoop/tmp</value> 11 <description>namenode上本地的hadoop臨時文件夾</description> 12 </property> 13 <property> 14 <name>ipc.client.connect.max.retries</name> 15 <value>100</value> 16 <description>默認10次,如今配置100次</description> 17 </property> 18 <property> 19 <name>ipc.client.connect.retry.interval</name> 20 <value>10000</value> 21 <description>鏈接間隔1秒鐘,默認是0.1秒</description> 22 </property> 23 </configuration>
配置hdfs
1 <property> 2 <name>dfs.namenode.name.dir</name> 3 <value>/home/hadoop/hadoop/hdfs/name</value> 4 <description>namenode上存儲hdfs名字空間元數據 </description> 5 </property> 6 <property> 7 <name> dfs.datanode.data.dir</name> 8 <value>/home/hadoop/hadoop/hdfs/data</value> 9 <description>datanode上數據塊的物理存儲位置</description> 10 </property> 11 <property> 12 <name>dfs.replication</name> 13 <value>1</value> 14 <description>副本個數,配置默認是3,應小於datanode機器數量</description> 15 </property> 16 <property> 17 <name>dfs.namenode.rpc-address</name> 18 <value>hive:9001</value> 19 <description>RPC address that handles all clients requests。有人說須要和fs.defaultFS 同樣端口</description> 20 </property>
配置yarn
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hive:8099</value> <description>用於管理集羣的資源,能夠經過瀏覽器訪問 </description> </property> <property> <name>yarn.nodemanager.webapp.address</name> <value>hive:8042</value> <description>用於管理節點,能夠經過瀏覽器訪問 </description> </property>
配置mapred
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
最後:slaves
hive
4>啓動並驗證
$HADOOP_HOME/bin/hdfs namenode –format --這個執行一次便可。
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
telnet 測試對應端口是否是能鏈接上:
輸入jps看看服務是否是都能起來:
測試結果:
至此hadoop安裝完畢,測試完畢:不錯完成60%
1>上傳到 /opt上 解壓 在/etc/profile 配置環境變量位置 讓環境變量生效 source /etc/profile
2> 建立一些hive的保存目錄
準備hdfs路徑
hdfs dfs -mkdir -p /warehouse
hdfs dfs -mkdir -p /tmp/hive
hdfs dfs -chmod 773 /warehouse
hdfs dfs -chmod 773 /tmp/hive
3> cd $HIVE_HOME/conf下修改hive-env.sh ,hive-site.xml (若是沒有就用模板修改)
修改hive-env.sh
修改hive-site.xml
到此。hive安裝完畢:
注意。網上有的說要進行初始化:$HIVE_HOME/bin/schematool -dbType mysql -initSchema (但我沒執行這步也ok)【待考證】
啓動 hive
hive --service metastore
此時,在hive的安裝目錄任意位置,輸入hive啓動,而後jps 會出現RunJar這個進程
說明hive啓動時正常的,側面驗證hive安裝成功:
1》老規矩,上傳到/opt 解壓 配置profile 執行source /etc/profile 讓變量生效
2》由於presto中的文件夾啥的本身建立:
建立目錄
mkdir -p $PRESTO_HOME/etc/catalog
mkdir -p /home/hadoop/data_presto/data
關於etc下的其餘文件和catalog文件夾:不扯淡,上官網解釋
在我機器上的配置以下:
node.properties
config.properties
jvm.config
log.properties
進入catalog文件夾下,配置數據源的信息,我鏈接的是hive,而後就配置個hive.preperties文件便可:
到這,presto的配置也完畢了。
進入bin目錄下,啓動測試一把:
cd $PRESTO_HOME/bin 執行 ./launcher start 而後進程會出現PrestoServer
測試config的路徑鏈接 個人是http:192.168.52.142:8888 成功以下: 會記錄你的presto的每一步操做信息
至此整個hadoop+hive +presto搭建完畢了!!!!!!!!!!!!!!
還沒結束:還有一點presto的cli介紹一下: 安裝server是:presto-server-0.100.tar
下載對應版本的 presto-cli-0.100-executable 否則會報錯的:
分爲三步:
1》上傳 j解壓 更名presto-cli:
2》改權限 chmod +x presto-cli
3》mv移動到bin目錄下
4》命令行鏈接:在bin目錄下運行
./presto-cli --server hive:8888 --catalog hive --schema default
有人會問,你咋知道鏈接到hive了,那我用hive鏈接一下,驗證一下
常見錯誤總結:
1》錯誤一:
Error: Defunct property 'task.max-memory' (class [class com.facebook.presto.execution.TaskManagerConfig]) cannot be configured. at com.facebook.presto.server.ServerMainModule.setup(ServerMainModule.java:254)
這是由於版本不一致形成的,因此我說的是server和cli版本要一致,我用的都是0.100版本:
2》錯誤二
鏈接拒絕 refused. Connected........
那就是prestoServer的進程沒起來 ./laucher start這一步失敗,去presto家目錄看看配置文件是否是寫錯了
3》錯誤三
在config.properties中設置node-scheduler.include-coordinator=true
4》錯誤四
jdk 1.8 使用與server 0.86以上版本 0.85如下 jdk 1.7版本(這也是一開始爲啥我把個人jdk7換成8的緣由)