1. hive 創建數據表失敗
之前根據網上相關教程搭建hive,一直沒什麼問題,最近新搭建 hive服務時出現了無法創建數據表的問題,從日誌中發現報了一個,無法找到/user問題,正常情況下創建一張數據表的時候會在hdfs中創建一個/user/hive/warehouse的文件夾,去hdfs中沒有這個目錄,我就手動添加
顯示添加失敗,經過嘗試要在目錄前添加-p函數,並且添加namenode的域名(機器名)和埠.
創建成功後,重新打開hive使用,創建hive表,依然失敗,一樣的報錯,無法找到/user目錄。依據上次手動創建目錄的經驗我認為應該是沒找到對應的hdfs服務。
修改hive-site.xml文件
重新啟動hive, 可以創建hive表了。對於之前使用hive無需過多配置,這次卻需要修改warehouse,也找到了合理的解釋,之前配置hive都是安裝在Hadoop namenode的機器上直接可以通過/user/hive/warehouse創建hdfs目錄,但是這次為了分散壓力我把hive安裝到了別的伺服器上,導致無法找到正確的namenode,所以需要在hive.metastore.warehouse.dir,添加hdfs聯邦的地址。
2. 提問為什麼我要創建一個資料庫創建不出來求解,怎麼辦
1、mysql錯誤碼1044,許可權錯誤
當用root創建新資料庫時,發現很奇怪的問題,root許可權居然無法創建資料庫,看了網上很多文檔說是root創建密碼問題,按照網上方法修改仍然沒有起效
後來發現自已原來安裝過mysql,已經創建了var/lib/mysql 文件夾,然後卸載重裝沒有刪除這個文件夾,這個文件夾裡面的mysql許可權文件是原來的mysql用戶的,新的mysql用戶雖然用戶名也是mysql,但是ID是不一樣的,當然無法訪問原來的文件,於是發原來的mysql文件夾刪掉,重新安裝mysql,問題解決
2、啟動mysql失敗,提示:The server quit without updating PID file
查看err文件,提示是設置utf-8字元問題,原因是我在mysqld 下面用了:default-character-set=utf8
導致啟動失敗
進入/etc/my.cnf文件,把設置utf-8字元的那行刪掉,mysqld下面如果要使用utf-8,設置應該為:
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
問題解決
3、創建新資料庫hive,創建用戶hive,並授權hive資料庫許可權給hive用戶後,發現使用hive用戶登錄時報錯:
ERROR 1045 (28000): Access denied for user 'hive'@'localhost' (using password: YES)
這是因為user表中有用戶名為空的用戶導致,把user表中的空用戶刪除,刷新,問題解決
執行命令如下:
delete from user where user='';
FLUSH PRIVILEGES;
3. hive cmd 開啟
1、下載Hive軟體。如果下載hive-211,可直接進行下一步。如果下載hive-235,需要將缺失的cmd文件放入bin目錄下。
2、配置Hive系統變數和環境變數。
3、下載MySQL驅動(mysql-connector-java-5145),放置到目錄下。
4、在Hadoop上創建HDFS目錄。調出CMD終端,輸入以下命令。
5、創建相關目錄。
6、將模板文件另存為hive-sitexml,並修改文件hive-sitexml內容。Hive相關目錄設置,資料庫相關設置。
7、在MySQL下創建資料庫。
8、啟動Hadoop,即在hadoop的sbin目錄下調出CMD輸入命令start-dfscmd。
9、啟動Hivemetastore服務,即調出CMD輸入命令hive-servicemetastore。輸入命令後會自動在MySQL的hive資料庫下創建許多相關表。
10、啟動Hive,即調出CMD輸入命令hivecmd。
4. Hive 資料庫表的基本操作,必須掌握的基本功
說明:hive 的表存放位置模式是由 hive-site.xml 當中的一個屬性指定的,默認是存放在該配置文件設置的路徑下,也可在創建資料庫時單獨指定存儲路徑。
資料庫有一些描述性的屬性信息,可以在創建時添加:
查看資料庫的鍵值對信息
修改資料庫的鍵值對信息
與mysql查詢語句是一樣的語法
刪除一個空資料庫,如果資料庫下面有數據表,那麼就會報錯
強制刪除資料庫,包含資料庫下面的表一起刪除(請謹慎操作)
[]里的屬性為可選屬性,不是必須的,但是如果有可選屬性,會使 sql 語句的易讀性更好,更標准與規范。
例如:[comment '欄位注釋信息'][comment '表的描述信息']等,[external]屬性除外
1. CREATE TABLE
創建一個指定名字的表,如果相同名字的表已存在,則拋出異常提示:表已存在,使用時可以使用IF NOT EXISTS語句來忽略這個異常。
如果創建的表名已存在,則不會再創建,也不會拋出異常提示:表已存在。否則則自動創建該表。
2. EXTERNAL
顧名思義是外部的意思,此關鍵字在建表語句中讓使用者可以創建一個外部表,如果不加該關鍵字,則默認創建內部表。
外部表在創建時必須同時指定一個指向實際數據的路徑(LOCATION),Hive在創建內部表時,會將數據移動到數據倉庫指向的路徑;
若創建外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變。
內部表在刪除後,其元數據和數據都會被一起刪除。
外部表在刪除後,只刪除其元數據,數據不會被刪除。
3. COMMENT
用於給表的各個欄位或整張表的內容作解釋說明的,便於他人理解其含義。
4. PARTITIONED BY
區分表是否是分區表的關鍵欄位,依據具體欄位名和類型來決定表的分區欄位。
5. CLUSTERED BY
依據column_name對表進行分桶,在 Hive 中對於每一張表或分區,Hive 可以通過分桶的方式將數據以更細粒度進行數據范圍劃分。Hive採用對列值哈希,然後除以桶的個數求余的方式決定該條記錄存放在哪個桶當中。
6. SORTED BY
指定表數據的排序欄位和排序規則,是正序還是倒序排列。
7. ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
指定表存儲中列的分隔符,這里指定的是' ',也可以是其他分隔符。
8. STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
指定表的存儲格式,如果文件數據是純文本格式,可以使用STORED AS TEXTFILE,如果數據需要壓縮,則可以使用STORED AS SEQUENCEFILE。
9. LOCATION
指定 Hive 表在 hdfs 里的存儲路徑,一般內部表(Managed Table)不需要自定義,使用配置文件中設置的路徑即可。
如果創建的是一張外部表,則需要單獨指定一個路徑。
1. 使用create table語句創建表
例子:
2. 使用create table ... as select...語句創建表
例子:
使用 create table ... as select ...語句來創建新表sub_student,此時sub_student 表的結構及表數據與 t_student 表一模一樣, 相當於直接將 t_student 的表結構和表數據復制一份到 sub_student 表。
注意:
(1). select 中選取的列名(如果是 * 則表示選取所有列名)會作為新表 sub_student 的列名。
(2). 該種創建表的方式會改變表的屬性以及結構,例如不能是外部表,只能是內部表,也不支持分區、分桶。
如果as select後的表是分區表,並且使用select *,則分區欄位在新表裡只是作為欄位存在,而不是作為分區欄位存在。
在使用該種方式創建時,create 與 table 之間不能加 external 關鍵字,即不能通過該種方式創建外部目標表,默認只支持創建內部目標表。
(3). 該種創建表的方式所創建的目標表存儲格式會變成默認的格式textfile。
3.使用like語句創建表
例子:
注意:
(1). 只是將 t_student 的表結構復制給 sub1_student 表。
(2). 並不復制 t_student 表的數據給 sub1_student 表。
(3). 目標表可以創建為外部表,即:
5. db.properties怎麼創建
解決辦法:1.創建資料庫
hive>create database myhive;
hive>create database if not exists myhive;
2.查詢資料庫和表
hive>show databases;
hive>show tables;
使用正則表達式:
hive>show databases like 'h.*';
3.修改資料庫默認位置
hive>create database myhive
>location 'my/myhive.db'; //要指定資料庫名
1)為資料庫增加描述信息
hive>create database myhive
>comment 'this is my';
hive> desc database myhive; //顯示詳細信息
2)增加一些和其相關的鍵-值對屬性信息
hive>create database myhive
>with dbproperties('name'='lu','data'='2012-01-02');
查看:hive>desc database extended myhive;
hive>use default;
6. 為什麼使用HiveHive提供了什麼Hive支持哪些用戶
為什麼使用Hive?
為什麼使用Hive?那麼,在哪裡使用Hive呢?在載入了60億行(經度、維度、時間、數據值、高度)數據集到MySQL後,系統崩潰了,並經歷過數據丟失。這可能部分是因為我們最初的策略是將所有的數據都存儲到單一的一張表中了。後來,我們調整了策略通過數據集和參數進行分表,這有所幫助但也因此引入了額外的消耗,而這並非是我們願意接受的。
相反,我們決定嘗試使用Apache Hive技術。我們安裝了Hive 0.5 + 20,使用CDHv3和Apache Hadoop(0 20 2 + 320)。CDHv3還包含有許多其他相關工具,包括Sqoop和Hue這些在我們的架構中都標識出來了,如圖23-3底部所示。
我們使用Apache Sqoop轉儲數據到Hive中,然後通過寫一個Apache OODT包裝器,來使Hive按照空間/時間約束查詢數據,然後將結果提供給RCMET和其他用戶(圖23-2中間部分顯示)。RCMES集群的完整的架構如圖23- 3所示。我們有5台機器,包括圖中所示的一個主/從配置,通過一個運行GigE的私人網進行連接。
Hive提供了什麼
Photobucket公司使用Hive的主要目標是為業務功能、系統性能和用戶行為提供答案。為了滿足這些需求,我們每晚都要通過Flume從數百台伺服器上的MySQL資料庫中轉儲來自Web伺服器和自定義格式日誌TB級別的數據。這些數據有助於支持整個公司許多組織,比如行政管理、廣告、客戶支持、產品開發和操作,等等。對於歷史數據,我們保持所有MySQL在每月的第一天創建的所有的數據作為分區數據並保留30天以上的日誌文件。Photobucket使用一個定製的ETL框架來將MySQL資料庫中數據遷移到Hive中。使用Flume將日誌文件數據寫入到HDFS中並按照預定的Hive流程進行處理。
Hive支持的用戶有哪些
行政管理依賴於使用Hadoop提供一般業務健康狀況的報告。Hive允許我們解析結構化資料庫數據和非結構化的點擊流數據,以及業務所涉及的數據格式進行讀取。
廣告業務使用Hive篩選歷史數據來對廣告目標進行預測和定義配額。產品開發無疑是該組織中產生最大數量的特定的查詢的用戶了。對於任何用戶群,時間間隔變化或隨時間而變化。Hive是很重要的,因為它允許我們通過對在當前和歷史數據中運行A / B測試來判斷在一個快速變化的用戶環境中新產品的相關特性。
在Photobucket公司中,為我們的用戶提供一流的系統是最重要的目標。從操作的角度來看,Hive被用來匯總生成跨多個維度的數據。在公司里知道最流行的媒體、用戶、參考域是非常重要的。控制費用對於任何組織都是重要的。一個用戶可以快速消耗大量的系統資源,並顯著增加每月的支出。Hive可以用於識別和分析出這樣的惡意用戶,以確定哪些是符合我們的服務條款,而哪些是不符合的。也可以使用Hive對一些操作運行A / B測試來定義新的硬體需求和生成ROI計算。Hive將用戶從底層MapRece代碼解放出來的能力意味著可以在幾個小時或幾天內就可以獲得答案,而不是之前的數周。
Hive中的資料庫
Hive中資料庫的概念本質上僅僅是表的一個目錄或者命名空間。然而,對於具有很多組和用戶的大集群來說,這是非常有用的,因為這樣可以避免表命名沖突。通常會使用資料庫來將生產表組織成邏輯組。
如果用戶沒有顯式指定資料庫,那麼將會使用默認的資料庫default。
下面這個例子就展示了如何創建一個資料庫:
hive> CREATE DATABASE financials;
如果資料庫financials已經存在的話,那麼將會拋出一個錯誤信息。使用如下語句可以避免在這種情況下拋出錯誤信息:
hive> CREATE DATABASE IF NOT EXISTS financials;
雖然通常情況下用戶還是期望在同名資料庫已經存在的情況下能夠拋出警告信息的,但是IF NOT EXISTS這個子句對於那些在繼續執行之前需要根據需要實時創建資料庫的情況來說是非常有用的。
在所有的資料庫相關的命令中,都可以使用SCHEMA這個關鍵字來替代關鍵字TABLE。
隨時可以通過如下命令方式查看Hive中所包含的資料庫:
hive> SHOW DATABASES;
default
financials
hive> CREATE DATABASE human_resources;
hive> SHOW DATABASES;
default
financials
human_resources
如果資料庫非常多的話,那麼可以使用正則表達式匹配來篩選出需要的資料庫名,正則表達式這個概念,將會在第6.2.3節「Like和RLike」介紹。下面這個例子展示的是列舉出所有以字母h開頭,以其他字元結尾(即.*部分含義)的資料庫名:
hive> SHOW DATABASES LIKE 'h.*';
human_resources
hive> ...
Hive會為每個資料庫創建一個目錄。資料庫中的表將會以這個資料庫目錄的子目錄形式存儲。有一個例外就是default資料庫中的表,因為這個資料庫本身沒有自己的目錄。
資料庫所在的目錄位於屬性hive.metastore.warehouse.dir所指定的頂層目錄之後,這個配置項我們已經在前面的第2.5.1節「本地模式配置」和第2.5.2節「分布式模式和偽分布式模式配置」中進行了介紹。假設用戶使用的是這個配置項默認的配置,也就是/user/hive/warehouse,那麼當我們創建資料庫financials時,Hive將會對應地創建一個目錄/user/hive/warehouse/financials.db。這里請注意,資料庫的文件目錄名是以.db結尾的。
用戶可以通過如下的命令來修改這個默認的位置:
hive> CREATE DATABASE financials
> LOCATION '/my/preferred/directory';
用戶也可以為這個資料庫增加一個描述信息,這樣通過DESCRIBE DATABASE <database> 命令就可以查看到該信息。
hive> CREATE DATABASE financials
> COMMENT 'Holds all financial tables';
hive> DESCRIBE DATABASE financials;
financials Holds all financial tables
hdfs://master-server/user/hive/warehouse/financials.db
從上面的例子中,我們可以注意到,DESCRIEB DATABASE語句也會顯示出這個資料庫所在的文件目錄位置路徑。在這個例子中,URI格式是hdfs。如果安裝的是MapR,那麼這里就應該是maprfs。對於亞馬遜彈性MapRece(EMR)集群,這里應該是hdfs,但是用戶可以設置hive.metastore.warehouse.dir為亞馬遜S3特定的格式(例如,屬性值設置為s3n://bucketname...)。用戶可以使用s3作為模式,但是如果使用新版的規則s3n會更好。
前面DESCRIBE DATABASE語句的輸出中,我們使用了master-server來代表URI許可權,也就是說應該是由文件系統的「主節點」(例如,HDFS中運行NameNode服務的那台伺服器)的伺服器名加上一個可選的埠號構成的(例如,伺服器名:埠號這樣的格式)。如果用戶執行的是偽分布式模式,那麼主節點伺服器名稱就應該是localhost。對於本地模式,這個路徑應該是一個本地路徑,例如file:///user/hive/warehouse/financials.db。
如果這部分信息省略了,那麼Hive將會使用Hadoop配置文件中的配置項fs.default.name作為master-server所對應的伺服器名和埠號,這個配置文件可以在$HADOOP_HOME/conf這個目錄下找到。
需要明確的是,hdfs:///user/hive/warehouse/financials.db和hdfs://master-server/user/hive/
warehouse/financials.db是等價的,其中master-server是主節點的DNS名和可選的埠號。
為了保持完整性,當用戶指定一個相對路徑(例如,some/relative/path)時,對於HDFS和Hive,都會將這個相對路徑放到分布式文件系統的指定根目錄下(例如,hdfs:///user/<user-name>)。然而,如果用戶是在本地模式下執行的話,那麼當前的本地工作目錄將是some/relative/path的父目錄。
為了腳本的可移植性,通常會省略掉那個伺服器和埠號信息,而只有在涉及到另一個分布式文件系統實例(包括S3存儲)的時候才會指明該信息。
此外,用戶還可以為資料庫增加一些和其相關的鍵-值對屬性信息,盡管目前僅有的功能就是提供了一種可以通過DESCRIBE DATABASE EXTENDED <database>語句顯示出這些信息的方式:
hive> CREATE DATABASE financials
> WITH DBPROPERTIES ('creator' = 'Mark Moneybags', 'date' = '2012-01-02');
hive> DESCRIBE DATABASE financials;
financials hdfs://master-server/user/hive/warehouse/financials.db
hive> DESCRIBE DATABASE EXTENDED financials;
financials hdfs://master-server/user/hive/warehouse/financials.db
{date=2012-01-02, creator=Mark Moneybags);
USE命令用於將某個資料庫設置為用戶當前的工作資料庫,和在文件系統中切換工作目錄是一個概念:
hive> USE financials;
現在,使用像SHOW TABLES這樣的命令就會顯示當前這個資料庫下所有的表。
不幸的是,並沒有一個命令可以讓用戶查看當前所在的是哪個資料庫!幸運的是,在Hive中是可以重復使用USE…命令的,這是因為在Hive中並沒有嵌套資料庫的概念。
可以回想下,在第2.7.2節「變數和屬性」中提到過,可以通過設置一個屬性值來在提示符裡面顯示當前所在的資料庫(Hive v0.8.0版本以及之後的版本才支持此功能):
hive> set hive.cli.print.current.db=true;
hive (financials)> USE default;
hive (default)> set hive.cli.print.current.db=false;
hive> ...
最後,用戶可以刪除資料庫:
hive> DROP DATABASE IF EXISTS financials;
IF EXISTS子句是可選的,如果加了這個子句,就可以避免因資料庫finanacials不存在而拋出警告信息。
默認情況下,Hive是不允許用戶刪除一個包含有表的資料庫的。用戶要麼先刪除資料庫中的表,然後再刪除資料庫;要麼在刪除命令的最後面加上關鍵字CASCADE,這樣可以使Hive自行先刪除資料庫中的表:
hive> DROP DATABASE IF EXISTS financials CASCADE;
如果使用的是RESTRICT這個關鍵字而不是CASCADE這個關鍵字的話,那麼就和默認情況一樣,也就是,如果想刪除資料庫,那麼必須先要刪除掉該資料庫中的所有表。
如果某個資料庫被刪除了,那麼其對應的目錄也同時會被刪除。
7. 怎樣查看hive建的外部表的資料庫
1
進入HIVE之前要把HADOOP給啟動起來,因為HIVE是基於HADOOP的。所有的MR計算都是在HADOOP上面進行的。
2
在命令行中輸入:hive。這個時候就可以順利的進入HIVE了。當然了,如果你想直接執行HQL腳本文件可以這樣:hive -f xxxxx.hql。
3
進入hive之後一一般默認的資料庫都是default。如果你切換資料庫的話所建的表都會是在default資料庫裡面。
4
創建資料庫的語法是:create database database_name;非常簡單的,其實hive跟mysql的語法還是比較相似的。為什麼呢?請繼續往下
5
切換資料庫的時候可以輸入:use database_name;
查看所有資料庫的時候可以輸入:show databases;
查看所有表的時候可以輸入:show tables
6
看錶結構的時候可以輸入:describe tab_name;
8. websphere 怎麼配置hive的數據源
第一步:配置JDBC提供程序.
在左側的菜單->選擇 資源->JDBC->JDBC提供程序->新建
作用域:使用默認即可.
資料庫類型:根據你自己的需求選擇,有Sql Server,DB2,Oracle.SyBase等等。這里我選擇Oracle
實現類型:連接數據源.
名稱:Oracle JDBC Driver(可以自己定義)
描述 :可以自己定義.
點擊下一步.
這一步是選擇驅動包所在的路徑..
類路徑:${ORACLE_JDBC_DRIVER_PATH}/ojdbc6.jar
這個是Oracle驅動的地址..
也可以指定自己的驅動jar包地址..
另存為 WebSphere 變數 ${ORACLE_JDBC_DRIVER_PATH} 的 ojdbc6.jar 的目錄位置
下一步
點擊完成.JDBC提供程序就配置完成了.
第二步:配置數據源.
從左側菜單->選擇數據源->新建按鈕
輸入基本數據源信息
作用域:(選擇默認) cells:WpsCell01:nodes:WpsNode01:servers:server1
數據源名稱:這里需要指定數據源名稱.可以隨便定義.然後記住就行了.我這里定義JDBCDataSource.
JNDI 名稱:這里是指你在Java程序中指定的JNDI介面名稱..這個一定要與Java程序中定義的JNDI名稱一致,否則Java程序中不能連接到WebSphere中配置的數據源.
WebSphere數據源的配置:
配置好之後,點擊下一步.選擇 JDBC 提供程序
這一步則是選擇剛剛配置的JDBC提供程序.
創建新的 JDBC 提供程序
選擇現有的 JDBC 提供程序
然後下拉框中選擇 Oracle JDBC Driver .
然後下一步
填寫URL地址URL :jdbc:oracle:thin:@localhost:1521:ORCL
點擊下一步設置安全性別名.
就是配置連接資料庫的用戶名和密碼.
右側-選擇
JAAS - J2C 認證數據
點擊新建。別名:databaseJ2C(可以隨便定義)
用戶標識:scott(資料庫的用戶名.)
密碼:tiger(資料庫的密碼).
描述:可以不輸入.
點擊,應用->點擊完成.
設置好認證信息之後. 回到設置安全性別名.選擇剛剛設置的認證信息即可.
點擊完成. 第三步測試數據源是否連接成功. 從左側菜單->資源->數據源,找到剛剛配置好的數據源信息.
選中復選框. 點擊測試連接按鈕.
測試結果: 在節點 WpsNode01 上的伺服器 server1 上,對數據源 JDBCDataSource執行的測試連接操作是成功的。