hive集成spark和mysql
參考:http://ihoge.cn/2018/HiveSpark.html
一、Hive安裝
1.Hive簡介
? Hive是Facebook開發的構建于Hadoop集群之上的數據倉庫應用,可以將結構化的數據文件映射為一張數據庫表,并提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行運行。
? Hive是一個可以提供有效的、合理的且直觀的組織和使用數據的模型,即使對于經驗豐富的Java開發工程師來說,將這些常見的數據運算對應到底層的MapReduce Java API也是令人敬畏的。Hive可以幫用戶做這些工作,用戶就可以集中精力關注查詢本身了。Hive可以將大多數的查詢轉換為MapReduce任務。Hive最適合于數據倉庫應用程序,使用該應用程序進行相關的靜態數據分析,不需要快速響應給出結果,而且數據本身也不會頻繁變化。
? Hive不是一個完整的數據庫。Hadoop以及HDFS的設計本身約束和局限性限制了Hive所能勝任的工作。最大的限制就是Hive不支持記錄級別的更新、插入或者刪除。用戶可以通過查詢生成新表或將查詢結果導入到文件中去。因為,Hadoop是一個面向批處理的系統,而MapReduce啟動任務啟動過程需要消耗很長時間,所以Hive延時也比較長。Hive還不支持事務。因此,Hive不支持聯機事務處理(OLTP),更接近于一個聯機分析技術(OLAP)工具,但是,目前還沒有滿足“聯機”部分。
? Hive提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),其中,ETL是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。因此,Hive是最適合數據倉庫應用程序的,它可以維護海量數據,而且可以對數據進行挖掘,然后形成意見和報告等。
? 因為大多數的數據倉庫應用程序是基于SQL的關系數據庫現實的,所以,Hive降低了將這些應用程序移植到Hadoop上的障礙。如果用戶懂得SQL,那么學習使用Hive會很容易。因為Hive定義了簡單的類SQL 查詢語言——HiveQL,這里值得一提的是,與SQLServer、Oracle相比,HiveQL和MySQL提供的SQL語言更接近。同樣的,相對于其他的Hadoop語言和工具來說,Hive也使得開發者將基于SQL的應用程序移植到Hadoop變得更加容易。
2.Hive安裝
? 接下來,開始Hive的安裝,安裝Hive之前,首先需要裝好Hadoop和Spark。在Hive官網可下載最新版本Hive,并且能夠查閱版本改動說明,本次課程采用1.2.2版本進行安裝。可以采用WinSCP傳輸apache-hive-1.2.2-bin.tar至虛擬機“下載”文件夾中,再進行后續安裝。
cd ~/下載 # 進入下載文件夾 sudo tar -zxf apache-hive-1.2.2-bin.tar.gz -C /usr/local # 安裝至/usr/local文件夾內 cd /usr/local # 進入/usr/local文件夾 sudo mv ./apache-hive-1.2.2-bin/ ./hive # 更名為hive sudo chown -R hadoop ./hive # 修改hive權限 mkdir -p /usr/local/hive/warehouse # 創建元數據存儲文件夾 sudo chmod a+rwx /usr/local/hive/warehouse # 修改文件權限然后添加Hive安裝路徑至系統環境變量
vim ~/.profile添加下述路徑
#Hive export HIVE_HOME=/usr/local/hive export PATH=$PATH:$HIVE_HOME/bin并使之生效
source ~/.profile修改hive讀取spark的jar包地址
cd /usr/local/hive/bin vim hive修改為
# add Spark assembly jar to the classpath if [[ -n "$SPARK_HOME" ]] thensparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}" fi然后采用hive默認配置
cd /usr/local/hive/conf cp hive-default.xml.template hive-default.xml嘗試啟動Hive,此時啟動是以本地模式進行啟動,能正常啟動則說明安裝成功。
start-all.sh hive? 若出現jline等jar包錯誤,則需要進入到hadoop安裝目錄下的share/hadoop/yarn/lib下刪除jline-0.9.94.jar文件,再啟動hive即可(因為高版本的Hadoop對Hive有捆綁)。
cd /usr/local/hadoop/share/hadoop/yarn/lib rm -rf jline-0.9.94.jar3. Hive的基本配置
? 在安裝Hive時,默認情況下,元數據存儲在Derby數據庫中。Derby是一個完全用Java編寫的數據庫,所以可以跨平臺,但需要在JVM中運行 。因為多用戶和系統可能需要并發訪問元數據存儲,所以默認的內置數據庫并不適用于生產環境。任何一個適用于JDBC進行連接的數據庫都可用作元數據庫存儲,這里我們把MySQL作為存儲元數據的數據庫。接下來,我們分別對這兩種方式進行介紹,即使用Derby數據庫的方式和使用MySQL數據庫的方式。
3.1 使用Derby作為元數據庫
? 本地模式中,用戶的“表”等元數據信息,都默認存儲在file://user/hive/warehouse,對于其他模式默認存儲路徑是hdfs://namenode_server/user/hive/warehouse。使用如下命令編輯hive-site.xml文件:
vim /usr/local/hive/conf/hive-site.xml在hive-site.xml文件添加以下內容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property><name>hive.metastore.warehouse.dir</name><value>/usr/local/hive/warehouse</value> <description>location of default database for the warehouse</description></property> <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:derby:;databaseName=/usr/local/hive/metastore_db;create=true</value> <description>JDBC connect string for a JDBC metastore</description></property> </configuration>? 若要以偽分布式模式和分布式模式配置Hive,只需根據Hadoop配置文件core-site.xml中fs.defaultFS的值對hive.metastore.warehouse.dir 進行相應修改即可。配置完成之后即可啟動Hive,然后嘗試使用HiveQL命令創建表。
hive show databases; create database if not exists derby; use derby; create table x(a int); select * from x; drop table x; exit;3.2 使用MySQL作為元數據庫
3.2.1 安裝MySQL
首先,查看并卸載系統自帶的MySQL相關安裝包(或之前安裝過MySQL),命令如下:
sudo apt install rpm rpm -qa | grep mysql若沒有安裝rpm工具,系統會有提示,按照提示安裝即可。接下來查看是否有系統自帶的MySQL相關安裝包,若有,按下面命令刪除:
sudo rpm -e --nodeps mysql-libs-xxxxxx注:xxxxx是已經安裝的mysql的版本號,然后進行MySQL的安裝
sudo apt-get install mysql-server安裝完成后,啟動設置MySQL服務
sudo service mysql start mysql -u root -p當然,還可使用下列命令進行額外設置
sudo chkconfig mysql on # 設置開機自動啟動 sudo /usr/bin/mysqladmin -u root password '123' # 設置root用戶密碼接下來,創建hive用戶及其數據庫等,用于存放Hive的元數據
sudo vi /etc/mysql/my.cnf 注釋掉:bind-address = 127.0.0.1create database hive; grant all on *.* to hive@localhost identified by 'hive'; flush privileges; exit;切換hive用戶登陸
mysql -u hive -p hive show databases;若能看到hive數據庫存在,則說明創建成功。
3.2.2 修改Hive配置
接下來,修改hive-site.xml文件
vim /usr/local/hive/conf/hive-site.xml輸入下列信息
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://localhost:3306/hive?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>hive</value><description>username to use against metastore database</description></property><property><name>javax.jdo.option.ConnectionPassword</name><value>hive</value><description>password to use against metastore database</description></property> </configuration>或者指定元數據文件夾
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property><name>hive.metastore.warehouse.dir</name><value>/usr/local/hive/warehouse</value> <description>location of default database for the warehouse</description></property> <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://localhost:3306/hive;createDatebaseIfNotExist=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.ConnectionPassword </name> <value>hive</value> </property> <property><name>javax.jdo.option.ConnectionUserName</name><value>hive</value><description>Username to use against metastore database</description></property> </configuration>然后將JDBC文件放到hive的lib文件夾內,JDBC包的下載參考前述部分
cd ~/下載 cp mysql-connector-java-5.1.26-bin.jar /usr/local/hive/lib mkdir -p /usr/local/hive/tmp sudo chmod a+rwx /usr/local/hive/tmp也可從官網直接下載最新版jdbc
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.45.tar.gz然后進行解壓安裝。當然,如果之前刪除了jline-0.9.94.jar,此時需要把hive對應的jar包放進去
cp /usr/local/hive/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib然后嘗試啟動hive
schematool -dbType mysql -initSchema start-all.sh hive成啟動后,即可輸入hive –help查看hive常用命令。
二、Hive使用
1.Hive基本數據類型
首先,我們簡單敘述一下HiveQL的基本數據類型。
Hive支持基本數據類型和復雜類型, 基本數據類型主要有數值類型(INT、FLOAT、DOUBLE ) 、布爾型和字符串, 復雜類型有三種:ARRAY、MAP 和 STRUCT。
1.1 基本數據類型
- TINYINT: 1個字節
- SMALLINT: 2個字節
- INT: 4個字節
- BIGINT: 8個字節
- BOOLEAN: TRUE/FALSE
- FLOAT: 4個字節,單精度浮點型
- DOUBLE: 8個字節,雙精度浮點型STRING 字符串
1. 2 復雜數據類型
- ARRAY: 有序字段
- MAP: 無序字段
- STRUCT: 一組命名的字段
2.常用的HiveQL操作命令
? Hive常用的HiveQL操作命令主要包括:數據定義、數據操作。接下來詳細介紹一下這些命令即用法(想要了解更多請參照《Hive編程指南》一書)。
2.1 數據定義
主要用于創建修改和刪除數據庫、表、視圖、函數和索引。
創建、修改和刪除數據庫
create database if not exists hive; #創建數據庫 show databases; #查看Hive中包含數據庫 show databases like 'h.*'; #查看Hive中以h開頭數據庫 describe databases; #查看hive數據庫位置等信息 alter database hive set dbproperties; #為hive設置鍵值對屬性 use hive; #切換到hive數據庫下 drop database if exists hive; #刪除不含表的數據庫 drop database if exists hive cascade; #刪除數據庫和它中的表注意,除 dbproperties屬性外,數據庫的元數據信息都是不可更改的,包括數據庫名和數據庫所在的目錄位置,沒有辦法刪除或重置數據庫屬性。
創建、修改和刪除表
#創建內部表(管理表)create table if not exists hive.usr(name string comment 'username',pwd string comment 'password',address struct<street:string,city:string,state:string,zip:int>,comment 'home address',identify map<int,tinyint> comment 'number,sex') comment 'description of the table' tblproperties('creator'='me','time'='2016.1.1'); #創建外部表create external table if not exists usr2(name string,pwd string, address struct<street:string,city:string,state:string,zip:int>,identify map<int,tinyint>) row format delimited fields terminated by ','location '/usr/local/hive/warehouse/hive.db/usr'; #創建分區表create table if not exists usr3(name string,pwd string,address struct<street:string,city:string,state:string,zip:int>,identify map<int,tinyint>) partitioned by(city string,state string); #復制usr表的表模式 create table if not exists hive.usr1 like hive.usr; show tables in hive; show tables 'u.*'; #查看hive中以u開頭的表 describe hive.usr; #查看usr表相關信息 alter table usr rename to custom; #重命名表 #為表增加一個分區alter table usr2 add if not exists partition(city=”beijing”,state=”China”) location '/usr/local/hive/warehouse/usr2/China/beijing'; #修改分區路徑alter table usr2 partition(city=”beijing”,state=”China”)set location '/usr/local/hive/warehouse/usr2/CH/beijing';#刪除分區alter table usr2 drop if exists partition(city=”beijing”,state=”China”)#修改列信息alter table usr change column pwd password string after address; alter table usr add columns(hobby string); #增加列 alter table usr replace columns(uname string); #刪除替換列 alter table usr set tblproperties('creator'='liming'); #修改表屬性 alter table usr2 partition(city=”beijing”,state=”China”) #修改存儲屬性 set fileformat sequencefile; use hive; #切換到hive數據庫下 drop table if exists usr1; #刪除表 drop database if exists hive cascade; #刪除數據庫和它中的表視圖和索引的創建、修改和刪除
基本語法格式
create view view_name as....; #創建視圖 alter view view_name set tblproperties(…); #修改視圖因為視圖是只讀的,所以 對于視圖只允許改變元數據中的 tblproperties屬性。
#刪除視圖drop view if exists view_name;#創建索引create index index_name on table table_name(partition_name/column_name) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild....;這里’org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’是一個索引處理器,即一個實現了索引接口的Java類,另外Hive還有其他的索引實現。
alter index index_name on table table_name partition(...) rebulid; #重建索引如果使用 deferred rebuild,那么新索引成空白狀態,任何時候可以進行第一次索引創建或重建。
show formatted index on table_name; #顯示索引 drop index if exists index_name on table table_name; #刪除索引
2.2 數據操作
主要實現的是將數據裝載到表中(或是從表中導出),并進行相應查詢操作
向表中裝載數據
create table if not exists hive.stu(id int,name string) row format delimited fields terminated by '\t'; create table if not exists hive.course(cid int,sid int) row format delimited fields terminated by '\t';向表中裝載數據有兩種方法:從文件中導入和通過查詢語句插入。
- 從文件中導入
假如這個表中的記錄存儲于文件stu.txt中,該文件的存儲路徑為usr/local/hadoop/examples/stu.txt,內容如下。
1 Hello 2 World 3 CDA load data local inpath '/usr/local/hadoop/examples/stu.txt' overwrite into table stu;- 通過查詢語句插入
使用如下命令,創建stu1表,它和stu表屬性相同,我們要把從stu表中查詢得到的數據插入到stu1中:
create table stu1 as select id,name from stu;上面是創建表,并直接向新表插入數據;若表已經存在,向表中插入數據需執行以下命令:
insert overwrite table stu1 select id,name from stu where(條件);這里關鍵字overwrite的作用是替換掉表(或分區)中原有數據,換成into關鍵字,直接追加到原有內容后。
寫入臨時文件
insert overwrite local directory '/usr/local/hadoop/tmp/stu' select id,name from stu;查詢操作
select id,name, case when id=1 then 'first' when id=2 then 'second' else 'third'
2.3 連接
? 連接(join)是將兩個表中在共同數據項上相互匹配的那些行合并起來, HiveQL 的連接分為內連接、左向外連接、右向外連接、全外連接和半連接 5 種。
內連接(等值連接)
內連接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。
首先,我們先把以下內容插入到course表中(自行完成)。
? 下面, 查詢stu和course表中學號相同的所有行,命令如下:
select stu.*, course.* from stu join course on(stu .id=course .sid);左連接
? 左連接的結果集包括“LEFT OUTER”子句中指定的左表的所有行, 而不僅僅是連接列所匹配的行。如果左表的某行在右表中沒有匹配行, 則在相關聯的結果集中右表的所有選擇列均為空值,命令如下:
右連接
? 右連接是左向外連接的反向連接,將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。命令如下:
全連接
? 全連接返回左表和右表中的所有行。當某行在另一表中沒有匹配行時,則另一個表的選擇列表包含空值。如果表之間有匹配行,則整個結果集包含基表的數據值。命令如下:
半連接
? 半連接是 Hive 所特有的, Hive 不支持 in 操作,但是擁有替代的方案; left semi join, 稱為半連接, 需要注意的是連接的表不能在查詢的列中,只能出現在 on 子句中。命令如下:
三、Spark與Hive集成
1.安裝Spark
? 為了讓Spark能夠訪問Hive,必須為Spark添加Hive支持。Spark官方提供的預編譯版本,通常是不包含Hive支持的,需要采用源碼編譯,編譯得到一個包含Hive支持的Spark版本。首先測試一下電腦上已經安裝的Spark版本是否支持Hive
spark-shell這樣就啟動進入了spark-shell,然后輸入:
import org.apache.spark.sql.hive.HiveContext如果報錯,則說明spark無法識別org.apache.spark.sql.hive.HiveContext,這時我們就需要采用源碼編譯方法得到支持hive的spark版本。
下載源碼文件
? 進入官網后,可以按照下圖配置選擇“2.1.0(Dec 28, 2016)”和“SourceCode”,然后,在圖中紅色方框內,有個“Download Spark: spark-2.1.0.tgz”的下載鏈接,點擊該鏈接就可以下載Spark源碼文件了。
編譯過程
cd /home/hadoop/spark-2.0.2 ./dev/make-distribution.sh —tgz —name h27hive -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.1 -Phive -Phive-thriftserver -DskipTests或可選擇直接安裝已編譯好的版本,把下好的spark-2.0.2-bin-h27hive.tgz放到下載文件夾內
Spark解壓安裝
cd ~/下載 # 進入下載文件夾 sudo tar -zxf spark-2.0.2-bin-h27hive.tgz -C /usr/local # 安裝至/usr/local文件夾內 cd /usr/local # 進入/usr/local文件夾 sudo mv ./spark-1.4.0-bin-hadoop2.4/ ./spark # 更名為spark sudo chown -R hadoop ./spark # 修改sqoop權限添加環境變量
注,如果電腦上已經裝了另一個spark,此處可不增設環境變量
vim ~/.profile添加spark安裝路徑
#sparkexport SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin并保存修改
source ~/.profile修改Spark配置
cd /usr/local/spark/conf # 進入spark配置文件夾 sudo cp spark-env.sh.template spark-env.sh # 復制spark-env臨時文件為配置文件 vim spark-env.sh # 編輯spark配置文件添加下述配置信息
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)有了上面的配置信息以后,Spark就可以把數據存儲到Hadoop分布式文件系統HDFS中,也可以從HDFS中讀取數據。如果沒有配置上面信息,Spark就只能讀寫本地數據,無法讀寫HDFS數據。在偽分布式模式下僅測試是否安裝成功時,其他配置暫時可不做修改。
運行樣例程序
cd /usr/local/spark bin/run-example SparkPi 2>&1 | grep "Pi is"放置Hive配置文件
為了讓Spark能夠訪問Hive,需要把Hive的配置文件hive-site.xml拷貝到Spark的conf目錄下
cd /usr/local/spark/conf cp /usr/local/hive/conf/hive-site.xml . ll測試是否集成成功
spark-shell然后輸入
import org.apache.spark.sql.hive.HiveContext
2.在Hive中創建數據庫和表
首先啟動MySQL數據庫:
service mysql start? 由于Hive是基于Hadoop的數據倉庫,使用HiveQL語言撰寫的查詢語句,最終都會被Hive自動解析成MapReduce任務由Hadoop去具體執行,因此,需要啟動Hadoop,然后再啟動Hive。
然后執行以下命令啟動Hadoop:
Hadoop啟動成功以后,可以再啟動Hive:
hive然后在hive命令提示符內進行操作
create database if not exists sparktest; show databases;create table if not exists sparktest.student( > id int, > name string, > gender string, > age int); use sparktest; show tables; insert into student values(1,'Xueqian','F',23); insert into student values(2,'Weiliang','M',24); select * from student;通過上面操作,我們就在Hive中創建了sparktest.student表,這個表有兩條數據。
3.連接Hive讀寫數據
? 現在我們看如何使用Spark讀寫Hive中的數據。注意,操作到這里之前,你一定已經按照前面的各個操作步驟,啟動了Hadoop、Hive、MySQL和spark-shell(包含Hive支持)。在進行編程之前,我們需要做一些準備工作,我們需要修改“/usr/local/sparkwithhive/conf/spark-env.sh”這個配置文件:
cd /usr/local/spark/conf/ vim spark-env.sh這樣就使用vim編輯器打開了spark-env.sh這個文件,輸入下面內容:
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath) export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export CLASSPATH=$CLASSPATH:/usr/local/hive/lib export SCALA_HOME=/usr/local/scala export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop export HIVE_CONF_DIR=/usr/local/hive/conf export SPARK_CLASSPATH=$SPARK_CLASSPATH:/usr/local/hive/lib/mysql-connector-java-5.1.26-bin.jar保存并推出,然后啟動spark-shell
spark-shell然后在shell界面中輸入
import org.apache.spark.sql.Row import org.apache.spark.sql.SparkSession case class Record(key: Int, value: String) val warehouseLocation = "spark-warehouse" val spark = SparkSession.builder().appName("Spark Hive Example").config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport().getOrCreate() import spark.implicits._ import spark.sql sql("SELECT * FROM sparktest.student").show()然后再開一個命令行界面,啟動hive界面,查看spark-shell中對hive表插入數據的結果
hive然后輸入
use sparktest; select * from student;然后在spark-shell中進行數據插入
import java.util.Properties import org.apache.spark.sql.types._ import org.apache.spark.sql.Row //下面我們設置兩條數據表示兩個學生信息 val studentRDD = spark.sparkContext.parallelize(Array("3 Rongcheng M 26","4 Guanhua M 27")).map(_.split(" ")) //下面要設置模式信息 val schema = StructType(List(StructField("id", IntegerType, true),StructField("name", StringType, true),StructField("gender", StringType, true),StructField("age", IntegerType, true))) //下面創建Row對象,每個Row對象都是rowRDD中的一行 val rowRDD = studentRDD.map(p => Row(p(0).toInt, p(1).trim, p(2).trim, p(3).toInt)) //建立起Row對象和模式之間的對應關系,也就是把數據和模式對應起來 val studentDF = spark.createDataFrame(rowRDD, schema) //查看studentDF studentDF.show() //下面注冊臨時表 studentDF.registerTempTable("tempTable") sql("insert into sparktest.student select * from tempTable")然后切換到hive窗口,查看數據庫內容變化
select * from student;能夠查詢到新增數據結果,則說明操作成功。
總結
以上是生活随笔為你收集整理的hive集成spark和mysql的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用aconda3-5.1.0(Pyth
- 下一篇: SparkSQL DataFrame进阶