SparkSQL與Hive的整合

文章目錄

      • SparkSQL與Hive的整合
        • 1.1. Spark On Hive
          • 1.1.1. Hive的準備工作
          • 1.1.2. Spark的準備工作
          • 1.1.3. Spark代碼開發
          • 1.1.4. Spark On Hive案例
        • 1.2. Hive On Spark
        • 1.3. SparkSQL命令行
        • 1.4. SparkSQL分布式查詢引擎
          • 1.4.1. 開啟ThriftServer服務
          • 1.4.2. beeline連接ThriftServer
          • 1.4.3. 代碼連接
          • 1.4.4. 任務查看

SparkSQL與Hive的整合

1.1. Spark On Hive

SparkSQL其實就是一個Spark框架下的執行引擎,可以對結構化的數據使用SQL的方式,將SQL翻譯成為SparkCore的代碼去完成計算。SparkSQL支持不同的數據源,可以讀取各種數據文件的數據、可以通過JDBC讀取MySQL的數據,在實際開發過程中,有時候我們需要使用SparkSQL去處理Hive中的數據。這就是SparkSQL與Hive的整合方式之一:Spark On Hive

其實Spark只是一個計算引擎,本身是沒有元數據管理的功能的。而我們在前面使用到的無論是DSL風格的處理方式,還是SQL風格的處理方式,所謂的“元數據”、“表”,其實都是向DataFrame注冊的。DataFrame中記錄了“表”、“字段”、“類型”等信息,就可以將SQL語句解析成為Spark程序來運行了。

但是Hive不同,Hive本身就是有一個元數據庫(MetaStore)的,因此我們需要使用SparkSQL處理Hive的數據的時候,無需再注冊表、注冊字段等信息,直接從Hive的元數據庫(MetaStore)中獲取元數據即可。

1.1.1. Hive的準備工作
  1. 配置Hive的元數據服務:修改hive的配置文件 hive-site.xml

    <!-- 配置Hive的MetaStore服務,使用thrift協議,設置好主機名和端口號 -->
    <property><name>hive.metastore.uris</name><value>thrift://qianfeng01:9083</value>
    </property>
    
  2. 啟動Hive的元數據服務

    # 開啟Hive的metastore服務
    # 這種方式開啟的服務是一個前臺進程,不方便使用
    hive --service metastore# 開啟Hive的metastore服務,并設置為后臺進程
    # 這種方式開啟的元數據服務是后臺進程,方便交互了,但是不方便查看日志,并且隨著session的退出,服務會中斷
    hive --service metastore &# 啟動后臺進程,將日志輸出到指定位置
    nohup hive --service metastore > /var/log/metastore.log 2>&1 &
    
1.1.2. Spark的準備工作
  1. 在spark的conf目錄下,創建hive-site.xml文件,存放連接到hive的配置信息

    <?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>/user/hive/warehouse</value></property><property><name>hive.metastore.uris</name><value>thrift://qianfeng01:9083</value></property>
    </configuration>
    

    Spark程序在運行的時候,相關的配置信息的加載次序:

    • 首先加載conf目錄下的配置文件。
    • 再加載代碼中進行的配置。

    其實只需要讓SparkSQL程序知道metastore服務在哪里就可以了,如果不配置上面的這個文件也可以,不過就需要在代碼中配置了。為了避免每一次在寫程序的時候,都在代碼里面去配置,簡單起見,就直接創建這個文件,將連接到Hive元數據服務的配置都放進去。這樣每次Spark程序在啟動的時候,都可以自動的加載到。

  2. 準備MySQL的驅動包

    因為Hive的元數據保存到了MySQL數據庫,Spark SQL程序如果需要訪問的話,肯定需要從MySQL數據庫中讀取元數據信息。此時就必須要這個jar包了。

    將準備好的mysql-connector-java-8.0.26.jar文件存放到spark的jars目錄下。

    注意:

    • 如果需要運行本地模式,那么本地的Spark的jars目錄下需要存放有這個jar包。
    • 如果需要運行集群模式,那么集群中的Spark的jars目錄下需要存放有這個jar包。
1.1.3. Spark代碼開發
# @Author   : 千鋒大數據教研院
# @Company  : 北京千鋒互聯科技有限公司from pyspark.sql import SparkSession# 這里的 .enableHiveSupport() 表示的就是打開Hive支持,此時就可以訪問到Hive的數據了。
# 注意:
# 如果沒有在spark的conf目錄下面創建hive-site.xml并正確的設置hive的元數據服務
# 那么在創建SparkSession對象的時候,就必須要設置hive的元數據服務信息
# .config("spark.sql.warehouse.dir", "hdfs://qianfeng01:9820/user/hive/warehouse")
# .config("hive.metastore.uris", "thrift://qianfeng01:9083")
spark = SparkSession.builder\.master("local[*]")\.appName("hive-enable")\.enableHiveSupport()\.getOrCreate()# spark.sql("select * from mydb.emp").show()
spark.sql("select * from mydb.emp join mydb.dept on mydb.emp.deptno = mydb.dept.deptno;").show()spark.stop()
1.1.4. Spark On Hive案例

