概觀
HDFS是Hadoop的一部分,它具備下載當前名稱節點快照的命令。咱們能夠經過Spark加載圖像或對其進行數據攝取,以使其進入Hive以分析數據並驗證它如何使用HDFS。node
HDFS文件系統元數據存儲在名爲「FsImage」的文件中。咱們在此快照中包含:git
整個文件系統命名空間。
地圖,塊和文件複製。
配額,ACLS等屬性
我必須解決的問題以下:github
運行該命令如下載映像並生成XML文件。
實現Spark做業以處理並將數據保存在Hive表中。
使用Hive SQL分析一些數據並使用GnuPlot繪製數據。
1.生成HDFS FsImage
FSImage能夠生成CSV,XML或分佈式格式的圖像,在個人狀況下,我必須評估塊和ACLS ; 由於它們是數組類型的字段,因此它們不能以CSV格式工做。你能夠在這裏看到更多細節:sql
Hadoop Hdfs圖像查看器
要生成圖像,請檢查名稱節點中的位置:數組
hdfs getconf -confKey dfs.namenode.name.dir
如今讓咱們下載圖片/tmp。就我而言,正在分析的文件大小爲35 GB:分佈式
hdfs dfsadmin -fetchImage / tmp
如今須要將其轉換爲可讀格式,在本例中爲XML:工具
hdfs oiv -p XML -i / tmp / fsimage_0000000000000103292 -o fsimage.xml
1.1將文件加載到Spark中並將其保存到Hive表中
我使用Databricks庫進行XML,而且它很容易加載,由於它已經將數據轉換爲數據框。您能夠在此處查看全部詳細信息:https://github.com/databricks/spark-xml。oop
個人Hive表的結構以下:測試
使用分析;
CREATE EXTERNAL TABLE若是不是 EXISTS分析.fsimage_hdfs
(
id string COMMENT '惟一標識號。' ,
type string COMMENT '數據類型:目錄或文件,連接等......',
name string COMMENT '目錄或文件的名稱..',
複製字符串COMMENT '複製號。' ,
mtime string評論'修改日期'。,
atime string評論'上次訪問的日期'。,
preferredblocksize string COMMENT '使用的塊的大小。' ,
權限字符串COMMENT '使用的權限,用戶,組(Unix權限)。' ,
acls string COMMENT '訪問權限:用戶和組。' ,
阻止字符串COMMENT '大小塊',
storagepolicyid string COMMENT '訪問策略的ID號。' ,
nsquota string COMMENT '配額名稱,若是-1被禁用。' ,
dsquota string COMMENT '空間可用並評估用戶/組,若是-1被禁用。' ,
fileunderconstruction string COMMENT '文件或目錄仍處於構建/複製狀態。' ,
path string COMMENT '文件或目錄的路徑。'
)
PARTITIONED BY(odate string,cluster string)
行格式SERDE'parquet.hive.serde.ParquetHiveSerDe '
做爲 INPUTFORMAT 存儲'parquet.hive.DeprecatedParquetInputFormat'
OUTPUTFORMAT'palam.hive.DeprecatedParquetOutputFormat '
LOCATION '/ powerhorse / bicudo / analyze / fsimage_hdfs' ;
在這種狀況下,因爲還有其餘要分析的集羣,所以使用ISO標準攝取日和集羣名稱建立了一個分區。fetch
使用spark-xml庫,ut很是容易在文件中建立解析器,讀取,修改和保存數據。這是一個加載XML數據的簡單示例:
val df = sparkSession。sqlContext。讀
。格式(「com.databricks.spark.xml」)
。選項(「rowTag」,「inode」)
。選項(「nullValue」,「」)
。load(pathFsImage)
我還建立了一些示例代碼,您能夠運行並使用您的映像進行測試:https://github.com/edersoncorbari/scala-lab
1.2使用GnuPlot分析信息和繪圖
在這些分析中,我使用SQL和GnuPlot來查看數據。其餘一些有趣的工具是:
https://github.com/paypal/NNA...
https://github.com/vegas-viz/...
繼續咱們的工做批量數據,咱們如今能夠作一些分析。使用羣集中最經常使用的複製值生成直方圖:
SELECT cast(hist .x AS int)AS x,
cast(hist .y AS bigint)y
從
(SELECT histogram_numeric(cast(複製AS DOUBLE),40)AS T0
FROM analyze .fsimage_hdfs
WHERE dataingestao = '2019-01-27'
AND CLUSTER = 'SEMANTIX_NORTH' AND preferredblocksize <> '')
T1 LATERAL VIEW爆炸(T0)explosion_table AS hist;
您可使用GnuPlot製做幾種類型的圖形,請在此處查看更多示例:GnuPlot演示。您須要在直方圖中複製輸出並將其放在示例文件replication.dat中:
Replication_XReplication_Y
129
13
277975
212602
247204
2139973
217612
224402
3170164
37461229
311038655
31443494
31910188
109267
106492
101719
101207
101318
如今複製下面的代碼並運行:
#!的/ usr / bin中/ gnuplot的
重啓
明確
設置數據文件分隔符「 t」
設置終端PNG大小1024,768
設置輸出「histogram-replication.png」
設置標題「複製集羣 - Semantix North」
設置 xlabel 「(X)」
設置 ylabel 「(Y)」
設置鍵頂部左水平autotitle columnhead外
情節'複製.d'你1:2 w衝動lw 10
生成的數據以下所示:
GNUPLOT
在這種狀況下,大多數數據都使用複製塊3.咱們能夠進行另外一次分析,以檢查在一週內修改的文件。下面,我使用weekly-changes.dat文件標準化了直方圖的輸出:
DateN_0Dir_1Files_2
2018-10-0146588.03579.043009.0
2018-10-02135548.04230.0131318.0
2018-10-0395226.04600.090626.0
2018-10-0492728.04128.088600.0
2018-10-05100969.03527.097442.0
2018-10-0677346.03455.073891.0
2018-10-0736326.01711.034615.0
使用GnuPlot:
#!的/ usr / bin中/ gnuplot的
重啓
明確
設置數據文件分隔符「 t」
設置終端PNG大小1024,768
設置輸出「histogram-weekly-changes.png」
設置標題「目錄和文件已更改[10/01 at 10/07] Cluster - Semantix NORTH」
設置 xlabel 「(X)」
設置 ylabel 「(Y)」
設置鍵頂部左水平autotitle columnhead外
設置 xtic旋轉-45比例0
將 ytics 設置爲nomirror
設置樣式填充實線邊框-1
設置 boxwidth 0 .5相對
設置樣式數據直方圖
設置樣式直方圖rowstacked
使用2:xtic(1)ti col,' u 3 ti col ''' u 4 ti col 繪製'weekly-changes.dat'
生成的數據以下所示:
圖片標題
我將留下一些可能有用的其餘查詢:
SELECT date_format(from_unixtime(cast(mtime / 1000 AS bigint)),'yyyy-MM-dd')
來自 fsimage_hdfs LIMIT 10 ;
SELECT權限,
count(1)AS totalfiles,
輪(總和(鑄造(preferredblocksize AS DOUBLE))/ 1024/1024/1024,2)AS sizegb
FROM fsimage_hdfs
在哪裏 odate = '2019-01-22'
和 cluster
= 'SEMANTIX_NORTH'
GROUP BY權限限制 10 ;
SELECT count(*)FROM fsimage_hdfs WHERE odate = '2018-12-22'
和 cluster
= 'SEMANTIX_NORTH' AND date_format(from_unixtime(cast(mtime / 1000 AS bigint)),'yyyy-MM-dd')= '2019-01-22' ;