在JCG文章“ Hadoop模式介紹-獨立,偽分布式,分布式 ”中,JCG合作伙伴Rahul Patodi解釋了如何設置Hadoop 。 Hadoop項目已經產生了許多用于分析半結構化數據的工具,但是Hive也許是其中最直觀的工具,因為它允許具有SQL背景的任何人提交被描述為SQL查詢的MapReduce作業。 Hive可以從命令行界面執行,也可以在服務器模式下運行,而Thrift客戶端充當JDBC / ODBC接口,可以訪問數據分析和報告應用程序。
在本文中,我們將設置一個Hive服務器,創建一個表,使用文本文件中的數據加載它,然后使用iReport創建一個Jasper Resport。 Jasper報表在Hive服務器上執行SQL查詢,然后將其轉換為Hadoop執行的MapReduce作業。
注意:我使用運行OpenSuSE 12.1 Linux且安裝了MySQL 5.5的Hadoop版本0.20.205,Hive版本0.7.1和iReport版本4.5。
假設你已經安裝了Hadoop的下載和安裝蜂巢下面的蜂巢 入門維基指令。 默認情況下, Hive是在獨立Hadoop模式下運行的CLI模式下安裝的。
制作多用戶Hive Metastore
默認的Hive安裝使用derby嵌入式數據庫作為其元存儲。 Metastore是Hive維護我們要通過SQL訪問的數據的描述的地方。 為了使metastore同時可以從許多用戶訪問,必須將其移動到獨立數據庫中。 這是安裝MySQL Metastore的方法。
- 將MySQL JDBC驅動程序 jar文件復制到?/ hive-0.7.1-bin / lib目錄
- 更改?/ hive-0.7.1-bin / conf目錄中的文件hive-default.xml中的以下屬性:
<property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://hyperion/metastore?createDatabaseIfNotExist=true</value><description>JDBC connect string for a JDBC metastore</description> </property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value><description>Driver class name for a JDBC metastore</description> </property><property><name>javax.jdo.option.ConnectionUserName</name><value>foo</value><description>Username to connect to the database</description> </property><property><name>javax.jdo.option.ConnectionPassword</name><value>bar</value><description>Password to connect to the database</description> </property>
- 使用MySQL工作臺或MySQL命令行實用程序使用latin1字符集創建模式。 如果Hive找不到模式,它將使用MySQL的默認字符集自行創建模式。 在我的情況下,這是UTF-8,并生成了jdbc錯誤。 如果要使用命令行實用程序,請鍵入:
mysql> CREATE DATABASE IF NOT EXISTS `metastore` DEFAULT CHARACTER SET latin1 COLLATE latin1_bin;
- 在命令提示符下鍵入Hive以輸入Hive CLI并鍵入:
hive> SHOW TABLES; OK testlines Time taken: 3.654 seconds hive>
這將填充您新創建的metastore模式。 如果您看到任何錯誤,請檢查您的hive-default.xml配置,并確保您的數據庫模式被命名為“ metastore”,其中latin1作為默認字符集。
現在讓我們用一些數據填充Hadoop Hive
我們只創建兩個名為file01和file02的文本文件,每個文件包含:
file01 :
你好世界再見世界
大家好再見大家
file02 :
您好Hadoop再見Hadoop
大家好,大家再見
將這些文件從本地文件系統復制到HDFS:
$ hadoop fs -mkdir HiveExample
$ hadoop fs -copyFromLocal ~/file* /user/ssake/HiveExample
轉到Hive CLI并創建一個名為testlines的表,該表將在字符串數組中包含每一行的單詞:
hive> create table testlines (line array<string>) row format delimited collection items terminated by ' ';
將文本文件加載到Hive中:
hive> load data inpath "/user/ssake/HiveExample/file01" INTO table testlines;
hive> load data inpath "/user/ssake/HiveExample/file02" INTO table testlines;
檢查測試行現在是否包含每行的單詞:
hive> select * from testlines;
OK
["Hello","World","Bye","World"]
["Hello","Everybody","Bye","Everybody"]
["Hello","Hadoop","Goodbye","Hadoop"]
["Hello","Everybody","Goodbye","Everybody"]
Time taken: 0.21 seconds
現在我們有了一個包含數據的Hive,我們可以將其作為服務器在端口10000中運行,這通常是運行hive服務器的方式:
$ HIVE_PORT=10000
$ hive --service hiveserver
通過此設置,可能有多個Thrift客戶端訪問我們的Hive服務器。 但是,根據Apache Hive博客 ,多線程Hive功能尚未經過全面測試,因此每個Thrift客戶端使用單獨的端口和Hive實例更為安全。
創建“字數統計”報告
iReport 4.5支持配置單元數據源,因此讓我們使用它來創建一個以配置單元服務器作為數據源運行的報表:
1.創建一個連接到配置單元服務器的數據源

2.使用報告向導生成報告

3.在“ HiveQL查詢”輸入框中鍵入以下內容:
select word,count(word) from testlines lateral view explode(line) words as word group by word
讓我們簡要解釋一下上述查詢的作用:
我們的源表“ testlines”表只有一個名為“ line”的列,其中包含字符串數組形式的數據。 每個字符串數組代表在導入文件“ file01 ”和“ file02 ”中找到的句子中的單詞。
為了正確計算所有輸入文件中每個不同單詞的出現次數,我們必須將源表中的字符串數組“分解”為一個新單詞,其中應包含每個單詞。 為此,我們將“側視圖”與HiveQL命令“ explode()”結合使用,如上所示。
在上面的HiveQL查詢中,我們創建了一個名為“ words”的新圖標表,該表具有一個名為“ word”的列,其中包含從“ testlines”表的每個字符串數組中找到的所有單詞。

4.單擊…按鈕以選擇所有文件,然后單擊下一步。

5.在設計器視圖中,單擊“預覽”選項卡以執行HiveQL報告

這是我們的報告:

現在,您已經準備好構建使用熟悉的JDBC接口訪問Hadoop數據的應用程序!
參考:我們的W4G合作伙伴 Spyros Sakellariou 使用Hive和iReport進行大數據分析 。
翻譯自: https://www.javacodegeeks.com/2012/02/big-data-analytics-with-hive-and.html