在遷移hdfs和hive之前我首先想到的是,是不是可以直接拷貝文件夾呢?畢竟hdfs文件實際都是存儲在設定的dir中,hive的元數據也都在mysql裏頭,備份再恢復一下簡直是so easy啊!好吧,這篇文章就是用來填上這個想法背後的各種坑的,也順便回顧一下部分相關環境配置的過程。
一、 準備工作
首先需要在新的虛擬機上完成運行hadoop的必備工作,以下操作主機和從機都要執行。
1. 創建hadoop用戶及相關配置
使用root用戶登錄vm,或使用su切換到root,執行下述命令
useradd -m hadoop #新建hadoop賬戶
passwd hadoop #設置密碼
然後在/etc/sudoers中添加下面這句%hadoop ALL=(ALL) NOPASSWD: ALL
使hadoop用戶可以免密使用sudo命令提升權限,提示找不到sudo命令的話就使用yum install sudo來安裝(centos中)。
2. SSH配置
爲了讓hadoop運行起來時不用頻繁的輸入密碼,所以需要爲主機和從機分別生成對稱密鑰,並添加到公鑰名單中。
su - hadoop # 切換到hadoop賬戶並切換到其home目錄
ssh-keygen -t dsa #dsa生成方式安全性更高,選擇默認的目錄即可,如果要免密就不要填寫密碼短語
cat id_rsa.pub >> authorized_keys # 將本機公鑰寫入公鑰名單,hdfs啓動時會ssh登錄本機
sudo chmod 700 ~/.ssh # 修改文件權限,否則免密無法生效
接下來使用下述命令將主機的公鑰依次遠程複製到從機的公鑰名單中ssh-copy-id -i ~/.ssh/id_dsa.pub 從機IP
此時便可以使用ssh免密登錄本機和遠程主機了。3. 環境變量配置
環境變量的配置和當初部署時一樣,直接從之前的.bash_profile或.bashrc中複製過來即可,如JAVA_HOME、JAVA_BIN、CLASSPATH、HADOOP_HOME、HIVE_HOME、PATH等。當然java環境自然需要先配好,具體教程百度有很多。
4. HOSTNAME修改
爲了省去每次填寫ip的麻煩我們需要修改主機和從機的hostname
su
hostname 你的主機名
# 或者在/etc/sysconfig/network中修改(沒有這行就自己增加):
HOSTNAME=你的主機名
重啓
然而我的vm並不允許重啓,第一種辦法一直提示需要root(已經是root了),所以我們可以用更簡單粗暴的方式來達到同樣的效果——修改hosts
sudo vim /etc/hosts
加入:
主機IP master # 主機hostname
從機IP slave1 # 從機1的hostname
... # 所有從機都要設置
本機IP 當前hostname # 重要
雖然hosts修改的是本地dns解析的結果,但是和修改hostname達到的效果是一樣的。
最後別忘了修改主機hadoop中的slaves文件,把需要當從機的hostname都修改成新的。
二、 Hdfs (NameNode & DataNode) 遷移
1. 停止服務
遷移前請在原先的主機上停止hdfs和yarn的服務,如果有其他相關服務也需要都停止。
stop-dfs.sh
stop-yarn.sh
如果你沒有將hadoop/sbin目錄配置到PATH的話,需要切到該目錄下執行sh,之後執行的一些shell腳本也同理。
2. 複製hadoop文件夾、hdfs數據文件夾、元數據文件夾
1)首先將hadoop文件夾進行遠程複製,主機複製到主機,從機複製到從機
scp -r hadoop root@接收方hostname:/usr/local
我通常將hadoop文件夾放在/usr/local下,所以需要指定對方的root賬戶,否則權限不夠,注意這兒會要求輸入接收方的root密碼。這兒使用的是整個文件夾複製的方式,推薦還是使用tar打包後再用scp傳輸,然後解壓。
在收到hadoop文件夾後需要恢復文件夾的所有者爲hadoop
cd /usr/local
sudo chown -R hadoop:hadoop hadoop/
2)複製hdfs數據文件夾和元數據文件夾
兩個文件夾的路徑都是在hdfs-site.xml中配置過的
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
dfs.namenode.name.dir配置了元數據的文件夾路徑,元數據(fsimage和edits)只在namenode中記錄,datanode.name.dir則是保存了所有數據塊的文件夾,這兒的複製方式和上述的一樣,不要忘了chown。由於我都設置在了hadoop文件夾裏,所以在上一步中就連帶着複製過去了。
3)修改hdfs和yarn配置
更新slaves文件(在主機上),以及hdfs-site.xml 、core-site.xml、mapred-site.xml、yarn-site.xml等文件中所有的ip設置,如果之前都是用hostname設置的那就不用修改了(hosts裏已經設置了對應關係了),建議都換成使用hostname設置。
注意:如果修改了JAVA_HOME,那麼hadoop/etc/hadoop下的hadoop-env.sh裏的JAVA_HOME也需要修改,這兒必須寫完整路徑,不知爲什麼這個腳本跑的時候獲取不到系統環境變量。
3. 啓動hdfs
到這兒NameNode和DataNode的遷移工作就都完成了,開啓下hdfs和yarn服務看下效果
start-dfs.sh
stat-yarn.sh
如果出現問題就去hadoop/logs目錄下看對應的log信息。
三、 Hive遷移
hive的遷移的重點在元數據mysql的遷移,如果你存放元數據的mysql在遠程服務器上且無需遷移,那麼就跳過這一Part吧。然而我的mysql布在了主機上……1. 遷移hive文件夾
過程和遷移hadoop文件夾一樣,使用scp後用chown修改所有者。
hive-site.xml中的相關配置如果有變動那也得更新一下。
2. 遷移保存hive元數據的mysql
1) 安裝mysql
使用su把用戶切到root,在新vm安裝mysql(服務器、客戶端、lib),具體的安裝過程和my.cnf配置百度都有。
2) mysql配置
啓動mysql服務,登錄mysql,修改root的密碼,授權等
service mysql start # 啓動服務,5.1版本要換成mysqld
chkconfig mysql on # 開機自啓動
mysql # 先用''@localhost登錄無需密碼
use mysql; -- 切換數據庫
UPDATE user SET password=PASSWORD('password') WHERE user='root'; -- 設置root的密碼
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'; -- root本地授權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' identified by '123'; -- 對root進行遠程授權,%表示針對所有遠程IP,遠程登錄密碼爲123
insert into mysql.user (Host,User,Password) values ("localhost","hive",password ("hive")); -- 創建hive用戶
create database hive; -- 創建hive數據庫,對應hive-site.xml中的配置
grant all on hive.* to hive@'%' identified by 'hive';
grant all on hive.* to hive@'localhost' identified by 'hive';
flush privileges;
exit;
防火牆可以選擇關閉,或者添加3306端口規則,然後重啓防火牆。這時就可以使用root遠程登錄mysql了,配置mysql中出現的任何denied問題大都是權限問題,爲此我還查了一堆資料,其實只要針對提示的用戶@主機,用mysql直接進入client對其grant all 就行。
3)備份與恢復
// 對原mysql備份,最後不要加分號
mysqldump -u username -p [-B] 數據庫名 [table1 table2 ...] > backup.sql
-u 指定用戶,-p手動輸入密碼,-B用於導出建庫語句但是不可跟表名,如果不寫後面的表名就備份所有表。對於hive庫需要使用hive用戶備份,還有一些--all-databases之類的備份所有數據庫的指令可以自行研究。然後使用scp將backup.sql遠程複製到新主機上。
// 在新的主機上恢復
mysql -u username -p [數據庫名] < backup.sql
不帶-B參數生成備份文件應該是沒有建庫語句的,所以需要先手動創建要導入的數據庫,使用mysql-gui或者自己create也行。4)修改hive元數據中的路徑
mysql遷移過來後,你會發現沒法啓動hive,因爲保存在mysql裏頭的元數據把數據地址寫死了。好,打開表DBS和表SDS,注意是兩張表。
將表DBS裏頭DB_LOCATION_URI字段裏的所有原IP都換成主機namenode的IP,表SDS則是修改LOCATION字段。
裏頭要替換的行可能很多,這兒介紹一個快捷的辦法,使用軟件遠程連接或用mysqldump將該表導出成sql,編輯該sql文件,刪除建表刪表語句,使用文本編輯器對IP進行批量替換,複製所有insert語句。由於原表有外鍵約束,在刪除原來數據時會報錯,按以下步驟來走就行
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE 表名;
粘貼剛纔複製的insert語句;
SET FOREIGN_KEY_CHECKS=1;
此時hive已經可以正常啓動,跑幾個查詢試試,如果還會報錯顯示原先vm的IP的話,那就在hive裏修改下每個表的信息吧show create table hive表名; -- 查看建表信息
alter table hive表名 set location 'hdfs://新IP/...'
好了,填坑完畢,大夥兒繼續愉快地使用hadoop吧~