基本的Spark On Hive的程序就編寫完成了。我們也可以結合之前的內容,整合其他的數據源與Hive配合使用

在Hive中有一張表,存儲了用戶的名字與身份證號。讀取這個表中的數據,通過身份證號解析出生日、性別、年齡等信息,并將結果保存到Hive中。

"""
需求: 從 Hive 的mydb.users表中通過身份證號,解析出用戶的生日、年齡、性別信息,并將結果存入到一個新的表中
res:usernameidcardphonebirthdayagegender
create table if not exists mydb.res(username string,idcard string,phone string,birthday string,age string,gender string
)
row format delimited
fields terminated by ','
"""import os
import re
import datetime
from pyspark.sql import SparkSession
from pyspark.sql.types import MapType, StringTypeos.environ.setdefault("HADOOP_USER_NAME", "root")def calculate_age(year, month, day) -> int:now = datetime.datetime.now()age = now.year - yearif now.month < month:age -= 1elif now.month == month and now.day < day:age -= 1return agedef parse_idcard(idcard: str) -> dict:# 1. 驗證身份證號碼是否合法m = re.fullmatch(r'(\d{6})'r'(?P<year>(19|20)\d{2})'r'(?P<month>0[1-9]|1[0-2])'r'(?P<day>[012][0-9]|10|20|30|31)'r'\d{2}'r'(?P<gender>\d)'r'[0-9xX]', idcard)if m is None:return {}# 2. 解析每一部分year = m.group('year')month = m.group('month')day = m.group('day')age = calculate_age(int(year), int(month), int(day))gender = '男' if int(m.group('gender')) % 2 != 0 else '女'birthday = '-'.join([year, month, day])return {"birthday": birthday, "age": age, "gender": gender}with SparkSession.builder.master("local[*]").appName("exercise").enableHiveSupport().getOrCreate() as spark:# 注冊 UDF 函數spark.udf.register("parse_idcard", parse_idcard, MapType(StringType(), StringType()))# 查詢數據res = spark.sql("""selectusername, idcard,phone,parse_idcard(idcard)['birthday'] as birthday,parse_idcard(idcard)['age'] as age,parse_idcard(idcard)['gender'] as genderfrom   mydb.users""")# 將查詢結果寫出到 Hive 指定的表中,這個表需要提前存在res.write.insertInto("mydb.res")
1.2. Hive On Spark

其實Hive On Spark的意思就是,將Hive的底層計算引擎替換成Spark!Hive默認的計算引擎是MapReduce,而這個是可以替換的。只需要使用set hive.execution.engine=spark即可完成替換,同時需要指定Spark的Master。

# 使用Hive On Spark非常簡單
# 只要用set hive.execution.engine命令設置Hive的執行引擎為spark即可
# 默認是mr
set hive.execution.engine=spark;
# 這里,是完全可以將其設置為Spark Master的URL地址的
set spark.master=spark://192.168.10.101:7077
# 注意上面這種配置是只適用于匹配的版本才可以,如果高版本的話現在是沒有這種功能的,需要自行編譯
# 參考官方文檔:https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started

但是需要注意,HiveOnSpark并不是適合所有場景的,因為Spark是內存計算的計算引擎,需要消耗大量的內存資源,不利于其他程序的計算應用。因此需要使用Spark來處理Hive的數據的時候,SparkOnHive是一個比較常見的選擇。

1.3. SparkSQL命令行

在Spark的bin目錄下,有一個腳本文件spark-sql,這個腳本文件會啟動一個命令交互界面,可以使得我們在命令行上直接使用Spark來操作Hive的數據。

在3.3.1.章節的部分,已經在spark的conf目錄下面創建出來一個hive-site.xml文件,其中定義了hive的元數據相關的信息,這樣我們就可以直接使用了。

image-20230214181016887

1.4. SparkSQL分布式查詢引擎

在Spark中有一個服務是ThriftServer服務,通過這個服務,用戶可以通過JDBC連接ThriftServer來訪問SparkSQL的數據。連接后可以直接通過編寫SQL語句訪問SparkSQL的數據。在配置ThriftServer的時候,至少需要配置ThriftServer的主機名和端口號,如果需要使用Hive的數據的話,還需要再提供Hive的Metastore的URIs。

