大數據遷移:node
所謂的大數據遷移就是把某個節點上的數據(或者幾個節點上的數據)分別拷貝到不一樣數據節點上的過程.bash
就像我在的公司就是這樣作的,在CDHhadoop的版本中,一個命令就能完成上面的大數據遷移的全部事情.tcp
例如:oop
現有的機器:大數據
hadoop1(n1:namenode)spa
hadoop2(d1:datanode)日誌
hadoop3(d2:datanode)hadoop
hadoop4(d3:datanode)get
新增的機器:it
hadoop5(d4:datanode)
hadoop6(d5:datanode)
hadoop7(d6:datanode)
這裏咱們要把現有的機器某臺機器(這裏機器名:hadoop2,由於這幾臺機器的數據是同樣的)上的數據分別拷貝到新增的機器中(hadoop5,hadoop6,hadoop7)中.
舉例:
現有的機器hadoop1中的數據文件(單位:byte):
199884219068 /hive/warehouse/data1
135503186196 /hive/warehouse/data2
146310003399 /hive/warehouse/data3
456891836274 /hive/warehouse/data4
123959449467 /hive/warehouse/data5
數據遷移:
hadoop distcp hdfs://hadoop1:8020$dir hdfs://hadoop5:8020/hive/warehouse/
注意:這裏爲何我只拷貝到hadoop5中吶?是由於distcp這個命令會自動把數據拷貝到新增的不一樣機器上.
本身總結:(在拷貝過程當中,若是數據文件名稱已經存在,則distcp命令不會覆蓋原有文件,就會跳過該文件的拷貝.)
在這裏我寫了一個簡單的腳本(distcp.sh),來進行數據遷移,腳本內容以下:
#!/bin/bash
load_src=('/hive/warehouse/data1' '/hive/warehouse/data2' '/hive/warehouse/data3' '/hive/warehouse/data4' '/hive/warehouse/data5')
for src in "${load_src[@]}"
do
hadoop distcp hdfs://hadoop1:8020$src hdfs://hadoop5:8020/hive/warehouse/ >>/hadoop_tmp/log/distcp.log 2>>&1
done
注意:在運行腳本中的時候,要關注一下hadoop集羣情況,以避免數據量太大,致使集羣宕機.還有日誌(/hadoop_tmp/log/distcp.log)
能夠用一下命令查看集羣情況:
查看集羣使用情況或其餘信息:
hadoop dfsadmin -report
查看各個節點的狀態(status):
查看JobTracker(status)
hadoop mrhaadmin -getServiceState jt1
查看NameNode(status)
hdfs haadmin -getServiceState nn1
注意:在寫腳本的時候,注意拷貝機器的目錄,例如:hdfs://hadoop5:8020/hive/warehouse/這個目錄,
由於在源目錄中,好比想拷貝某個文件夾下的名稱,就要想對應的在目標目錄上填上這個目錄,否則就只會拷貝在/hive/warehouse/中.
舉例:
hadoop2下的/hive/warehouse/data1是一個文件夾,我想拷貝下面的文件file1.
distcp1.sh腳本內容:
#!/bin/bash
load_src=('/hive/warehouse/data1/file1' '/hive/warehouse/data1/file2')
for src in "${load_src[@]}"
do
####截取不一樣文件夾的名稱
tmp_src=${src:16:5}
####截取結果:data1
hadoop distcp hdfs://hadoop1:8020$src hdfs://hadoop5:8020/hive/warehouse/$tmp_src/ >>/hadoop_tmp/log/distcp.log 2>>&1
done
注意:仍是注意查看集羣狀態,還有日誌(/hadoop_tmp/log/distcp.log).
Name:Xr
Date:2014-05-11 21:01