您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Hive能做什么的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Hive能做什么?
Hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
Hive是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL https://my.oschina.net/u/2000675/blog/746016#navbar-header),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL(Hive SQL),它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的復雜的分析工作(HQL函數庫)。
為什么要使用Hive?
操作接口采用類SQL語法,提供快速開發的能力
避免了去寫MapReduce,減少開發人員的學習成本
擴展功能很方便
Hive與傳統數據庫對比
Hive | RDBMS | |
查詢語言 | HQL | SQL |
數據存儲 | HDFS | Raw Device or Local FS |
執行 | MapReduce | Excutor |
執行延遲 | 高 | 低 |
處理數據規模 | 大 | 小 |
數據類型 | 全部數據(歷史和在線---分析) | 在線數據 |
冗余程度 | 高冗余 | 低冗余(通過范式) |
... | ... | ... |
... | ... | ... |
Hive的架構
用戶接口主要有三個:CLI,Client 和WUI。其中最常用的是CLI,Cli啟動的時候,會同時啟動一個Hive副本。Client是Hive的客戶端,用戶連接至Hive Server。在啟動Client模式的時候,需要指出Hive Server所在節點,并且在該節點啟動Hive Server。WUI是通過瀏覽器訪問Hive。
Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,并在隨后有MapReduce調用執行。
Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。
Thriff (參考http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/)
Hive相關概念
Operator(最小的處理單元):每個操作符代表HDFS的一個操作或者一道MapReduce作業
Operator都是Hive定義的一個處理過程
Operator定義(樹狀結構):
protectedList<Operator<?extendsSerializable>>childOperators; protectedList<Operator<?extendsSerializable>>parentOperators; protectedbooleandone;// 初始化值為false
ANTLR詞法語法分析工具解析HQL
Hive的三種模式
Local模式:該模式連接到一個In-memory的數據庫Derby,一般用于Unit Test
Hive單用戶模式:通過網絡連接到一個數據庫中,是最經常使用到的模式
Hive多用戶模式:用于非Java客戶端訪問元數據庫,在服務器端啟動MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元數據庫
1.本地 derby 這種方式是最簡單的存儲方式,只需要在 hive-site.xml 做如下配置便可 <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration> 注:使用 derby 存儲方式時,運行 hive 會在當前目錄生成一個 derby 文件和一個 metastore_db 目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個 hive 客戶端能使用數據庫,否則會提示如下錯誤 [html] view plaincopyprint? hive> show tables; FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metast ore_db', see the next exception for details. NestedThrowables: java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask hive> show tables; FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details. NestedThrowables: java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask 2.本地 mysql 這種存儲方式需要在本地運行一個 mysql 服務器,并作如下配置(需要將 mysql 的驅動 jar 包拷貝到$HIVE_HOME/lib 目錄下)。 # /opt/hive-1.2.1/conf/hive-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive_remote/warehouse</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive_remote?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>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> </property> </configuration> 附: 安裝 mysql Yum install mysql-server -y 啟動服務 service mysqld start mysql 修改 mysql 權限: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION; flush privileges; delete from user where Host != '%'; 刪除多余會對權限造成影響的數據刷新權限 [ERROR] Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected at jline.TerminalFactory.create(TerminalFactory.java:101) 錯誤的原因: Hadoop jline 版本和 hive 的 jline 不一致 3.遠端 mysql 3.1.remote 一體 這種存儲方式需要在遠端服務器運行一個 mysql 服務器,并且需要在 Hive 服務器啟動 meta 服務。 這里用 mysql 的測試服務器,ip 位 192.168.1.214,新建 hive_remote 數據庫,字符集位 latine1 <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.57.6: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>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> </property> <property> <name>hive.metastore.local</name> <value>false</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.1.188:9083</value> </property> </configuration> 注:這里把 hive 的服務端和客戶端都放在同一臺服務器上了。服務端和客戶端可以拆開, 3.2.Remote 分開 將 hive-site.xml 配置文件拆為如下兩部分 -服務端配置文件 啟動:hive --service metastore <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.57.6: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> </configuration> -客戶端配置文件 啟動:hive <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>hive.metastore.local</name> <value>false</value> <property> <name>hive.metastore.uris</name> <value>thrift://slave2:9083</value> </property> </configuration>
感謝各位的閱讀!關于“Hive能做什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。