如果你前面已經配置完成了Spark On Hive,那么在你的Spark的conf目錄下已經存在了一個文件:hive-site.xml,在這個文件中已經配置好了Hive的Metastore的URIs了。

1.4.1. 開啟ThriftServer服務
$SPARK_HOME/bin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10000\
--hiveconf hive.server2.thrift.bind.host=qianfeng01\
--master local[*]

這里的--master可以設置為local模式、Standalone模式或者YARN模式。

1.4.2. beeline連接ThriftServer

ThriftServer服務啟動之后,默認件監聽的是10000端口,我們可以使用一些客戶端工具來連接到這個服務。例如beeline。

image-20230216144155303

1.4.3. 代碼連接

如果需要需要使用ThriftServer連接到SparkSQL,進而操作Hive的數據的話,我們需要安裝Hive的依賴。

pip3 install pyhive
# @Author   : 千鋒大數據教研院
# @Company  : 北京千鋒互聯科技有限公司from pyhive import hive# 通過Spark ThriftServer,創建到Hive的連接對象,
conn = hive.Connection(host="qianfeng01", port=10000, username="root", database="mydb")
# 創建一個光標對象,用來操作hive
cursor = conn.cursor()with conn, cursor:# 執行SQL語句cursor.execute("select * from emp join dept on emp.deptno = dept.deptno")result = cursor.fetchall()for r in result:print(r)
1.4.4. 任務查看

ThriftServer提交到Spark的任務,我們可以通過http://192.168.10.101:4040/jobs/來查看到。

image-20230216145609484

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62711.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62711.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(持續更新)linux網絡編程中需要注意的內核參數與網絡機制

目錄 零、基本說明 一、內核參數 二、相關機制 1、GRO &#xff08;1&#xff09;適用場景 &#xff08;2&#xff09;優缺點 &#xff08;3&#xff09;相關操作 2、Nagle 算法 &#xff08;1&#xff09;基本規則 &#xff08;2&#xff09;優缺點 &#xff08;3&…

DevExpress WPF中文教程:Grid - 如何移動和調整列大小?(一)

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Matlab筆記---clear、clc、clear all應用

在MATLAB中&#xff0c;clear、clc 和 clear all 是三個常用的命令&#xff0c;它們各自有不同的作用&#xff1a; clc&#xff1a; clc 命令用于清除MATLAB命令窗口中的所有輸出。它不會刪除任何變量、函數或文件&#xff0c;只是清除屏幕上的顯示內容&#xff0c;讓你可以更…

銘記一次項目重大事故

在程序的世界里&#xff0c;bug 就像隱藏在暗處的小怪獸&#xff0c;時不時跳出來搗亂。而職業生涯中&#xff0c;總有那么一個或幾個 bug 讓我們刻骨銘心。它或許讓項目差點夭折&#xff0c;或許讓你熬了無數個通宵&#xff0c;或許有著離奇的出現方式和曲折的解決過程。無論是…

Qt 一個簡單的QChart 繪圖

Qt 一個簡單的QChart 繪圖 先上程序運行結果圖&#xff1a; “sample9_1QChart.h” 文件代碼如下&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample9_1QChart.h"#include <QtCharts> //必須這么設置 QT_CHARTS_USE_NAME…

分布式事物XA、BASE、TCC、SAGA、AT

分布式事務——Seata 一、Seata的架構&#xff1a; 1、什么是Seata&#xff1a; 它是一款分布式事務解決方案。官網查看&#xff1a;Seata 2.執行過程 在分布式事務中&#xff0c;會有一個入口方法去調用各個微服務&#xff0c;每一個微服務都有一個分支事務&#xff0c;因…

MySQL為什么使用B+樹來作索引

