02 youtube視頻下載器教程docker安裝kafka(使用spingboot連不上docker部署的kafka?)

时间:2024-05-15 10:37:41 编辑: 来源:

p>

一些常見的誤解脫胎于Hadoop,繼承了他的光環和生態,然而這也會給其帶來一定的困惑,首先就是光環一直被Hadoop給蓋住了,而且由于固有的慣性,大家會理所當然的認為Yarn只是Hadoop里的一個組件,有人會想過把Yarn拿出來單獨用么?然而,就像我在之前的一篇課程里,反復強調,Hadoop是一個軟件集合,包含分布式存儲,資源管理調度,計算框架三個部分

他們之間沒有必然的關系,是可以獨立開來的

而Yarn就是一個資源管理調度引擎,其一開始的設計目標就是為了通用,不僅僅是跑MR

現在基于Yarn之上的服務已經非常多,典型的比如Spark

這里還有另外一個誤區,MR目前基本算是離線批量的代名詞,這回讓人誤以為Yarn也只是適合批量離線任務的調度

其實不然,我在上面已經給出了分析,Yarn是完全可以保證長任務的穩定可靠的運行的

如何基于Yarn開發分布式程序本文不會具體教你如何使用Yarn的API,不過如果你想知道Yarn的API,但是又覺得官方文檔太過簡略,我這里倒是可以給出兩個建議:代碼使用范例可以參看SparkYarn相關的代碼

算的上是一個非常精簡的Yarn的adaptor

買本Yarn相關的書,了解其體系結構也有助于你了解其API的設計

接下來的內容會探討以下兩個主題:基于Yarn開發分布式程序需要做的一些準備工作基于Yarn開發容器調度系統的一些基本思路基于Yarn開發分布式程序需要做的一些準備工作肯定不能擼起袖子就開始干

開始動手前,我們需要知道哪些事情呢?Yarn原生的API太底層,太復雜了如果你想愉快的開發Yarn的應用,那么對Yarn的API進行一次封裝,是很有必要的

Yarn為了靈活,或者為了能夠滿足開發者大部分的需求,底層交互的API就顯得比較原始了

自然造成開發難度很大

這個也不是我一個人覺得,現在Apache的Twill,以及Hulu他們開發的時候Adaptor那一層,其實都是為了解決這個問題

那為什么我沒有用Twill呢,第一是文檔實在太少,第二是有點復雜,我不需要這么復雜的東西

我覺得,Twill與其開發這么多功能,真的不如好好寫寫文檔

最好是能開發一個解決一類問題的FrameworkYarn只是一個底層的資源管理和調度引擎

一般你需要基于之上開發一套解決特定問題的Framework

以Spark為例,他是解決分布式計算相關的一些問題

而以我開發的容器調度程序,其實是為了解決動態部署Web應用的

在他們之上,才是你的應用

比如你要統計日志,你只要在Spark上開發一個Application

比如你想要提供一個推薦系統,那么你只要用容器包裝下,就能被容器調度程序調度部署

所以通常而言,基于Yarn的分布式應用應該符合這么一個層次:Yarn->Adapter->Framework->ApplicationAdapter就是我第一條說的,你自個封裝了Yarn的API

Framework就是解決一類問題的編程框架,Application才是你真正要解決業務的系統

通過這種解耦,各個層次只要關注自己的核心功能點即可

保證你上層的Framework/Application可以移植Spark是個典型,他可以跑在Mesos上,也可以跑在Yarn上,還可以跑在自己上面(Standalone),實時上,泡在Yarn上的,以及跑Standalone模式的,都挺多的

這得益于Spark本身不依賴于底層的資源管理調度引擎

這其實也是我上面說的兩條帶來的好處,因為有了Adaptor,上層的Framework可以不用綁死在某個資源調度引擎上

而Framework則可以讓Applicaiton無需關注底層調度的事情,只要關注業務即可

另外,你費盡心機開發的Framework上,你自然是希望它能跑在的平臺上,已滿足的人的需求,對吧

基于Yarn開發容器調度系統的一些基本思路首先我們需要了解兩個概念:啞應用

所謂啞應用指的是無法和分布式系統直接進行交互,分布式系統也僅僅透過容器能進行生命周期的控制,比如關閉或者開啟的應用

