宿主機運行pyspark任務讀取docker hadoop容器上的數據

熬了四個大夜才搞明白,最晚一天熬到早上十點/(ㄒoㄒ)/~~,最后發現只要加個參數就解決了。。。抱頭痛哭

問題描述:

Hadoop集群部署在docker容器中,宿主機執行pyspark程序讀取hive表

問題一:當master('local[*]')時,docker容器返回給driver端datanode節點的內網ip地址,修改hosts只能將域名轉發到ip地址,不能將ip地址轉發給ip地址。

問題二:當master('spark://localhost:7077'),因為容器做了端口映射,這里使用的時localhost。driver端為宿主機,spark會把driver端的hostname傳到spark集群worker節點上,spark work容器無法識別宿主機hostname

解決方法:

在宿主機配置好hosts,格式為:127.0.0.1 容器hostname(eg:datanode)

問題一:SparkSession加參數config("dfs.client.use.datanode.hostname", "true")//客戶端(如 Spark Driver)通過主機名訪問 DataNode。

問題二:SparkSession加參數config("spark.driver.host", "192.168.1.5") //宿主機ip地址

就是這么簡單。。。哭死(;′??Д??`)?

當時試了好多種辦法,nginx反向代理、DNSmasq自定義DNS、NPS內網穿透、Macvlan網絡模式,SNAT、最后甚至還裝了k8s集群外加k8s監控界面,真的哭死。看看現在時間吧,已經4:03了。。。😭😭😭

最后附上完整代碼:

import string
import random
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
from pyspark.sql.types import IntegerType, StringType, StructType, ArrayType
if __name__ == '__main__':# =============================== spark local模式 ===============================# 想要讀寫數據必須要配置windows下的Hadoop環境(不一定,未驗證)# 想要使用Hive元數據必須添加enableHiveSupport()這行代碼# 無論spark集群配置文件中有沒有配置spark元數據信息,都要在代碼工程中配置元數據信息,因為本地讀取不到集群中的環境變量,創建hive-site.xml文件或代碼中定義config都行# 如果不指定spark.sql.warehouse.dir信息則默認為: file:/C:/Users/yelor/spark-warehouse# 如果不知道hive.metastore.uris的值則找不到hive元數據,但不會報錯,只是無法使用hive元數據# spark.sql.warehouse.dir和hive.metastore.uris的值可以在代碼工程中配置hive-site.xml文件來指定# 容器外需要注意ip地址互通問題,需要配置hosts# 如果Hadoop集群部署在docker容器中,dfs.client.use.datanode.hostname=true在本地local模式下必須要加,不然spark會使用datanode的內網ip來通信import os# 這里可以選擇本地win系統的PySpark環境執行pySpark代碼,也可以使用虛擬機中PySpark環境,通過os可以配置。# os.environ['SPARK_HOME'] = r'D:\software2\spark-3.1.2-bin-hadoop3.2' # 暫時不寫也行PYSPARK_PYTHON = r"D:\AnacondaCache\envs\mspro\python" #python.exe或者簡寫為python都行# 當存在多個python版本環境時(如使用conda),不指定python環境會報錯os.environ["PYSPARK_PYTHON"] = PYSPARK_PYTHON# 配置指定提交作業至HDFS的用戶 不然上傳文件到 HDFS 的時候會報權限錯誤 參考文章:https://zhuanlan.zhihu.com/p/538265736# os.environ["HADOOP_USER_NAME"] = "yelor" # 暫時不寫也行# 在local模式下,如果想使用hive元數據,以下參數是必須要配置的:spark.sql.warehouse.dir、hive.metastore.urisspark = SparkSession.builder.\appName('udf_define').\master('local[*]').\config('spark.sql.shuffle.partitions', 2).\config('spark.sql.warehouse.dir', 'hdfs://localhost:9000/user/hive/warehouse').\config('hive.metastore.uris', 'thrift://localhost:9083').\config("spark.executor.memory", "1g").\config("spark.driver.memory", "1g").\config("dfs.client.use.datanode.hostname", "true").\config("spark.driver.host", "192.168.1.5").\enableHiveSupport(). \getOrCreate() # =============================== spark master集群模式 ===============================# 如果要連接spark集群,需要保證pyspark包的版本與集群的spark版本一致# 查看spark版本:spark-submit --version# 就算是使用集群執行作業,也必須要配置hive-site.xml文件中的信息,因為還是讀取driver端的環境變量# 必須添加enableHiveSupport()這行代碼# spark.driver.host保證代碼傳到spark容器中時以指定的ip地址為driver地址,不然會使用本機的hostname# import os# os.environ['PYSPARK_PYTHON']=r"D:\\AnacondaCache\\envs\\mspro\\python.exe"# spark = SparkSession.builder.\#     appName('udf_define').\#     master('spark://localhost:7077').\#     config('spark.sql.warehouse.dir', 'hdfs://localhost:9000/user/hive/warehouse').\#     config('hive.metastore.uris', 'thrift://localhost:9083').\#     config("spark.executor.memory", "512m").\#     config("spark.driver.memory", "512m").\#     config("spark.driver.host", "192.168.1.5").\#     enableHiveSupport(). \#     getOrCreate() # 如果spark配置文件中沒有配置spark元數據信息,就不能使用enableHiveSupport().\ 直接在代碼中配置元數據信息也能臉上hive元數據sc = spark.sparkContext# 設置日志級別為 DEBUG# sc.setLogLevel("DEBUG")# 查看表的存儲位置warehouse_dir = spark.conf.get("spark.sql.warehouse.dir")print(f"Spark SQL warehouse directory: {warehouse_dir}")# 指定要使用的數據庫database_name = "tb"spark.sql(f"USE {database_name}")# 執行 SQL 查詢# query = "show databases"# query = "SELECT * FROM orders"# query = "SELECT * FROM students"# df = spark.sql(query)# # 顯示查詢結果# df.show()# 生成 10000 條模擬數據data = []for _ in range(1000):# 生成隨機的姓名和年齡name = ''.join(random.choices(string.ascii_letters, k=5))age = random.randint(18, 60)data.append((name, age))# 定義 DataFrame 的列名columns = ["name", "age"]# 創建 DataFramedf = spark.createDataFrame(data, columns)# 創建臨時視圖# df.createOrReplaceTempView("test_table")try:# 創建持久化表(可選)df.write.saveAsTable("testaa_table", mode="overwrite")# 驗證數據插入spark.sql("SELECT * FROM testaa_table LIMIT 5").show()# 加入循環,保持 SparkSession 一直運行,方便看 Spark UIwhile True:try:import timetime.sleep(1)except KeyboardInterrupt:breakexcept Exception as e:print(f"An error occurred: {e}")finally:spark.stop()# 停止 SparkSession# spark.stop()

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

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

相關文章

《平凡的世界》:在泥土中尋找星辰的勇氣

“平凡不是平庸的代名詞,而是千萬人用脊梁扛起時代的勛章。”——路遙的《平凡的世界》用百萬字書寫了黃土地上孫少安、孫少平兩兄弟的掙扎與覺醒,撕開了“奮斗逆襲”的浪漫濾鏡,告訴你:真正的英雄主義,是在認清了生活…

【SpringMVC】深入解析使用 Postman 和瀏覽器模擬將單個與多個參數傳遞到后端和后端接收過程

SpringMVC—請求(Request) 訪問不同的路徑,就是發送不同的請求;在發送請求時,可能會帶一些參數,所以學習Spring的請求,主要是學習如何傳遞參數到后端以及后端如何接收; 我們主要是使用 瀏覽器 和 Postman …

04 | 初始化 fastgo 項目倉庫

提示: 所有體系課見專欄:Go 項目開發極速入門實戰課;歡迎加入我的訓練營:云原生AI實戰營,一個助力 Go 開發者在 AI 時代建立技術競爭力的實戰營;本節課最終源碼位于 fastgo 項目的 feature/s01 分支&#x…

Docker 安裝成功后,安裝 Dify 中文版本的步驟

Docker 安裝成功后,安裝 Dify 中文版本的步驟如下1: 克隆 Dify 代碼倉庫:在終端中執行以下命令,將 Dify 源代碼克隆至本地環境。 bash git clone https://github.com/langgenius/dify.git進入 Dify 的 docker 目錄: b…

RPC服務調用深度解析:從原理到Java實踐

一、RPC的核心原理與架構設計 1.1 RPC的本質 RPC(Remote Procedure Call)是一種分布式系統間通信協議,允許程序像調用本地方法一樣調用遠程服務。其核心目標是通過位置透明性和協議標準化隱藏網絡通信細節。RPC的調用流程可抽象為以下步驟&…

電腦的寫字板如何使用?

打開寫字板: 直接按一下鍵盤上的win R 鍵,然后輸入:write , 再按一下回車 , 即可打開寫字板 可以在里面寫文字 和 插入圖片等… , 如下所示: 保存寫字板內容: 當我們寫好了之后,…

醫療AI測試實戰:如何確保人工智能安全賦能醫療行業?

一、醫療AI測試的重要性 人工智能(AI)正廣泛應用于醫療行業,如疾病診斷、醫學影像分析、藥物研發、手術機器人和智能健康管理等領域。醫療AI技術的應用不僅提高了診斷效率,還能降低誤診率,改善患者治療效果。然而&…

AI日報 - 2025年3月12日

AI日報 - 2025年3月12日 🌟 今日概覽(60秒速覽) ▎🤖 AGI突破 | Anthropic CEO預測AI將主導代碼編寫 🔬 自訓練技術顯著提升LLM思維清晰度 ▎💼 商業動向 | OpenAI與CoreWeave達成119億美元基建協議 &…

跳表數據結構

跳表(Skip List)是一種支持高效插入、刪除和查找的鏈表結構,用于加速查找操作,特別適用于有序數據集合。它在Redis、LevelDB等系統中被用于**有序集合(Sorted Set)**的實現。 1. 跳表的結構 跳表的核心思…

系統會把原先的對話狀態堆棧從 [“assistant“] 更新為 [“assistant“, “update_flight“]這個更新的處理過程

這個更新主要是在 State 定義中通過 Annotated 來自動處理的。在 State 類型中,我們對 dialog_state 字段綁定了 update_dialog_stack 函數,如下所示: class State(TypedDict):messages: Annotated[list[AnyMessage], add_messages]user_inf…

HTTP發送POST請求的兩種方式

1、json String json HttpRequest.post(getUrl(method, "v1", url, userId, appKey)).header("Content-type", "application/json") // 設置請求頭為 JSON 格式.body(JSONUtil.toJsonStr(params)) // 請求體為 JSON 字符串.execute().body(); …

Windows 萬興恢復專家 Wondershare Recoverit-v13.5.7.9-[電腦數據恢復工具]

Windows 萬興恢復專家Wondershare_Recoverit 鏈接:https://pan.xunlei.com/s/VOL3z608vzAj_IYTvH-F1q7kA1?pwdiu89# 1. 打開Setup.exe進行安裝,安裝完不要打開軟件,記住安裝目錄 2. 將"Crack"文件夾內的所有文件復制到安裝目錄 …

Blender UV紋理貼圖,導出FBX到Unity

加載ps好的模型貼圖。右下角選擇《材質》基礎色里面選擇《圖像紋理》,選擇你的圖片。 選擇上面UV選項卡。左上角選擇UV編輯器。選中物體,TAB進入編輯模式。即可調整映射的圖像范圍。 其中渲染設置可以在左側下邊脫出。 導出帶紋理FBX模型 路徑選擇復…

華為hcia——Datacom實驗指南——以太網幀和IPV4數據包格式(一)

實驗開始 第一步配置環境 第二步配置客戶端 如圖所示,我們把客戶端的ip配置成192.168.1.10,網關設為192.168.1.1 第三步配置交換機1 system-view sysname LSW1 vlan batch 10 interface ethernet0/0/1 port link-type access port default vlan 10 qu…

解鎖 Ryu API:從 Python 接口到 REST 設計全解析

Ryu 4.34 版本的 API 功能分類、核心接口說明及示例代碼,結合其 Python 應用開發接口和 REST API 的設計特點進行綜合解析: 一、Python 應用開發 API Ryu 的核心能力通過 Python 類庫實現,開發者需繼承 RyuApp 類并注冊事件處理函數。 1. 應…

如何在需求分析階段考慮未來擴展性

在需求分析階段考慮未來擴展性的關鍵在于 前瞻規劃、靈活架構、標準設計。其中,前瞻規劃尤為重要,因為通過全面分析業務發展趨勢與技術演進,能夠在初期設計階段預留足夠擴展空間,降低后期改造成本,為企業長期發展奠定堅…

Docker搭建Redis哨兵模式【一主兩從三哨兵】

Docker搭建Redis哨兵模式 系統: CentOS 7 Dockder 版本: VMware虛擬機 網絡適配器 網絡連接 橋接模式:直接連接物理網絡查看IP命令 ip addr一、哨兵模式概述 1. 官方文檔與關聯博客 官方文檔:https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel關聯博…

關于統計建模大賽的選題

文章目錄 0.大賽主題1.量化分析和風險管理2.金融市場預測與統計建模3.投資與機器學習相關4.大數據和醫療5.智能制造相關的6.教育行業 0.大賽主題 統計創新應用數據引領未來:這個主題其實很寬泛,沒有什么明確的這個要求,所以只要是和我們的統…

Docker 學習筆記:從入門到部署,實戰演練全流程!

📌 開篇:為什么要學 Docker? 還在為環境不一致、部署麻煩、依賴沖突頭疼嗎?Docker 讓一切變得簡單!作為現代開發和運維的神器,Docker 讓我們可以用 一句命令 解決 “在我電腦上能跑” 的問題。今天&#x…

ThinkPhp 5 安裝阿里云內容安全(綠化)

composer require alibabacloud/green-20220302 首先要把php5(不支持php7)的執行文件設置到PATH環境變量 此外還要先執行composer update php5.5和php5.6的區別 5.5認為 <? 開頭的也是php文件&#xff0c;包括 <?php 5.6認為 <? 開頭的不是php文件&#xff0c;只…