我來詳細解釋一下B樹的結構和特點。 graph TDA[根節點 40|70] --> B[20|30]A --> C[50|60]A --> D[80|90]B --> E[10|15]B --> F[25|28]B --> G[35|38]C --> H[45|48]C --> I[55|58]C --> J[65|68]D --> K[75|78]D --> L[85|88]D --> M[9…

python 下載 b站視頻 和音頻

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一個從外部得到的單個視頻ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

2024年06月中國電子學會青少年軟件編程(Python)等級考試試卷(五級)答案 + 解析

青少年軟件編程(python)等級考試試卷(五級) 一、單選題(共25題,共50分) range()函數的基本用法是什么?( ) A. 生成一個等差數列 B. 生成一個隨機數列 C. 生成一個遞增數列 D. 生成一個遞減數列 正確答案:A 答案解析:range() 函數用于生成一個等差數列,其中起始值、…

以太網鏈路詳情

文章目錄 1、交換機1、常見的概念1、沖突域2、廣播域3、以太網卡1、以太網卡幀 4、mac地址1、mac地址表示2、mac地址分類3、mac地址轉換為二進制 2、交換機的工作原理1、mac地址表2、交換機三種數據幀處理行為3、為什么會泛洪4、轉發5、丟棄 3、mac表怎么獲得4、同網段數據通信…

Shell編程 腳本的運行方式與注釋

目錄 shell腳本的運行方式 1. 路徑運行 2.bash或sh加腳本運行 ?編輯 3.source在加腳本路徑運行 shell腳本注釋 單行注釋 多行注釋 shell腳本的運行方式 我們在/usr/etc/demo01目錄下新建了一個腳本 a.sh &#xff0c;腳本內容是要求輸出數字1&#xff0c;怎么運行呢 1…

獲取淘寶商品評論數據的API應用:市場調研|產品更新|用戶數據

下面是一段我用item_review&#xff08;獲取商品評論數據&#xff09;抓來的商品評論數據&#xff1a; "items": {"total_results": 375,"totalpage": 38,"page_size": 10,"page": "1","item": [{&quo…

智算網絡中Scale-out和Scale-up網絡的技術原理

智算網絡中Scale-out網絡和Scale-up網絡的本質區別是什么&#xff1f; 一、什么是智算中心的Scale-out網絡和Scale-up網絡 數據中心網絡總體上可分為兩大類&#xff1a;通算網絡和智算網絡。通算網絡主要用于支持傳統的計算任務和應用&#xff0c;如企業的IT系統、網站托管、電…

HCIA筆記7--OSPF協議入門

文章目錄 0. 路由分類1. OSPF介紹1.1 概念1.2 報文類型 2. 鄰接關系的建立2.1 鄰居關系的建立2.2 鄰接關系的形成2.3 ospf狀態機 3. DR與BDR3.1 為什么要有DR和BDR&#xff1f;3.2 DR和BDR的選舉原則 4. ospf的配置4.1 內部優先級 5. 問題5.1 三層環路如何解決&#xff1f; Ref…

C05S06-Nginx的內置變量和代理

一、常見內置變量 內置變量說明$uri請求的URL&#xff0c;不包括主機和參數$request_uri請求的URL&#xff0c;包括主機和參數$host請求的主機名$http_user_agent客戶端信息&#xff0c;瀏覽器和操作系統$remote_addr客戶端IP地址$remote_port客戶端端口$server_addr服務端IP地…

mysql排序問題

mysql 建數據庫時&#xff0c;需要指定 字符集 和 排序規則 建表時&#xff0c;也可以指定 也可以指定具體的字段 安照下面的sql順序執行插入&#xff0c;它們的排序是什么樣的&#xff1f; INSERT into test_sort (uid,create_time) VALUE (d,now()) INSERT into test_sort (u…

JAVA 圖形界面編程 AWT篇(1)

前言 為了應對JAVA課設&#xff0c;小編走上了java的圖形界面編程的道路&#xff0c;通過博客分享自己的學習歷程&#xff0c;并進行筆記的記錄。 AWT&#xff08;Abstract Window Toolkit&#xff09;介紹 AWT&#xff08;抽象窗口工具包&#xff09;是 Java 最早的圖形用戶界…

vulhub復現CVE-2021-44228log4j漏洞

目錄 一&#xff1a;漏洞概述 二&#xff1a;漏洞原理 三&#xff1a;漏洞利用 lookup功能&#xff1a; JNDI解析器&#xff1a; ldap服務&#xff1a; RMI&#xff1a; 四&#xff1a;漏洞復現 4.1靶場 4.2dnslog測試 4.3部署jndi-injection-exploit 4.4打開監聽端口 4.5觸發請…

ip地址獲取失敗啥意思?ip地址獲取失敗怎么回事

在日常的網絡使用中&#xff0c;我們時常依賴于穩定的IP地址來確保數據的順暢傳輸和設備的正常識別。然而&#xff0c;有時我們會遇到“IP地址獲取失敗”的困擾&#xff0c;這不僅阻礙了我們的網絡訪問&#xff0c;還可能帶來一系列的網絡連接問題。那么&#xff0c;IP地址獲取…

如何在 Android 項目中實現跨庫傳值

背景介紹 在一個復雜的 Android 項目中&#xff0c;我們通常會有多個庫&#xff08;lib&#xff09;&#xff0c;而主應用程序&#xff08;app&#xff09;依賴所有這些庫。目前遇到的問題是&#xff0c;在這些庫中&#xff0c;libAd 需要獲取 libVip 的 VIP 等級狀態&#xf…