版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)分析工具:ApacheDruid:ApacheDruid簡介與架構(gòu)分析1數(shù)據(jù)分析工具:ApacheDruid簡介與架構(gòu)分析1.1ApacheDruid簡介1.1.11什么是ApacheDruidApacheDruid是一個(gè)開源的數(shù)據(jù)存儲(chǔ)和查詢系統(tǒng),專為實(shí)時(shí)分析大規(guī)模數(shù)據(jù)集而設(shè)計(jì)。它能夠處理PB級(jí)別的數(shù)據(jù),提供低延遲的數(shù)據(jù)查詢和聚合功能,適用于實(shí)時(shí)監(jiān)控、用戶行為分析、日志分析等場景。Druid支持多種數(shù)據(jù)源,如Hadoop的輸出、關(guān)系數(shù)據(jù)庫、云存儲(chǔ)服務(wù)等,能夠?qū)崟r(shí)攝取數(shù)據(jù)并提供即時(shí)查詢。1.1.22ApacheDruid的特點(diǎn)與優(yōu)勢(shì)特點(diǎn)實(shí)時(shí)數(shù)據(jù)攝?。篋ruid能夠?qū)崟r(shí)攝取數(shù)據(jù),無需等待批處理作業(yè)完成。高并發(fā)查詢:支持高并發(fā)的查詢,能夠快速響應(yīng)來自多個(gè)客戶端的查詢請(qǐng)求。水平擴(kuò)展性:Druid的架構(gòu)設(shè)計(jì)允許系統(tǒng)通過增加節(jié)點(diǎn)來水平擴(kuò)展,以處理更大的數(shù)據(jù)量和更高的查詢負(fù)載。多維數(shù)據(jù)查詢:提供多維數(shù)據(jù)查詢和聚合功能,適用于復(fù)雜的數(shù)據(jù)分析需求。優(yōu)勢(shì)快速查詢:Druid使用列式存儲(chǔ)和預(yù)聚合技術(shù),能夠?qū)崿F(xiàn)毫秒級(jí)的查詢響應(yīng)。靈活的數(shù)據(jù)模型:支持多種數(shù)據(jù)模型,包括時(shí)間序列數(shù)據(jù)和多維數(shù)據(jù),適用于各種數(shù)據(jù)分析場景。易于集成:Druid提供RESTfulAPI,易于與各種前端應(yīng)用和數(shù)據(jù)可視化工具集成。社區(qū)支持:作為Apache項(xiàng)目,Druid擁有活躍的社區(qū)和豐富的文檔資源,便于學(xué)習(xí)和問題解決。1.1.33ApacheDruid的應(yīng)用場景實(shí)時(shí)監(jiān)控:在實(shí)時(shí)監(jiān)控系統(tǒng)中,Druid能夠快速處理和查詢數(shù)據(jù),提供實(shí)時(shí)的監(jiān)控指標(biāo)。用戶行為分析:分析用戶在網(wǎng)站或應(yīng)用上的行為數(shù)據(jù),如點(diǎn)擊流、會(huì)話數(shù)據(jù)等,以優(yōu)化用戶體驗(yàn)和產(chǎn)品設(shè)計(jì)。日志分析:處理和分析系統(tǒng)日志,快速識(shí)別問題和趨勢(shì),提高運(yùn)維效率。商業(yè)智能:在商業(yè)智能領(lǐng)域,Druid能夠處理大規(guī)模的業(yè)務(wù)數(shù)據(jù),提供即時(shí)的業(yè)務(wù)洞察。1.2ApacheDruid架構(gòu)分析1.2.11架構(gòu)概述ApacheDruid采用分布式架構(gòu),主要由以下幾個(gè)組件構(gòu)成:Broker:負(fù)責(zé)接收客戶端的查詢請(qǐng)求,將查詢分發(fā)到合適的節(jié)點(diǎn),并將結(jié)果合并后返回給客戶端。Historical:存儲(chǔ)歷史數(shù)據(jù),提供數(shù)據(jù)查詢服務(wù)。MiddleManager:負(fù)責(zé)實(shí)時(shí)數(shù)據(jù)的攝取和存儲(chǔ),同時(shí)也能存儲(chǔ)歷史數(shù)據(jù)。Coordinator:管理數(shù)據(jù)的攝取和存儲(chǔ),確保數(shù)據(jù)在集群中的分布均衡。Overlord:協(xié)調(diào)實(shí)時(shí)數(shù)據(jù)攝取任務(wù),包括任務(wù)的分配和監(jiān)控。Indexer:用于批量攝取數(shù)據(jù),通常用于處理歷史數(shù)據(jù)。Realtime:實(shí)時(shí)數(shù)據(jù)攝取和處理的組件,與Overlord和Indexer協(xié)同工作。1.2.22數(shù)據(jù)攝取流程數(shù)據(jù)攝取流程如下:數(shù)據(jù)源:數(shù)據(jù)可以來自多種源,如Hadoop、S3、Kafka等。實(shí)時(shí)攝?。篛verlord接收數(shù)據(jù)攝取任務(wù),分配給Realtime節(jié)點(diǎn)進(jìn)行實(shí)時(shí)數(shù)據(jù)攝取。數(shù)據(jù)存儲(chǔ):攝取的數(shù)據(jù)被存儲(chǔ)在MiddleManager和Historical節(jié)點(diǎn)上。查詢處理:Broker接收查詢請(qǐng)求,根據(jù)查詢條件將請(qǐng)求分發(fā)到Historical或MiddleManager節(jié)點(diǎn),獲取結(jié)果后返回給客戶端。1.2.33數(shù)據(jù)查詢流程數(shù)據(jù)查詢流程如下:查詢接收:Broker接收客戶端的查詢請(qǐng)求。查詢分發(fā):Broker將查詢分發(fā)到Historical或MiddleManager節(jié)點(diǎn),這些節(jié)點(diǎn)存儲(chǔ)著數(shù)據(jù)。結(jié)果聚合:Historical或MiddleManager節(jié)點(diǎn)執(zhí)行查詢,對(duì)數(shù)據(jù)進(jìn)行聚合。結(jié)果返回:Broker收集所有節(jié)點(diǎn)的查詢結(jié)果,進(jìn)行合并后返回給客戶端。1.2.44數(shù)據(jù)存儲(chǔ)與索引Druid使用列式存儲(chǔ),每個(gè)列的數(shù)據(jù)被獨(dú)立存儲(chǔ)和索引,這使得查詢和聚合操作能夠快速執(zhí)行。數(shù)據(jù)被分割成多個(gè)segment,每個(gè)segment包含一定時(shí)間范圍內(nèi)的數(shù)據(jù),這有助于提高查詢效率和數(shù)據(jù)管理。1.2.55高可用與容錯(cuò)Druid通過數(shù)據(jù)復(fù)制和故障轉(zhuǎn)移機(jī)制確保高可用性。每個(gè)數(shù)據(jù)segment都有多個(gè)副本,分布在不同的節(jié)點(diǎn)上,以防止單點(diǎn)故障。當(dāng)某個(gè)節(jié)點(diǎn)故障時(shí),查詢可以自動(dòng)重定向到其他節(jié)點(diǎn),確保服務(wù)的連續(xù)性。1.2.66實(shí)時(shí)數(shù)據(jù)攝取示例數(shù)據(jù)源假設(shè)我們有一個(gè)Kafka集群,其中包含實(shí)時(shí)的日志數(shù)據(jù)流。攝取任務(wù)配置{
"type":"realtime",
"spec":{
"dataSchema":{
"dataSource":"example_logs",
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["user_id","event_type"]
},
"metricsSpec":[
{
"type":"count",
"name":"event_count"
}
]
}
},
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"HOUR",
"queryGranularity":"MINUTE",
"rollup":true
}
},
"tuningConfig":{
"type":"kafka",
"kafka":{
"bootstrap.servers":"localhost:9092",
"topic":"example_logs_topic"
}
}
}
}解釋上述配置定義了一個(gè)實(shí)時(shí)攝取任務(wù),用于從Kafka主題example_logs_topic中攝取數(shù)據(jù),并存儲(chǔ)在名為example_logs的數(shù)據(jù)源中。數(shù)據(jù)被解析為JSON格式,其中包含時(shí)間戳、用戶ID和事件類型等字段。每小時(shí)生成一個(gè)數(shù)據(jù)segment,查詢時(shí)的最小時(shí)間粒度為分鐘。此外,還定義了一個(gè)計(jì)數(shù)器event_count,用于統(tǒng)計(jì)事件數(shù)量。1.2.77數(shù)據(jù)查詢示例查詢請(qǐng)求{
"queryType":"timeseries",
"dataSource":"example_logs",
"granularity":"MINUTE",
"intervals":["2023-01-01T00:00:00Z/2023-01-01T01:00:00Z"],
"aggregations":[
{
"type":"count",
"name":"event_count"
}
],
"postAggregations":[
{
"type":"arithmetic",
"name":"event_rate",
"fn":"/",
"fields":[
{
"type":"fieldAccess",
"name":"event_count"
},
{
"type":"constant",
"value":60
}
]
}
],
"context":{
"timeout":"10s"
}
}解釋此查詢請(qǐng)求從example_logs數(shù)據(jù)源中獲取2023年1月1日00:00至01:00之間的數(shù)據(jù),以分鐘為時(shí)間粒度。查詢計(jì)算了每分鐘的事件數(shù)量(event_count),并進(jìn)一步計(jì)算了每分鐘的事件率(event_rate),即事件數(shù)量除以60秒。查詢的超時(shí)時(shí)間為10秒。1.3總結(jié)ApacheDruid是一個(gè)強(qiáng)大的實(shí)時(shí)數(shù)據(jù)分析工具,通過其分布式架構(gòu)、實(shí)時(shí)數(shù)據(jù)攝取和低延遲查詢能力,能夠滿足大規(guī)模數(shù)據(jù)集的實(shí)時(shí)分析需求。無論是實(shí)時(shí)監(jiān)控、用戶行為分析還是日志分析,Druid都能提供高效、靈活的解決方案。通過深入理解其架構(gòu)和工作流程,可以更好地利用Druid來優(yōu)化數(shù)據(jù)處理和分析流程。2ApacheDruid架構(gòu)概覽2.11架構(gòu)組件詳解ApacheDruid是一個(gè)用于實(shí)時(shí)數(shù)據(jù)查詢和分析的開源數(shù)據(jù)存儲(chǔ)系統(tǒng)。它設(shè)計(jì)用于處理大量數(shù)據(jù),同時(shí)提供低延遲的查詢響應(yīng)。Druid的核心架構(gòu)由多個(gè)組件構(gòu)成,每個(gè)組件都有其特定的功能,共同協(xié)作以實(shí)現(xiàn)高效的數(shù)據(jù)處理和查詢。2.1.11.1組件介紹Broker:查詢協(xié)調(diào)器,接收用戶查詢并將其分發(fā)到合適的節(jié)點(diǎn),如Historical或MiddleManager,以獲取結(jié)果。Historical:存儲(chǔ)歷史數(shù)據(jù)的服務(wù)器,處理來自Broker的查詢并返回結(jié)果。MiddleManager:負(fù)責(zé)接收實(shí)時(shí)數(shù)據(jù)流并將其轉(zhuǎn)換為可查詢的段(segment),同時(shí)也可以存儲(chǔ)和查詢數(shù)據(jù)。Overlord:管理數(shù)據(jù)攝取過程,包括實(shí)時(shí)和批量攝取。Coordinator:負(fù)責(zé)數(shù)據(jù)的負(fù)載均衡,確保數(shù)據(jù)在集群中均勻分布。Indexer:用于批量攝取數(shù)據(jù),可以處理離線數(shù)據(jù)集。Realtime:實(shí)時(shí)數(shù)據(jù)攝取和查詢節(jié)點(diǎn),與MiddleManager協(xié)同工作。Peon:執(zhí)行Overlord分配的攝取任務(wù)的節(jié)點(diǎn)。SegmentMetadataStore:存儲(chǔ)關(guān)于數(shù)據(jù)段的元數(shù)據(jù),如位置和大小,用于查詢優(yōu)化。2.1.21.2組件交互數(shù)據(jù)攝?。簲?shù)據(jù)首先由Realtime節(jié)點(diǎn)接收,然后由Overlord調(diào)度Peon進(jìn)行數(shù)據(jù)段的創(chuàng)建。一旦數(shù)據(jù)段準(zhǔn)備好,它們將被存儲(chǔ)在MiddleManager或Historical節(jié)點(diǎn)上。查詢處理:Broker接收查詢,根據(jù)查詢類型和數(shù)據(jù)位置,將查詢分發(fā)到Historical或MiddleManager節(jié)點(diǎn)。這些節(jié)點(diǎn)執(zhí)行查詢并返回結(jié)果給Broker,Broker再將結(jié)果匯總后返回給用戶。2.22數(shù)據(jù)存儲(chǔ)與查詢流程2.2.12.1數(shù)據(jù)存儲(chǔ)ApacheDruid采用列式存儲(chǔ),這使得它在處理大量數(shù)據(jù)時(shí)非常高效。數(shù)據(jù)被分割成多個(gè)段,每個(gè)段可以獨(dú)立查詢,這有助于并行處理和提高查詢速度。示例數(shù)據(jù)假設(shè)我們有以下數(shù)據(jù):timestampuser_idevent_typeevent_value16000000001click116000000012view1016000000023click存儲(chǔ)過程數(shù)據(jù)攝?。簲?shù)據(jù)通過實(shí)時(shí)或批量攝取流程進(jìn)入Druid。數(shù)據(jù)分段:數(shù)據(jù)被分割成多個(gè)段,每個(gè)段包含一定時(shí)間范圍內(nèi)的數(shù)據(jù)。列式存儲(chǔ):每個(gè)段內(nèi)的數(shù)據(jù)按列存儲(chǔ),便于查詢時(shí)的快速訪問。2.2.22.2查詢流程示例查詢假設(shè)我們想要查詢?cè)谔囟〞r(shí)間范圍內(nèi),所有用戶的點(diǎn)擊事件總數(shù)。SELECTSUM(event_value)FROMeventsWHEREevent_type='click'ANDtimestamp>=1600000000ANDtimestamp<=1600000002;查詢過程查詢接收:Broker接收查詢。查詢分發(fā):Broker根據(jù)數(shù)據(jù)位置將查詢分發(fā)到Historical或MiddleManager節(jié)點(diǎn)。數(shù)據(jù)段查詢:Historical或MiddleManager節(jié)點(diǎn)在相關(guān)數(shù)據(jù)段上執(zhí)行查詢。結(jié)果匯總:查詢結(jié)果被匯總并返回給Broker。結(jié)果返回:Broker將最終結(jié)果返回給用戶。2.33擴(kuò)展性與容錯(cuò)機(jī)制2.3.13.1擴(kuò)展性ApacheDruid設(shè)計(jì)為高度可擴(kuò)展的。通過增加更多的Historical或MiddleManager節(jié)點(diǎn),可以輕松地?cái)U(kuò)展存儲(chǔ)和查詢能力。Coordinator負(fù)責(zé)監(jiān)控集群狀態(tài),確保數(shù)據(jù)均勻分布,從而實(shí)現(xiàn)負(fù)載均衡。2.3.23.2容錯(cuò)機(jī)制數(shù)據(jù)冗余:數(shù)據(jù)段在多個(gè)節(jié)點(diǎn)上復(fù)制,以防止單點(diǎn)故障。故障恢復(fù):如果某個(gè)節(jié)點(diǎn)失敗,Coordinator會(huì)重新分配其數(shù)據(jù)段到其他節(jié)點(diǎn),以確保數(shù)據(jù)的可用性。查詢重試:Broker在查詢失敗時(shí)會(huì)自動(dòng)重試,直到獲取到結(jié)果。通過這些機(jī)制,ApacheDruid能夠提供穩(wěn)定的服務(wù),即使在部分節(jié)點(diǎn)故障的情況下也能保證數(shù)據(jù)的完整性和查詢的可靠性。以上內(nèi)容詳細(xì)介紹了ApacheDruid的架構(gòu)組件、數(shù)據(jù)存儲(chǔ)與查詢流程,以及其擴(kuò)展性和容錯(cuò)機(jī)制。通過理解這些核心概念,可以更好地利用ApacheDruid進(jìn)行實(shí)時(shí)數(shù)據(jù)分析和查詢。2.4數(shù)據(jù)攝取與處理2.4.11數(shù)據(jù)攝取流程ApacheDruid提供了一種高效的數(shù)據(jù)攝取機(jī)制,允許實(shí)時(shí)和批量數(shù)據(jù)流的快速攝入。數(shù)據(jù)攝取流程主要涉及以下幾個(gè)步驟:數(shù)據(jù)源定義:首先,需要定義數(shù)據(jù)源,即數(shù)據(jù)的來源。這可以是文件系統(tǒng)、數(shù)據(jù)庫、消息隊(duì)列等。例如,使用Kafka作為數(shù)據(jù)源時(shí),需要配置Kafka的連接信息。數(shù)據(jù)攝入:數(shù)據(jù)通過攝入服務(wù)(IngestionService)進(jìn)入Druid。攝入服務(wù)可以是實(shí)時(shí)攝入(Real-timeIngestion)或批量攝入(BatchIngestion)。實(shí)時(shí)攝入適用于流式數(shù)據(jù),而批量攝入則用于處理歷史數(shù)據(jù)或大數(shù)據(jù)集。數(shù)據(jù)轉(zhuǎn)換:在數(shù)據(jù)攝入過程中,可以應(yīng)用數(shù)據(jù)轉(zhuǎn)換規(guī)則,如數(shù)據(jù)清洗、格式轉(zhuǎn)換等。例如,將CSV格式的數(shù)據(jù)轉(zhuǎn)換為Druid支持的格式。數(shù)據(jù)存儲(chǔ):數(shù)據(jù)被存儲(chǔ)在Druid的段(Segment)中,段是Druid數(shù)據(jù)存儲(chǔ)的基本單位。每個(gè)段包含一個(gè)時(shí)間窗口內(nèi)的數(shù)據(jù),可以進(jìn)行獨(dú)立查詢。數(shù)據(jù)索引:為了加速查詢,Druid會(huì)對(duì)數(shù)據(jù)進(jìn)行索引。索引包括時(shí)間戳索引、維度索引等,以提高查詢效率。2.4.22實(shí)時(shí)與批量數(shù)據(jù)處理實(shí)時(shí)數(shù)據(jù)處理實(shí)時(shí)數(shù)據(jù)處理是ApacheDruid的一個(gè)關(guān)鍵特性,它允許數(shù)據(jù)在攝入后立即可用。實(shí)時(shí)攝入服務(wù)(Real-timeIngestionService)接收數(shù)據(jù)流,處理并存儲(chǔ)數(shù)據(jù),同時(shí)創(chuàng)建索引。以下是一個(gè)使用Druid實(shí)時(shí)攝入服務(wù)的示例配置:{
"type":"realtime",
"spec":{
"dataSchema":{
"dataSource":"example",
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["dim1","dim2"],
"dimensionExclusions":[]
},
"metricsSpec":[
{
"type":"count",
"name":"count"
}
]
}
},
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"HOUR",
"queryGranularity":"MINUTE",
"rollup":true
}
},
"tuningConfig":{
"type":"realtime",
"maxRowsInMemory":100000,
"intermediatePersistPeriod":"PT10M"
}
}
}此配置定義了一個(gè)名為example的數(shù)據(jù)源,數(shù)據(jù)以JSON格式攝入,時(shí)間戳列名為timestamp,并定義了兩個(gè)維度dim1和dim2,以及一個(gè)計(jì)數(shù)指標(biāo)count。數(shù)據(jù)被按小時(shí)分段,按分鐘聚合。批量數(shù)據(jù)處理批量數(shù)據(jù)處理適用于處理歷史數(shù)據(jù)或大數(shù)據(jù)集。Druid提供了批量攝入工具,如druid-indexer,用于將數(shù)據(jù)轉(zhuǎn)換為Druid段并加載到集群中。以下是一個(gè)使用druid-indexer進(jìn)行批量攝入的示例命令:druidindexer\
--task-spec'{"type":"index","spec":{"dataSchema":{"dataSource":"example","parser":{"type":"json","parseSpec":{"format":"json","timestampSpec":{"column":"timestamp","format":"auto"},"dimensionsSpec":{"dimensions":["dim1","dim2"],"dimensionExclusions":[]},"metricsSpec":[{"type":"count","name":"count"}]},"granularitySpec":{"type":"uniform","segmentGranularity":"HOUR","queryGranularity":"MINUTE","rollup":true}},"ioConfig":{"type":"index","firehose":{"type":"local","baseDir":"/path/to/data","filter":"example.json"},"appendToExisting":false},"tuningConfig":{"type":"index","maxRowsInMemory":100000}}}'\
--overlord-ext-hostnamelocalhost\
--overlord-ext-port8091此命令與實(shí)時(shí)攝入配置類似,但使用local類型的firehose從本地文件系統(tǒng)加載數(shù)據(jù)。2.4.33數(shù)據(jù)壓縮與優(yōu)化ApacheDruid支持多種數(shù)據(jù)壓縮技術(shù),以減少存儲(chǔ)空間和提高查詢性能。數(shù)據(jù)壓縮主要在段(Segment)級(jí)別進(jìn)行,可以使用如LZ4、Snappy等壓縮算法。此外,Druid還提供了數(shù)據(jù)優(yōu)化策略,如數(shù)據(jù)分片(Sharding)和數(shù)據(jù)分區(qū)(Partitioning),以提高查詢效率。數(shù)據(jù)壓縮數(shù)據(jù)壓縮通過減少存儲(chǔ)空間來提高查詢性能。例如,使用LZ4壓縮算法,可以在創(chuàng)建段時(shí)應(yīng)用壓縮:{
"type":"index",
"spec":{
"dataSchema":{
"dataSource":"example",
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["dim1","dim2"],
"dimensionExclusions":[]
},
"metricsSpec":[
{
"type":"count",
"name":"count"
}
]
}
},
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"HOUR",
"queryGranularity":"MINUTE",
"rollup":true
}
},
"ioConfig":{
"type":"index",
"firehose":{
"type":"local",
"baseDir":"/path/to/data",
"filter":"example.json"
},
"appendToExisting":false
},
"tuningConfig":{
"type":"index",
"maxRowsInMemory":100000,
"compression":{
"type":"lz4",
"strategy":"BASIC"
}
}
}
}在上述配置中,compression字段定義了使用LZ4壓縮算法。數(shù)據(jù)優(yōu)化數(shù)據(jù)優(yōu)化策略包括數(shù)據(jù)分片和數(shù)據(jù)分區(qū)。數(shù)據(jù)分片將數(shù)據(jù)分散到多個(gè)服務(wù)器上,以提高查詢的并行處理能力。數(shù)據(jù)分區(qū)則將數(shù)據(jù)按維度或時(shí)間進(jìn)行分割,以減少查詢時(shí)需要掃描的數(shù)據(jù)量。例如,可以按時(shí)間進(jìn)行數(shù)據(jù)分區(qū):{
"type":"index",
"spec":{
"dataSchema":{
"dataSource":"example",
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["dim1","dim2"],
"dimensionExclusions":[]
},
"metricsSpec":[
{
"type":"count",
"name":"count"
}
]
}
},
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"HOUR",
"queryGranularity":"MINUTE",
"rollup":true
},
"partitionSpec":{
"type":"hashed",
"partitions":10,
"dimension":"dim1"
}
},
"ioConfig":{
"type":"index",
"firehose":{
"type":"local",
"baseDir":"/path/to/data",
"filter":"example.json"
},
"appendToExisting":false
},
"tuningConfig":{
"type":"index",
"maxRowsInMemory":100000
}
}
}在上述配置中,partitionSpec字段定義了數(shù)據(jù)分區(qū)策略,使用hashed類型,將數(shù)據(jù)按dim1維度進(jìn)行哈希分區(qū),共分為10個(gè)分區(qū)。通過上述步驟和配置,ApacheDruid能夠高效地處理和存儲(chǔ)大規(guī)模數(shù)據(jù),同時(shí)提供快速的查詢能力。2.5查詢與分析功能2.5.11Druid查詢語言Druid支持多種查詢類型,其中最常用的是SQL-like查詢語言和原生的JSON查詢格式。下面我們將通過一個(gè)具體的例子來了解如何使用Druid的查詢語言進(jìn)行數(shù)據(jù)查詢。示例:使用DruidSQL查詢數(shù)據(jù)假設(shè)我們有一個(gè)名為events的表,其中包含用戶事件數(shù)據(jù),字段包括timestamp(事件時(shí)間)、user_id(用戶ID)、event_type(事件類型)等。我們想要查詢2023年1月1日到2023年1月31日之間,所有用戶登錄事件的數(shù)量。--DruidSQL查詢示例
SELECTCOUNT(*)
FROMevents
WHEREevent_type='login'
ANDtimestampBETWEEN'2023-01-01T00:00:00Z'AND'2023-01-31T23:59:59Z';示例:使用JSON查詢格式同樣的查詢,如果使用JSON格式,代碼如下:{
"queryType":"timeseries",
"dataSource":"events",
"granularity":"all",
"intervals":[
"2023-01-01T00:00:00Z/2023-01-31T23:59:59Z"
],
"filter":{
"type":"and",
"fields":[
{
"type":"selector",
"dimension":"event_type",
"value":"login"
}
]
},
"aggregations":[
{
"type":"count",
"name":"count"
}
]
}2.5.22實(shí)時(shí)查詢與歷史查詢Druid支持實(shí)時(shí)查詢和歷史查詢,實(shí)時(shí)查詢用于處理近實(shí)時(shí)的數(shù)據(jù)流,而歷史查詢則用于查詢已經(jīng)存儲(chǔ)在Druid中的歷史數(shù)據(jù)。實(shí)時(shí)查詢示例假設(shè)我們正在監(jiān)控一個(gè)實(shí)時(shí)數(shù)據(jù)流,想要獲取過去10分鐘內(nèi)所有用戶的登錄事件數(shù)量。{
"queryType":"timeseries",
"dataSource":"events",
"granularity":"all",
"intervals":[
"-PT10M/now"
],
"filter":{
"type":"selector",
"dimension":"event_type",
"value":"login"
},
"aggregations":[
{
"type":"count",
"name":"count"
}
]
}歷史查詢示例對(duì)于歷史數(shù)據(jù)的查詢,我們可以指定一個(gè)具體的時(shí)間范圍,例如查詢2022年全年用戶登錄事件的數(shù)量。{
"queryType":"timeseries",
"dataSource":"events",
"granularity":"all",
"intervals":[
"2022-01-01T00:00:00Z/2022-12-31T23:59:59Z"
],
"filter":{
"type":"selector",
"dimension":"event_type",
"value":"login"
},
"aggregations":[
{
"type":"count",
"name":"count"
}
]
}2.5.33高級(jí)分析與聚合Druid提供了豐富的聚合函數(shù),可以進(jìn)行復(fù)雜的數(shù)據(jù)分析,例如計(jì)算平均值、最大值、最小值等。示例:計(jì)算平均登錄時(shí)間假設(shè)我們想要計(jì)算用戶登錄事件的平均時(shí)間,可以使用doubleSum和count聚合函數(shù),然后在客戶端計(jì)算平均值。{
"queryType":"timeseries",
"dataSource":"events",
"granularity":"all",
"intervals":[
"2023-01-01T00:00:00Z/2023-01-31T23:59:59Z"
],
"filter":{
"type":"selector",
"dimension":"event_type",
"value":"login"
},
"aggregations":[
{
"type":"doubleSum",
"name":"sum_of_login_time",
"fieldName":"login_time"
},
{
"type":"count",
"name":"count_of_login"
}
]
}在查詢結(jié)果中,我們將得到sum_of_login_time和count_of_login兩個(gè)字段,然后在客戶端計(jì)算平均登錄時(shí)間:#假設(shè)查詢結(jié)果為result
average_login_time=result['sum_of_login_time']/result['count_of_login']示例:使用HyperUnique進(jìn)行去重計(jì)數(shù)Druid的HyperUnique聚合函數(shù)可以高效地進(jìn)行去重計(jì)數(shù),例如統(tǒng)計(jì)一個(gè)月內(nèi)登錄的唯一用戶數(shù)量。{
"queryType":"timeseries",
"dataSource":"events",
"granularity":"all",
"intervals":[
"2023-01-01T00:00:00Z/2023-01-31T23:59:59Z"
],
"filter":{
"type":"selector",
"dimension":"event_type",
"value":"login"
},
"aggregations":[
{
"type":"hyperUnique",
"name":"unique_users",
"fieldName":"user_id"
}
]
}查詢結(jié)果將返回unique_users字段,表示一個(gè)月內(nèi)登錄的唯一用戶數(shù)量。通過上述示例,我們可以看到Druid不僅支持基本的查詢功能,還提供了實(shí)時(shí)查詢、歷史查詢以及高級(jí)聚合分析的能力,使其成為處理大規(guī)模時(shí)間序列數(shù)據(jù)的理想工具。2.6部署與管理2.6.11單機(jī)與集群部署ApacheDruid支持在單機(jī)模式和集群模式下部署,以適應(yīng)不同規(guī)模的數(shù)據(jù)處理需求。單機(jī)部署單機(jī)部署適用于測(cè)試和小型數(shù)據(jù)集的分析。在單機(jī)模式下,Druid的所有組件(如協(xié)調(diào)器、歷史服務(wù)器、查詢服務(wù)器、中間服務(wù)器和Broker)都在同一臺(tái)機(jī)器上運(yùn)行。這種部署方式簡單,易于設(shè)置,但不適用于生產(chǎn)環(huán)境中的大規(guī)模數(shù)據(jù)處理。集群部署集群部署是Druid在生產(chǎn)環(huán)境中的推薦部署方式。它通過在多臺(tái)機(jī)器上分布Druid的組件,提供了更高的可擴(kuò)展性和容錯(cuò)性。集群中的組件包括:協(xié)調(diào)器(Coordinator):負(fù)責(zé)管理數(shù)據(jù)段的分配和負(fù)載均衡。歷史服務(wù)器(HistoricalServer):存儲(chǔ)數(shù)據(jù)段,處理歷史數(shù)據(jù)的查詢。查詢服務(wù)器(QueryServer):處理實(shí)時(shí)數(shù)據(jù)的查詢。中間服務(wù)器(MiddleManager):接收實(shí)時(shí)數(shù)據(jù)流,將數(shù)據(jù)轉(zhuǎn)換為數(shù)據(jù)段并存儲(chǔ)。Broker:優(yōu)化查詢性能,將查詢分發(fā)給歷史服務(wù)器和查詢服務(wù)器。集群部署需要通過配置文件來定義每個(gè)組件的設(shè)置,例如:druid:
coordinator:
hostname:druid-coordinator
port:8081
historical:
hostname:druid-historical
port:8082
query:
hostname:druid-query
port:8083
middleManager:
hostname:druid-middlemanager
port:8084
broker:
hostname:druid-broker
port:80852.6.22資源管理與監(jiān)控資源管理在Druid集群中,資源管理主要涉及數(shù)據(jù)段的存儲(chǔ)和查詢性能的優(yōu)化。協(xié)調(diào)器負(fù)責(zé)監(jiān)控集群的健康狀態(tài),確保數(shù)據(jù)段均勻分布,避免熱點(diǎn)問題。歷史服務(wù)器和中間服務(wù)器的資源使用情況也需監(jiān)控,以確保查詢響應(yīng)時(shí)間和數(shù)據(jù)處理效率。監(jiān)控Druid提供了多種監(jiān)控工具和接口,包括:DruidConsole:內(nèi)置的Web界面,用于查看集群狀態(tài)、查詢性能和數(shù)據(jù)段分布。Prometheus:可與Druid集成,收集和存儲(chǔ)時(shí)間序列數(shù)據(jù),用于監(jiān)控和警報(bào)。Grafana:與Prometheus結(jié)合使用,提供數(shù)據(jù)可視化,幫助分析Druid的性能指標(biāo)。例如,使用Prometheus監(jiān)控Druid的查詢延遲:druid_query_processing_time_seconds2.6.33安全性與權(quán)限控制安全性Druid支持多種安全機(jī)制,包括:SSL/TLS:用于加密數(shù)據(jù)傳輸,保護(hù)數(shù)據(jù)在傳輸過程中的安全。Kerberos:提供身份驗(yàn)證,確保只有授權(quán)用戶可以訪問數(shù)據(jù)。權(quán)限控制Druid通過角色(Role)和權(quán)限(Permission)系統(tǒng)實(shí)現(xiàn)細(xì)粒度的訪問控制。角色定義了用戶可以執(zhí)行的操作,權(quán)限則控制對(duì)特定數(shù)據(jù)源的訪問。例如,創(chuàng)建一個(gè)角色data_analyst,只允許讀取sales_data數(shù)據(jù)源:{
"role":"data_analyst",
"permissions":[
{
"type":"read",
"dataSources":["sales_data"]
}
]
}此配置需通過Druid的權(quán)限管理API或控制臺(tái)進(jìn)行設(shè)置。通過以上部署、資源管理和安全性設(shè)置,可以確保ApacheDruid在各種環(huán)境中高效、安全地運(yùn)行。2.7Druid與生態(tài)系統(tǒng)集成2.7.11與Kafka的集成ApacheDruid與ApacheKafka的集成,使得Druid能夠?qū)崟r(shí)地從Kafka中消費(fèi)數(shù)據(jù)并進(jìn)行實(shí)時(shí)分析。Kafka作為高吞吐量的分布式發(fā)布-訂閱消息系統(tǒng),是實(shí)時(shí)數(shù)據(jù)流處理的理想選擇。Druid則擅長實(shí)時(shí)數(shù)據(jù)查詢和分析,兩者結(jié)合可以構(gòu)建出強(qiáng)大的實(shí)時(shí)數(shù)據(jù)處理和分析平臺(tái)。實(shí)現(xiàn)原理Druid通過KafkaIndexerTask來消費(fèi)Kafka中的數(shù)據(jù)。KafkaIndexerTask是一個(gè)可配置的進(jìn)程,它從Kafka的特定主題中讀取數(shù)據(jù),然后將數(shù)據(jù)轉(zhuǎn)換為Druid可以理解的格式,并最終將數(shù)據(jù)索引化到Druid中。配置示例{
"type":"kafka",
"dataSchema":{
"dataSource":"exampleDataSource",
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"HOUR",
"queryGranularity":"MINUTE",
"rollup":true
},
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["dim1","dim2"],
"dimensionExclusions":[]
}
}
},
"metricsSpec":[
{
"type":"count",
"name":"count"
}
],
"transformSpec":{
"transforms":[]
}
},
"ioConfig":{
"type":"index",
"firehose":{
"type":"kafka",
"consumerProperties":{
"bootstrap.servers":"localhost:9092",
"group.id":"druid-kafka-consumer"
},
"topics":["exampleTopic"]
},
"appendToExisting":false
},
"tuningConfig":{
"type":"kafka",
"maxRowsInMemory":100000,
"maxRowsPerSegment":5000000
}
}代碼示例在Druid中,配置KafkaIndexerTask通常通過JSON文件完成,不需要編寫代碼。但是,如果使用Druid的JavaAPI來創(chuàng)建任務(wù),可以參考以下示例://導(dǎo)入必要的Druid和Kafka包
importorg.apache.druid.data.input.kafka.KafkaConfig;
importorg.apache.druid.indexer.Task;
importorg.apache.druid.indexer.TaskStatus;
importorg.apache.druid.indexer.TaskTool;
importorg.apache.druid.indexer.ZkIndexTaskClient;
importorg.apache.druid.indexer.ZkIndexerConfig;
importorg.apache.druid.indexer.ZkIndexerService;
importorg.apache.druid.indexer.ZkTaskStatusService;
importorg.apache.druid.indexer.ZkWorkerConfig;
importorg.apache.druid.indexer.kafka.KafkaIndexTask;
importorg.apache.druid.indexer.kafka.KafkaIndexTaskTuningConfig;
importorg.apache.druid.indexer.kafka.KafkaIndexTaskIOConfig;
importorg.apache.druid.indexer.kafka.KafkaIndexTaskDataSchema;
//創(chuàng)建Kafka配置
KafkaConfigkafkaConfig=newKafkaConfig("localhost:9092","druid-kafka-consumer","exampleTopic");
//創(chuàng)建數(shù)據(jù)源配置
KafkaIndexTaskDataSchemadataSchema=newKafkaIndexTaskDataSchema("exampleDataSource","json","timestamp","auto",Arrays.asList("dim1","dim2"),Collections.emptyList(),Collections.singletonList(newCountAggregatorFactory("count")));
//創(chuàng)建IO配置
KafkaIndexTaskIOConfigioConfig=newKafkaIndexTaskIOConfig(false);
//創(chuàng)建調(diào)優(yōu)配置
KafkaIndexTaskTuningConfigtuningConfig=newKafkaIndexTaskTuningConfig(100000,5000000);
//創(chuàng)建Kafka索引任務(wù)
KafkaIndexTasktask=newKafkaIndexTask(dataSchema,ioConfig,tuningConfig,kafkaConfig);
//使用ZK客戶端提交任務(wù)
ZkIndexerConfigzkIndexerConfig=newZkIndexerConfig();
ZkWorkerConfigzkWorkerConfig=newZkWorkerConfig();
ZkIndexerServicezkIndexerService=newZkIndexerService(zkIndexerConfig,zkWorkerConfig);
ZkIndexTaskClientzkTaskClient=newZkIndexTaskClient(zkIndexerService);
TaskStatusstatus=zkTaskClient.submit(task);2.7.22與Hadoop的協(xié)同工作Druid可以與Hadoop協(xié)同工作,利用Hadoop的強(qiáng)大數(shù)據(jù)處理能力,將處理后的數(shù)據(jù)導(dǎo)入Druid進(jìn)行實(shí)時(shí)查詢和分析。這種集成方式特別適合處理大規(guī)模的歷史數(shù)據(jù)。實(shí)現(xiàn)原理Druid通過HadoopIndexerTask來實(shí)現(xiàn)與Hadoop的集成。HadoopIndexerTask是一個(gè)運(yùn)行在Hadoop集群上的MapReduce任務(wù),它讀取Hadoop中的數(shù)據(jù),進(jìn)行預(yù)處理和轉(zhuǎn)換,然后將數(shù)據(jù)索引化到Druid中。配置示例{
"type":"hadoop",
"dataSchema":{
"dataSource":"exampleDataSource",
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"DAY",
"queryGranularity":"HOUR",
"rollup":true
},
"parser":{
"type":"string",
"parseSpec":{
"format":"csv",
"timestampSpec":{
"column":"timestamp",
"format":"yyyy-MM-ddHH:mm:ss"
},
"dimensionsSpec":{
"dimensions":["dim1","dim2"],
"dimensionExclusions":[]
}
}
},
"metricsSpec":[
{
"type":"doubleSum",
"name":"metric1",
"fieldName":"value1"
},
{
"type":"doubleSum",
"name":"metric2",
"fieldName":"value2"
}
],
"transformSpec":{
"transforms":[]
}
},
"ioConfig":{
"type":"index",
"inputSpec":{
"type":"hadoop",
"dataSchema":{
"dataSource":"exampleDataSource",
"parser":{
"type":"string",
"parseSpec":{
"format":"csv",
"timestampSpec":{
"column":"timestamp",
"format":"yyyy-MM-ddHH:mm:ss"
},
"dimensionsSpec":{
"dimensions":["dim1","dim2"],
"dimensionExclusions":[]
}
}
},
"metricsSpec":[
{
"type":"doubleSum",
"name":"metric1",
"fieldName":"value1"
},
{
"type":"doubleSum",
"name":"metric2",
"fieldName":"value2"
}
]
},
"paths":["hdfs://localhost:9000/data/*"],
"format":"csv",
"compressionCodec":"none",
"filter":null,
"flattened":false
},
"appendToExisting":false
},
"tuningConfig":{
"type":"hadoop",
"jobProperties":{
"mapred.reduce.tasks":"10",
"mapred.map.tasks":"10"
}
}
}2.7.33與BI工具的連接Druid與BI工具的集成,使得BI工具可以直接查詢Druid中的數(shù)據(jù),進(jìn)行實(shí)時(shí)的報(bào)表和儀表盤展示。這種集成方式極大地提高了數(shù)據(jù)的可訪問性和分析效率。實(shí)現(xiàn)原理Druid提供了RESTfulAPI,BI工具如Tableau、PowerBI等可以通過調(diào)用這些API來查詢Druid中的數(shù)據(jù)。Druid的查詢語言是SQL兼容的,這使得BI工具可以使用標(biāo)準(zhǔn)的SQL查詢語法來訪問Druid。連接示例在Tableau中連接Druid的步驟如下:打開Tableau,選擇“連接到數(shù)據(jù)源”。在“連接到服務(wù)器”對(duì)話框中,選擇“Web數(shù)據(jù)連接”。輸入Druid的查詢URL,例如:http://localhost:8888/druid/v2/sql/0.9。輸入SQL查詢,例如:SELECTCOUNT(*)FROMexampleDataSourceWHEREdim1='value1'。點(diǎn)擊“確定”,Tableau將顯示查詢結(jié)果。注意事項(xiàng)確保Druid的查詢服務(wù)已經(jīng)啟動(dòng)。根據(jù)BI工具的不同,連接方式和查詢語法可能略有差異。需要對(duì)Druid的數(shù)據(jù)源和查詢語法有一定的了解,才能正確地在BI工具中進(jìn)行數(shù)據(jù)查詢和展示。2.8實(shí)戰(zhàn)案例與最佳實(shí)踐2.8.11實(shí)時(shí)日志分析在實(shí)時(shí)日志分析場景中,ApacheDruid提供了高效的數(shù)據(jù)攝取和查詢能力,使其成為處理大量流式數(shù)據(jù)的理想選擇。例如,一個(gè)電商網(wǎng)站可能需要實(shí)時(shí)監(jiān)控用戶行為,以快速響應(yīng)市場變化或系統(tǒng)異常。下面是一個(gè)使用ApacheDruid進(jìn)行實(shí)時(shí)日志分析的示例:數(shù)據(jù)模型假設(shè)日志數(shù)據(jù)包含以下字段:-timestamp:事件發(fā)生的時(shí)間戳。-user_id:用戶ID。-event_type:事件類型,如“click”,“purchase”等。-product_id:產(chǎn)品ID。-category:產(chǎn)品類別。數(shù)據(jù)攝取使用Druid的實(shí)時(shí)攝取任務(wù),可以將流式日志數(shù)據(jù)直接導(dǎo)入到Druid中。以下是一個(gè)使用Kafka作為數(shù)據(jù)源的攝取任務(wù)配置示例:{
"type":"realtime",
"spec":{
"dataSchema":{
"dataSource":"user_behavior",
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["user_id","event_type","product_id","category"]
},
"metricsSpec":[
{
"type":"count",
"name":"event_count"
}
]
}
},
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"HOUR",
"queryGranularity":"MINUTE",
"rollup":true
}
},
"ioConfig":{
"type":"kafka",
"kafka":{
"topic":"user_behavior_logs",
"bootstrapServers":"localhost:9092",
"consumerProperties":{
"group.id":"druid-consumer-group"
}
}
},
"tuningConfig":{
"type":"kafka",
"maxRowsInMemory":100000,
"maxRowsPerSegment":5000000
}
}
}查詢性能為了優(yōu)化查詢性能,可以使用Druid的預(yù)聚合功能。例如,如果經(jīng)常需要查詢每分鐘的點(diǎn)擊次數(shù),可以在數(shù)據(jù)攝取時(shí)就設(shè)置每分鐘的聚合,這樣在查詢時(shí)可以直接使用預(yù)聚合的數(shù)據(jù),而不需要對(duì)原始數(shù)據(jù)進(jìn)行實(shí)時(shí)聚合。{
"type":"realtime",
"spec":{
"dataSchema":{
"dataSource":"user_behavior",
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["user_id","event_type","product_id","category"]
},
"metricsSpec":[
{
"type":"count",
"name":"event_count"
},
{
"type":"doubleSum",
"name":"total_amount",
"fieldName":"amount"
}
]
}
},
"granularitySpec":{
"type":"uniform",
"segmentGranularity":"HOUR",
"queryGranularity":"MINUTE",
"rollup":true
}
},
"ioConfig":{
"type":"kafka",
"kafka":{
"topic":"user_behavior_logs",
"bootstrapServers":"localhost:9092",
"consumerProperties":{
"group.id":"druid-consumer-group"
}
}
},
"tuningConfig":{
"type":"kafka",
"maxRowsInMemory":100000,
"maxRowsPerSegment":5000000
}
}
}2.8.22電信行業(yè)應(yīng)用在電信行業(yè),ApacheDruid可以用于監(jiān)控網(wǎng)絡(luò)性能和用戶行為。例如,一個(gè)電信運(yùn)營商可能需要實(shí)時(shí)分析網(wǎng)絡(luò)流量,以檢測(cè)潛在的網(wǎng)絡(luò)擁塞或異常行為。以下是一個(gè)使用ApacheDruid進(jìn)行電信數(shù)據(jù)監(jiān)控的示例:數(shù)據(jù)模型電信數(shù)據(jù)可能包含以下字段:-timestamp:數(shù)據(jù)記錄的時(shí)間戳。-user_id:用戶ID。-network_type:網(wǎng)絡(luò)類型,如“4G”,“5G”等。-data_usage:數(shù)據(jù)使用量。-location:用戶位置。數(shù)據(jù)攝取使用Druid的實(shí)時(shí)攝取任務(wù),可以將來自網(wǎng)絡(luò)設(shè)備的日志數(shù)據(jù)導(dǎo)入到Druid中。以下是一個(gè)使用Kafka作為數(shù)據(jù)源的攝取任務(wù)配置示例:{
"type":"realtime",
"spec":{
"dataSchema":{
"dataSource":"network_traffic",
"parser":{
"type":"string",
"parseSpec":{
"format":"json",
"timestampSpec":{
"column":"timestamp",
"format":"auto"
},
"dimensionsSpec":{
"dimensions":["user_id","network_type","locat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 精準(zhǔn)識(shí)別課件教學(xué)課件
- 智慧養(yǎng)老中心解決方案
- 頸椎病解刨結(jié)構(gòu)
- 2024年超高速加工中心投資項(xiàng)目資金申請(qǐng)報(bào)告書
- 車場停電應(yīng)急預(yù)案
- 第六章 機(jī)械能守恒定律-功能關(guān)系與能量守恒 2025年高考物理基礎(chǔ)專項(xiàng)復(fù)習(xí)
- 2-1-4 微專題1-碳酸鈉與碳酸氫鈉的相關(guān)計(jì)算 高一上學(xué)期化學(xué)人教版(2019)必修第一冊(cè)
- 骨水泥在糖尿病足的應(yīng)用
- 醫(yī)療器械合作協(xié)議書范本
- 社交網(wǎng)絡(luò)鉤機(jī)租賃合同
- 2024考研英語二試題及答案解析
- 基于單片機(jī)的銀行排隊(duì)叫號(hào)系統(tǒng)
- 大模型應(yīng)用開發(fā)極簡入門基于GPT-4和ChatGPT
- 應(yīng)急救援人員培訓(xùn)計(jì)劃
- 中考字音字形練習(xí)題(含答案)-字音字形專項(xiàng)訓(xùn)練
- 食品安全與營養(yǎng)健康自查制度(學(xué)校食堂)
- 安全文明施工獎(jiǎng)罰明細(xì)表
- 全球及中國個(gè)人防護(hù)裝備(PPE)行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告(2024-2030)
- HG/T 2782-2024 化工催化劑顆??箟核榱Φ臏y(cè)定(正式版)
- CTD申報(bào)資料撰寫模板:模塊三之3.2.S.4原料藥的質(zhì)量控制
- 藥為什么這樣用?知到智慧樹網(wǎng)課答案
評(píng)論
0/150
提交評(píng)論