機器資料可能具有許多不同的格式和量。 天氣感應器、健康跟蹤器,甚至是空調裝置都會生成大量資料,它們需要一個大資料解決方案。 &HTTP://www.aliyun.com/zixun/aggregation/37954.html">nbsp;但是,您如何確定哪些資料是重要資料,如何確定該資訊有多大比例是有效的、 值得包含在報告中或有助於檢測警示準則? 本文將介紹為大量機器資料集的使用提供支援的一些挑戰,以及使用大資料技術和 Hadoop 的解決方案。 在探索資料存儲和供給的基本機制之前,需要考慮您要存儲何種資訊,如何存儲它,以及打算存儲多長時間。
Hadoop 的一個較大、但並不總是被提出來的問題是,它提供了一個只能附加的資料存儲來存儲大量資訊。 儘管此方法聽起來似乎非常適合存儲機器資料,但它會誘使人們長期存儲大量資訊。 這就帶來了問題,不是因為 Hadoop 無法存儲該資料,而是因為這一資料量為需要獲得即時的有效資訊的環境增加了不必要的負擔。
因此,在使用 Hadoop 來存儲機器資料時,需要仔細的管理。 不能存儲該資料並假設您可在以後檢索需要的資料,您需要制定一個計畫。 舉例而言,為了使用該資料發出即時警報,您可能不希望篩選多年的資料點來挑選出最新的細節。 在識別某個問題和發送警報時,除了説明構建趨勢和基準資訊,來自兩年前(甚至來自 6 個月前)的資料不可能還有用。
選擇要存儲的資料
對要存儲的資料進行有意的選擇。 問自己以下問題,並為要存儲的資料和存儲時長制定一個計畫。
您打算存儲多少資料?
要確定此資料量,可估算您的記錄的大小和資料到來的時間間隔。 根據此資訊,您可以很好地瞭解創建了多少資料,存儲了多少資料點,以及每天或每週會使用多大比例的資訊。 例如,一個 3 欄位的資料單元(例如日期、時間和資料點)雖然很小,但每 15 秒記錄一次,就會創建大約 46 KB 的資料。 將此值乘以 2000 個機器,每天就會生成 92 MB 的資料。 如果記錄多個資料點,資料量還會進一步增長。
您希望存儲多久以前的資料?
問自己兩個問題:您希望能夠查看所有資料點的多久以前的資料,您希望能夠確定多久以前的趨勢? 一周以前的單個最新資料不是很有用,因為在問題得到解決後,對該資訊的需求就會很小。
考慮到這一觀點,您需要確定一個基準。 基準是表示正常操作的資料點或矩陣。 有了基準之後,就更容易識別異常的趨勢或峰值。
您希望如何確定基準?
與前述問題相關的是,基準是您存儲的比較值,用於確定何時一個新資料超出了正常水準。 例如,您可能記錄了磁碟空間,而且將閾值設置為一個表示空閒磁碟空間量太小的特定百分比或硬性資料。
基準可以是以下三種基本類型之一:
已存在的基準:如果監視機器資料,用於比較的基準可能已經存在。 例如,一個以 2000 rpm 的轉速運行的風扇擁有不會不斷調整的固定基準。 受控的基準:對於受控,進而受監視的元件和系統,通過將受控的值與報告的值向比較來確定基準。 舉例而言,一個溫控系統擁有設定的問題和報告的溫度。 HVAC 可能被設定為 5°C,而報告溫度被設定為 4.8°C,所以在此示例中,設定的(需要的)溫度就變成了實際資料用於比較的基準。 歷史基準:這種類型的基準適用于根據現有值來計算基準的系統。 例如,對一條河的高度或流速的監視不是基於您知道的情形,而基於您之前識別和體驗到的情形。
歷史基準顯然會不斷改變,而且除了在極少的情況下,歷史基準通常不會被設定為硬性資料。 相反,歷史基準應該是一個變數,應該基於您擁有的感應器資訊和值來設定歷史基準。
例如,隨著時間的推移,您可能添加磁碟空間,或者應用程式需要資訊的時間和原因可能改變。 使用一個百分比來進行基準比較可能不起作用。 在擁有 10 TB 存儲時,5% 被視為很低的存儲,此時使用百分比沒有問題。 但在您擁有 30 TB 到 50 TB 存儲時,5% 就是 2.5 TB,如此大的數位可能無法被用作警告閾值。
基準需要通過查看過去的值來計算。 因此,您需要確定希望比較多少資料,比較多久以前的資料。 您將新資料與上周、上個月還是過去 6 個月的資料進行比較?
您是否希望描繪並報告歷史資料?
您可存儲並生成資訊的圖形表示,但與基本存放裝置一樣,您不可能返回到特定的分鐘或秒。 但是,您可能希望記錄一天中每 15 分鐘的最小值、最大值和平均值,以便生成圖表資訊。
考慮了這些問題之後,分析如何解決存儲資料的基本問題,如何確定觸發警報和通知的異常,以及如何處理在該過程中生成的資訊量。
在 Hadoop 中存儲資料
第一個問題是如何在 Hadoop 中存儲資料。 因為這個主題已超出本文的討論範圍,所以請參見 參考資料 中的連結,以便了解有關的更多資訊。
一般而言,Hadoop 不是很適合被用作此類資訊和存儲的即時資料庫。 儘管 Hadoop 是一個將資料附加到系統中的實用解決方案,但使用近線性的 SQL 資料庫來存儲該資料是更好的選擇。
但是,不要讓這一 Hadoop 限制阻礙了您。 一種將資料載入到資料庫中的實用方式是,通過附加到一個現有的開放檔,使用向 Hadoop Distributed File System (HDFS) 的永久寫入。 也可以使用 CSV 的僅支援附加的性質來記錄資料批次。 Hadoop 可用作集中器。
這裡遇到的一個難點是:要將所有不同的資訊都記錄在單個檔中一段時間,然後將此資訊複製到 HDFS 進行處理。 您也可以直接寫入 HDFS 上一個可從 Hive 或 HBase 訪問的檔。
在 Hadoop 內,許多小檔沒有少量大檔那麼高效和有用。 更大的檔能夠更高效地分佈在整個集群中。 因此,資料能夠更好地分佈在集群中的不同節點上。 這種分佈使得通過 MapReduce 處理該資訊變得更高效,因為更多節點擁有該資料的不同塊。
將來自多個資料點的資訊整理或分組到少量涵蓋更長時間段(比如一天中的所有資料),或者涵蓋多個主機、機器或其他主要資料收集器的更大檔中,這樣做會更高效。
這種方法會生成一個依據收集器、機器和可能的日期來命名的檔,其中每一項位於不同的行中。 例如:siteid、collectorid、datetime、settemp、reportedtemp。
確保資料廣泛分佈在整個系統中很重要。 舉例而言,對於一個 30 節點的 Hadoop 集群,您可能希望資料有效地分散到整個集群中,不會在處理期間浪費 CPU 或磁片 I/O。 這種分佈會得到最快的處理和回應時間,這在您希望將資料用於監視和警報用途時很重要。
這些檔可通過單個集中器來附加,通過從多個主機收集資料,該集中器將資訊寫入這些較大的檔中。
以這種方式分解資料,還意味著您可以依據主機和/或日期來有效地分區資料。 這種分佈使得資訊的分析和處理變得更高效,因為 Hive 等工具可按這些分區來限制對特定資料的處理。
使用 Hive 生成基準
如果還沒有硬性或受控的基準,那麼第一個工作就是創建基準資料和統計資料,確定正常的狀態。
此資訊可能會不斷被更改,所以您需要能夠通過分析現有的資訊,確定這段時間內的基準。 在 Hive 中,可通過使用合適的查詢來生成一段時間內的最小、最大或平均統計資料,從而分析該資訊。
如清單 1 所示,可根據來自多個感應器和主機的溫度感應器資料的報告值來計算該資訊。 按日期匯總資料。
清單 1. 使用 Hive 生成一段時間的最小/最大/平均統計資料
Hive> select to_date(from_unixtime(timelogged)),host,machine,min(reportval),max(reportval),avg(reportval) from temp group by to_date(from_unixtime(timelogged)),host,machine; ... 2014-03-05 1 1 2 14 7.9957529165098652014-03-05 1 2 2 14 7.9923660018278582014-03-05 1 3 2 14 8.0037094779850552014-03-05 1 4 2 14 8.004480045875672014-03-05 2 1 2 14 8.0065050266114732014-03-05 2 2 2 14 7.9999103990824872014-03-05 2 3 2 14 7.9 940684192606132014-03-05 2 4 2 14 7.9936741752235542014-03-06 1 1 2 14 8.002255049349632014-03-06 1 2 2 14 7.9883979345055 242014-03-06 1 3 2 14 7.990032028237142014-03-06 1 4 2 14 7.9923851232106672014-03-06 2 1 2 14 7.9997058631283092014-03-06 2 2 2 14 7.9752271390286952014-03-06 2 3 2 14 8.0164716648146932014-03-06 2 4 2 14 7.990849075102948Time taken: 22.655 se conds
此代碼提供了一些硬性資料來進行比較。 舉例而言,在這裡可以看到,所有感應器都有一個 2C 到 14C 的範圍,但平均值為 7C 到 8C。 此資料提供了一些重要的資料,這些資料可作為在正常操作期間執行一些有關警告通知的決定的基礎。
在此示例中,您匯總了記錄的該資料點的資料,但是,如果您記錄資料的頻率更高,那麼可以按小時或分鐘來進一步匯總資料。 也可以按不同元素進行分組 — 這裡的示例假設每個感應器和主機都是分開的,但在某些情況下,感應器可能獲得同一個靜態元素的不同讀數,這些讀數需要放在一起。
為了避免每次重新計算,可將此資料寫入一個新表中,以便在識別輸入的資料流程中的一個問題時將它們用作比較基礎。 您可以使用一個 INSERT INTO,使用清單 2 中的查詢的輸出來完成此任務。
清單 2. 使用 INSERT INTO
insert into table baselines selectto_date(from_unixtime(timelogged)),host,machine,min(reportval),max(reportval ),avg(reportval) from temp group by to_date(from_unixtime(timelogged)),host,machine;
對於持續的檢查,計算您認為的最新的值作為當前值。 檢查整個表,為相應的感應器和主機計算一個在整個資料集中都是正確的值。 可以按日期來刪除基準,如清單 3 所示。
清單 3. 按日期刪除基準
select host,machine,min(reportval),max(reportval),avg(reportval)from temp group by host,machine; ... Job 0: Map: 1 Reduce: 1 Cumulative CPU: 2.76 sec HDFS Read:13579346 HDFS Write: 215 SUCCESSTotal MapReduce CPU Time Spent: 2 seconds 760 msecOK1 1 2 14 7.9980555780604391 2 2 14 7.9909607527690651 3 2 14 7.9988657538685891 4 2 14 8.000196756981 982 1 2 14 8.0040971748012172 2 2 14 7.9911690836911612 3 2 14 8.0020022916401422 4 2 14 7.992673695906297
您可以計算其他值,比如標準差或計算百分比。 也可以計算超過這些值的特定點,創建您想要的基準。
現在您已經有了可供使用的基準。 接下來,我們將嘗試識別何時會出現一個問題。
識別即時問題
如果您的基準嵌入在資料中,要確定一個存在於所配置的參數之外的條目,您需要比較兩個值:select * from temp where temp.setval != temp.reportval;。
其中存在一個間隔或容錯值,通過執行一種更複雜的查詢來執行這一比較,如清單 4 所示。
清單 4. 複雜查詢
select * from temp where (temp.reportval <= (temp.setval-2)) or (temp.reportval >= (temp.setval+2);
如果擁有基準資料,可使用該資訊來執行一次合併,這基於主機和機器在一天內的平均值,如清單 5 所示。
清單 5. 執行一次合併
select * from temp join baselines on (to_date(from_unixtime(temp.timelogged)) = baselines.basedate and temp.machine = base lines.machine and temp.host = baselines.host) where reportval > baselines.logavg;2 1394089343 4 7 9 2014-03-06 2 4 2 14 7.9908492 1394082857 4 10 11 2014-03-06 2 4 2 14 7.9908492 1394085272 4 9 12 2014-03-06 2 4 2 14 7.9908492 1394091433 4 1 0 12 2014-03-06 2 4 2 14 7.9908492 1394082209 4 11 9 2014-03-06 2 4 2 14 7.9908492 1394087662 4 9 10 2014-03-06 2 4 2 14 7 .9908492 1394083754 4 10 9 2014-03-06 2 4 2 14 7.990849
對於每個機器、溫度感應器和相應的日期,此輸出從最初的來源資料生成所有超出所計算的基準的行。 採樣值可能比您預期的還要多。 針對一個更嚴格的版本計算實際值,例如比計算的值多 10%。
清單 6 與所有基準進行了比較。
清單 6. 與所有基準進行比較
select * from temp join baselines_all on (baselines_all.machine = temp.machine and baselines_all.host = temp.host) wh ere reportval > baselines_all.logavg;
對於警報資料,執行一次檢查,以便在發生錯誤時輸出一條特定的消息,如清單 7 所示。
清單 7. 警報資料
create table errors as select temp.host,temp.machine,temp.reportval,if (reportval > baselines_all.logavg,'Overtemp' ,'Normal') from temp join baselines_all on (baselines_all.machine = temp.machine and baselines_all.host = temp.host);
現在可以查詢這個表,確定 Overtemp 條目,並下鑽該資料。
現在可查詢即時資訊。 可以根據以前確定的限制和異常點來觸發警報。 因為此資訊僅包含 Hive 查詢,所以可在廣泛的環境和應用程式中,以可報告和可跟蹤的元素形式訪問它。
歸檔舊資訊和創建匯總資訊
要歸檔資訊(執行比較和生成基準的一個必要步驟),則需要壓縮資料。 在壓縮資料之後,壓縮包僅包含關鍵的靜態資訊(也就是目前狀態的平均值),用於與平均值之外的條目對比,然後可以相應地標記它們。
此方法需要生成一種調整過的基準查詢形式,該查詢使用最小值和最大值來匯總此資訊,還包含落在該資訊外部的異常值。
存儲多少資料和存儲的頻率完全取決於您。 確保存儲了可匯總的資料,這會生成該資料之外的資訊和值。
圖 1 中的示例圖形是根據類似于上一個示例的感應器資料而生成的。
圖 1. 示例圖
兩行(頂部為紅色,底部為綠色)之間的資訊是不相關的資料。 這些資訊很有用,因為它提供了可用於確定溫度的兩個極端的平均值。 但在該時間段內,您可以獲取這個時間段的平均值,並表明它大體相同。
匯總之後,提取匯總結果,忽略您確定的限制之外的資料點,然後創建一個匯總了這些外部資料的表。
使用一個插入命令來完成此操作,僅匯總落在這些元素之間的資料,如清單 8 中所示。
清單 8. 插入
create table temparchive as select to_date(from_unixtime(temp.timelogged)),temp.host,temp.machine,temp.reportval,0 from temp join baselines_all on (baselines_all.machine = temp.machine and baselines_all.host = temp.host) where (reportval < baselines_all.logavg+1) and (reportval > baselines_all.logavg-1) group by to_date(from_unixtime( temp.timelogged)),temp.host,temp.machine ,temp.reportval;
此代碼創建了一個表,其中包含首先按日期匯總,然後按機器和感應器匯總的資料。 該表包含報告的讀數,最後一列始終包含 0。 此表告訴您,該資料可安全地用作基準,因為計算的值包含在以前計算的基準內。 您僅指定了在基準平均值上下 1C 範圍內的值的基本差異。
可執行相反的操作,獲取以前為該日期/機器/感應器組合計算的基準之外的值。 在這種情況下,可提取所有值,而不是匯總的資訊,如清單 9 所示。
清單 9. 提取所有值
insert into table temparchive select temp.timelogged,temp.host,temp.machine,temp.reportval,1 from temp join baselines_all on (baselines_all.machine = temp.machine and baselines_all.host = temp.host) where (reportval > baselines _all.logavg+1) and (reportval < baselines_all.logavg-1);
這些條目是基準平均值之外的原始資料,在最後一列使用值 1 來標記。 使用此標記,在根據匯總和歸檔的日誌資訊來計算長期基準資料時,您可以有選擇地排除或包含這些值。
結束語
使用和處理原始機器資料時,獲取資訊並將它們存儲在 Hadoop 中是最簡單的問題。 您需要確定該資訊代表的含義,以及希望如何匯總和報告該資料。
在 擁有原始資料並能在 Hive 中對它們執行查詢之後,您還需要計算您的基準測試(如果它們還未修復)。 然後運行一個查詢,首先確定基準,然後對它進行查詢,以便查找這些基準限制之外的 資料。 本文介紹了一些基本技術,涉及處理和識別這些即時異常,以便識別需要報告和警告或描繪,然後向管理應用程式公開的錯誤。