典型的比如MySQL、Nginx等這些基礎應用

他們一般有自己特有的交互方式,譬如命令行或者socket協議或者HTTP協議

伴生組件

因為有了啞應用的存在,分布式系統為了能夠和這些應用交互,需要有一個代理

而這個代理和被代理的啞應用,具有相同的生命周期

典型的比如,某個服務被關停后,該事件會被分布式系統獲知,分布式系統會將該事件發送給Nginx的伴生組件,伴生組件轉化為Nginx能夠識別的指令,將停止的服務從Nginx的ProxyBackend列表中剔除

在容器調度系統中,如果Yarn的NodeManager直接去管理Docker則需要Yarn本身去做支持,我覺得這是不妥的

Yarn的職責就是做好資源管理,分配,調度即可,并不需要和特定的某個技術耦合,畢竟Yarn是一個通用型的資源調度管理框架

那基于上面的理論,我們基于Yarn,開發一套框架,這個框架會是典型的master-slave結構(這是Yarn決定的)

這個框架的slaves其實都是Docker的伴生對象

master可以通過這些Slave對容器實現間接的管理

我們簡單描述下他們的流程:用戶提交Application,申請資源;Yarn啟動Framework的master;Yarn啟動Framework的slave;slave連接上master,并且發送心跳,從而master知道slave的狀況slave啟動Docker,slave與被啟動的這個docker買粉絲ntainer一一對應;slave定時監控Container;slave發現買粉絲ntainercrash,slave自動退出,Yarn獲得通知,收回資源;master發現有節點失敗,發出新的節點要求,重新在另外一臺服務器上啟動slave,重復從2開始的步驟

這里還有一個問題,如果slave被正常殺掉,可以通過JVMShudownHook順帶把Container也關掉

但是如果slave被kill-9或者異常crash掉了,那么就可能導致資源泄露了

目前是這個信息是由master上報給集群管理平臺,該平臺會定時清理

你也可以存儲該信息,譬如放到Redis或者MySQL中,然后啟動后臺清理任務即可

了解了這個思路后,具體實施就變得簡單了,就是開發一個基于Yarn的master-slave程序即可,然后slave去管理對應的Docker容器,包括接受新的指令

master提供管理界面展示容器信息,運行狀態即可

當然,你還可以再開發一套FrameworkB專門和Nginx交互,這樣比如上面的系統做了節點變更,通知B的master,然后B的master通過自己的伴生組件Slave完成Nginx的更新,從而實現后端服務的自動變更和通知

使用spingboot連不上docker部署的kafka?

當使用Spring Boot連接Docker部署的Kafka時,可能遇到一些問題導致連接失敗。以下是一些可能的原因和解決方法:

端口問題:首先,確保Kafka在Docker容器中使用的端口(默認為9092)與Spring Boot應用程序中配置的端口一致。如果Docker容器中的端口映射到宿主機上的不同端口,你需要在Spring Boot應用程序的配置文件中相應地更改端口號。

網絡問題:確保Spring Boot應用程序和Docker容器之間的網絡連接正常。你可以嘗試在Spring Boot應用程序中ping Docker容器的IP地址,以確保網絡連通性。

配置文件問題:檢查Spring Boot應用程序中Kafka的配置文件(例如application.properties或application.yml),確保其中的服務器地址和端口配置正確。特別是,要確保服務器地址是Docker容器的IP地址,而不是localhost或127.0.0.1,因為Spring Boot應用程序和Docker容器可能運行在不同的網絡環境中。

Kafka依賴問題:確保在Spring Boot應用程序的pom.xml文件中添加了正確的Kafka依賴。你可以根據使用的Kafka版本和Spring Boot版本選擇合適的依賴項。

防火墻或安全組問題:如果Spring Boot應用程序和Docker容器在不同的機器上運行,需要確保防火墻或安全組規則允許它們之間的通信。

如果以上方法都無法解決問題,你可以嘗試在Spring Boot應用程序中打印更詳細的日志信息,以便更好地了解連接失敗的原因。例如,你可以啟用Kafka客戶端的調試日志記錄,以便查看與Kafka連接相關的任何錯誤或警告消息。

搜索关键词: