大数据初级笔记二:Hadoop入门之Hadoop集群搭建
Hadoop集群搭建
把環(huán)境全部準備好,包括編程環(huán)境。
JDK安裝
版本要求:
強烈建議使用64位的JDK版本,這樣的優(yōu)勢在于JVM的能夠訪問到的最大內(nèi)存就不受限制,基于后期可能會學習到Spark技術(shù),所以建議在搭建系統(tǒng)環(huán)境的時候把JDK的版本安裝為64位。
如果已經(jīng)安裝,在你不確定安裝的版本情況下,可以使用如下方式查看:快捷鍵WIN+R,調(diào)出DOS窗口,然后輸入java –version就可以了,如圖所示:
IDEAK編程工具安裝
破解工具:IDEAKeyTool.jar
使用的方法:打開DOS,然后輸入用戶名USER_NAME即可獲取秘鑰。將計算好的秘鑰輸入到IDEA當中安裝即可。
1:將maven加入到IDEA當中,如果有安裝maven
2:將jdk加入到IDEA當中,否則編寫的程序報錯
3:改變字體的大小,含代碼區(qū)域和控制臺
4:改變編碼,否則默認新建的java文件的編碼是GBK
Maven安裝
安裝包:已經(jīng)下載好了,如果在mvn –version出現(xiàn)部分報錯,由于windows的權(quán)限問題導致的,參照`讀我.txt`解決該問題,如果你使用管理員權(quán)限,也可以直接解決該報錯問題。
環(huán)境變量的添加:%PATH%
查看maven是否正常安裝:mvn –version
前提條件下,你的JDK正常安裝并且已經(jīng)加入系統(tǒng)環(huán)境變量。
Maven中央倉庫:http://search.maven.org/
Maven本地倉庫:C:\Users\hasee\.m2\repository
先本地查找,然后沒有再聯(lián)網(wǎng)到中央倉庫查找需要的依賴,實際上Linux的RPM包也有它的中央倉庫,我們用yum安裝的時候其實就是通過中央倉庫來完成所有的依賴構(gòu)建的。
RPM包中央倉庫:http://rpmfind.net/
Maven配置文件講解:
<groupId>MLlibLearnging</groupId><!--項目組唯一標識-->
<artifactId>MLlib</artifactId><!--項目唯一標識-->
<version>1.0-SNAPSHOT</version><!--版本-->
假設上面是我們創(chuàng)建的Mavne工程項目的配置文件的坐標,如果你想要在本地的倉庫中看到這個,那么必須先將其install即可。具體的做法如下:
當我們構(gòu)建Maven的時候,如果出現(xiàn)報錯,比如出現(xiàn)MojoExecutionException報錯的情況下,請參考如下方法自行解決:
參考資料:
官方資料說明:https://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
其它資料說明:
http://stackoverflow.com/questions/23235430/maven-mojoexecutionexception
http://stackoverflow.com/questions/2619584/how-to-set-java-home-on-windows-7
解決說明:主要是JDK的環(huán)境變量配置問題導致出錯。
正常Install后,我們就可以看見我們自己構(gòu)建的maven項目出現(xiàn)在本地的文件庫了。
<groupId>MLlibLearnging</groupId>
<artifactId>MLlib</artifactId>
<version>1.0-SNAPSHOT</version>
上面的用本地文件庫的地址表示就是:
C:\Users\hasee\.m2\repository\MLlibLearnging\MLlib\1.0-SNAPSHOT
通過查詢本地庫,可以發(fā)現(xiàn)組ID,項目唯一ID,和版本號在本地倉庫的路徑關系。可以肯定的是,如果install后,那么本地倉庫當中會出現(xiàn)我們自己構(gòu)建的maven項目工程,如果以后我們自己需要引用到我們自己構(gòu)建的maven項目,那么,我們也可以按照常規(guī)的引用方式去引用,那么maven會先在本地的倉庫當中查找,先從組ID查找,然后再從項目唯一ID查找,然后再通過版本號確定具體的版本,然后找到對應的jar文件即可。
虛擬機安裝
Linux安裝及基本命令運用
鏡像安裝
文件基本操作
增刪改查:
創(chuàng)建文件:touch,vim,mkdir
移動和修改文件名:mv
刪除文件:rm –rf(強制刪除)
復制文件:cp 復制目錄加-R,R表示recursive,具體可以查看man cp
退回上一級目錄:cd ..(注意,cd后面要空格,否則語法錯誤)
查看:cat,more,tail,head
tail的動態(tài)顯示:tail –F
查詢倒數(shù)第N行數(shù)據(jù):tail –n N 文件
查詢前面第N行數(shù)據(jù):head –n N 文件 --àhead -n 10 services
注意,上面的 –n可以省略不寫,直接寫成head 10 services 或者tail 10 services
解壓:tar –xvzf
壓縮:tar –cvzf ,壓縮的時候,注意格式是tar –cvzf test.tar.gz test,這里表示是壓縮test,而不要寫反了,比如寫成tar –cvzf test test.tar.gz是錯誤的。
幫助命令:--help,whatis,man,info命令
具體用法如下:info cp /man cp /whatis cp /cp –help,注意當我們進入到幫助文檔的時候,我們按Q鍵退出,而不是ESC。
模式匹配命令:grep,它會匹配該行出現(xiàn)的字符grep查詢一個文件,例如: [root@hdfs ~]# grep root /etc/passwd。
管道符: | ,它的作用就是把左邊的輸出當做右邊的輸入
具體用法:cat /etc/rpc|grep nfsd
軟鏈接和硬鏈接:
仔細對比上面的,d表示的是目錄,l表示的就是軟鏈接。軟鏈接類似于快捷鍵,但不能跨分區(qū)存在,硬鏈接和源文件的inodes是一樣的,而linux的文件都是以inodes來進行標識的,inodes相同,
會被linux內(nèi)核認為是同一個文件,這也就意味著如果源文件有硬鏈接,當我們往源文件寫數(shù)據(jù)的時候,硬鏈接也會更新。注意,創(chuàng)建軟鏈接或者是硬鏈接的時候,生成的文件是不能存在的,
否則報錯(ls -i)。
硬鏈接的創(chuàng)建:ln 1.txt 2.txt 我們可以查看生成的2.txt和1.txt的inodes是否一致,查看方式:ls –I
軟鏈接的創(chuàng)建:ln –s 1.txt 2.txt 查看ll即可
實驗場景:
創(chuàng)建循環(huán)語句往源文件里面寫數(shù)據(jù):while (true); do echo 'i love bigdata ' >> 1.txt; sleep 1; done
打開一個窗口,然后動態(tài)的輸出硬鏈接的文件內(nèi)容:tail -F 2.txt
通過這個實驗可以發(fā)現(xiàn),往源文件里面寫入的數(shù)據(jù)也會同步更新到硬鏈接的文件當中。
文件權(quán)限基本操作
查看文件的所有者、所屬組和其他人。命令ll
注意區(qū)分目錄和文件的可讀可寫可執(zhí)行的問題。
問題:文件可以讀,是不是意味著可以刪除這個文件?
所以如果文件可以讀,只是代表這個文件可以被修改,但是至于這個文件能不能被刪除,不是由文件本身決定的,而是由它所在---的目錄的權(quán)限來決定的。
用戶管理
用戶信息文件: /etc/passwd
每一行都是一個用戶的信息文件
root:x:0:0:root:/root:/bin/bash
用戶名:密碼:用戶標志號:缺省組標志號:存放用戶全名等信息:用戶登錄系統(tǒng)后的缺省目錄:用戶使用的hsell,默認為bash
備注:
1:密碼位其實并沒有存放密碼的,因為passwd的權(quán)限為644
2:區(qū)別超級用戶的是UID,如果UID=0,則為超級用戶,root不一定是超級用戶,它只是一個名稱罷了
3:偽用戶UID=1-499,普通用戶500-60000,
4:bin:x:1:1:bin:/bin:/sbin/nologin //這個nologin表示該用戶是無法登錄的,很簡單,沒有shell命令解析器,就沒法把命令傳遞給內(nèi)核
密碼文件:/etc/shadow[批注1]
如果密碼被刪除,那么用戶不需要密碼直接登錄系統(tǒng),通過這個我們在忘記密碼的情況下,直接把用戶的密碼刪除,在重新設值即可。
bin:*:15980:0:99999:7:::
第4位為0表示不限定,如果為3,那么必須在3天之后才能修改密碼
第5位表示該密碼最大的有效期,如果設置為30,那么在30天后如果不修改密碼,那么直接登錄不了。這個可以強迫用戶修改密碼
第6位表示在上面的30天的前7天會警告用戶進行修改密碼
第7位表示賬戶的過期幾日后將永久停權(quán),0表示立即,-1表示永不
備注:pwconv,這個命令會把用戶設置的密碼會運行這個命令自動把密碼放到shadow的密碼位
用戶組文件:/etc/group
用戶組密碼文件:/etc/gshadow
用戶配置文件:/etc/login.defs
這里是一個用戶創(chuàng)建的缺省文件,它定義了用戶的郵箱,UID,GID的使用范圍,密碼的有效期,密碼有效最小長度等等信息
/etc/default/useradd
這個也是缺省文件
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1 //
EXPIRE= //過期時間
SHELL=/bin/bash
SKEL=/etc/skel //新添加的用戶存放的缺省路徑目錄
CREATE_MAIL_SPOOL=yes //是否在pool目錄下創(chuàng)建該用戶同名的保存郵件的文件
新用戶信息文件:/etc/skel
這個文件是隱藏的.
[root@tourbis etc]# ls -a ./skel
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla warning
這里面的的配置文件會自動拷貝到新用戶的家目錄下在你用useradd 用戶
登錄信息:/etc/motd
--message of the day表示今日消息的意思
這里只有在用戶登錄的時候才會把歡迎界面顯示在屏幕上,自定義
這里可以把一些消息寫在這里,那么任何用戶登錄時候都是可以看到這個消息。
自定義歡迎桌面:/etc/issue
這里我們可以配置系統(tǒng)的啟動歡迎界面,自定義
創(chuàng)建新用戶:useradd 用戶名,給用戶添加密碼:passwd 用戶名
切換用戶:su 用戶名
如果是root用戶或者PID=0的用戶切入到普通用戶,則不需要輸入用戶密碼,如果是普通用戶切入到其他用戶,則必須輸入密碼。
添加用戶只能是PID=0的用戶才有資格。
更改文件的所屬權(quán)限:chown user:user 文件名
實驗操作:
創(chuàng)建用戶,并給定用戶名,在其家目錄下,用root用戶創(chuàng)建一個文件,定義文件的權(quán)限chmod 445和444,查看cd和ls的區(qū)別,理解透徹如果不是所屬者或者是所屬組,那么就是其他人這句話的含義。并理解文件和目錄權(quán)限所代表的意思。
刪除用戶:userdel 用戶名 或者是userdel –r 用戶名,加r表示斬草除根,抄家及有關于它的一切全部清除。
當我們刪除用戶的時候,如果刪除用戶的進程還是存在的時候,會出現(xiàn)這個報錯:userdel: user fuck is currently used by process 7607
這種情況最簡單的方式就是ctrl+D,退出然后再登錄即可刪除用戶了。
添加組和刪除組
添加一個系統(tǒng)不存在的組
添加用戶組:groupadd –g 888 web //表示添加一個GID=888的web組
刪除用戶組:groupdel
修改用戶組信息:groupmod
文本編輯器
了解vi/vim文本編輯器
進入編輯器:
進入插入模式主要是a,i注意是小寫的,如果想在行首插入的時候,直接I,如果想在行尾的直接大A進入,如果想在行的上面插入O,如果想在行的下段插入o.
上面的a,I,o都是可以直接進入插入模式的。
定位模式:
其實 前面的I或者A,我們可以直接$或者0來完成定位操作。
H,J,K,L,H表示左移,L右移
gg表示到第一行,G表示最后一行,nG表示到第n行
設置行號:
命令:set nu 取消set nonu
Linux運行級別
打開vim /etc/inittab
查看當前運行級別:runlevel
查看運行級別將會啟動的運行程序:cd /etc/rc.d
[root@tourbis init.d]# cd /etc/rc.d
[root@tourbis rc.d]# ls
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
比如我的運行級別為3,那么就是rc3.d,進入這個目錄:
[root@tourbis rc3.d]# ls
K01smartd K50dnsmasq K76ypbind K95rdma S11portreserve S24nfslock S28autofs S90crond
K02oddjobd K50kdump K84wpa_supplicant K99rngd S12rsyslog S24rpcgssd S50bluetooth S95atd
K05wdaemon K60nfs K87restorecond S01sysstat S13cpuspeed S25blk-availability S55sshd S99certmonger
K10psacct K61nfs-rdma K88sssd S02lvm2-monitor S13irqbalance S25cups S58ntpd S99local
K10saslauthd K69rpcsvcgssd K89netconsole S08ip6tables S13rpcbind S25netfs S64mysql
K15htcacheclean K73winbind K89rdisc S08iptables S15mdmonitor S26acpid S80postfix
K15httpd K75ntpdate K92pppoe-server S10network S22messagebus S26haldaemon S82abrt-ccpp
K30spice-vdagentd K75quota_nld K95firstboot S11auditd S23NetworkManager S26udev-post S82abrtd
里面的文件都是軟鏈接,主要分為2大類,K(kill)和S(start)
這里面的S里面的全部會啟動。數(shù)字表示啟動順序,理論上來說,越小優(yōu)先級越高,數(shù)字相同安裝腳本的創(chuàng)建順序來執(zhí)行。
定時器crontab
作用:用于生成cron進程所需的crontab文件
crontab的命令格式:
----》crontab -l |-r | -e
-l表示顯示當前的crontab,-r表示刪除當前的crontab,-e表示使用編輯器編輯當前的crontab
格式
分鐘 小時 天 月 星期 命令/腳本
1小時的中的哪一分組
1天中的哪一個小時
1個月中的哪一天
1年中的哪一個月
1周中的哪一天
例如:
分鐘 小時 天 月 星期 命令/腳本
0 4 *
* * //這個表示凌晨4點進行
0 18 *
* 2//這個表示每個星期二的每天6點進行
定期檢測服務是否啟動?
每隔多少分鐘?
每隔2分鐘,12到14點,每年的3-6和9-12月,每周1-5執(zhí)行
每隔1小時只需要在第二列寫*/1即可[備注2]
進程管理
命令w:
Load average:分別顯示系統(tǒng)在過去1、5、15分鐘內(nèi)的平均負載程度
ps命令:
參數(shù):a顯示所有的用戶進程,u顯示用戶名和啟動的時間,x顯示沒有控制終端的進程,e顯示所有的進程,包括沒有控制終端的進程,l表示長格式顯示,w表示寬行顯示,
可以使用多個w進行加寬使用
Top命令:
按d可以修改刷新的時間,按c可以讓命令提示更全面
按u可以根據(jù)用戶查看其進程,按k可以用PID終止該進程
文件系統(tǒng)
/usr/bin 、 /bin :存放所有的用戶可以執(zhí)行的命令
/usr/sbin 、/sbin :存放只有root可以執(zhí)行的命令
/home:用戶缺省宿主主目錄
/proc:虛擬文件系統(tǒng),存放當前內(nèi)存鏡像
/dev:存放設備文件
/lib:存放系統(tǒng)程序運行所需的共享庫
/lost+found :存放一些系統(tǒng)出錯的檢查結(jié)果
備注:
在linux里面所有的設備都是文件。
/usr相等于window的/c:\windows
/tmp:存放臨時文件
/etc/:系統(tǒng)的配置文件
/var:包含進程發(fā)生變動的文件,如郵件、日志文件、計劃任務等
/usr:存放所有的命令、庫、手冊頁等
/mnt:臨時文件系統(tǒng)的安裝點
/boot:內(nèi)核文件及自舉程序文件保存的位置
查看系統(tǒng)分區(qū):df
查看分區(qū)信息,一般用df –h它以數(shù)據(jù)塊顯示,df –m以M顯示
[root@tourbis usr]# df –m
Filesystem 1M-blocks Used Available Use% Mounted on //掛載點,看做c,d盤
/dev/sda5 17863 9394 7556 56% /
tmpfs 246 0 246 0% /dev/shm
/dev/sda1 190 36 145 20% /boot
/dev/sda3 969 2 917 1% /home
統(tǒng)計文件大小:du
查看文件和目錄的大小,命令du –h 文件或者目錄
但是上面會顯示很多出來,所以只是統(tǒng)計出目錄大小不顯示目錄下面的文件大小的情況可以使用命令:du –sh /etc
網(wǎng)絡基本操作
沒有網(wǎng)絡更新時間:date 102509322016(月日小時分鐘年.秒)
有網(wǎng)絡更新時間:ntpdate aisa-pool.ntp.org,確保ntpd服務啟動
備注:時間準確對于集群而言是相當重要的。
修改網(wǎng)絡:setup
防火墻:service iptables status 、 vim /etc/sysconfig/iptables
Shell編程
set命令:
查看所有定義的變量包括系統(tǒng)的環(huán)境變量
unset NAME,可以刪除定義的變量
查看永久變量:echo $PATH
單引號和雙引號的區(qū)別:
[root@tourbis test]# time=12
[root@tourbis test]# date="$time hello";echo $date
12 hello
[root@tourbis test]# date='$time hello';echo $date
$time hello
單引號會原封不動的把值作為這個變量名的value,但是如果使用的是單引號,它還可以獲取單引號里面的其他變量值
程序略。
常用的功能
查看shell:vim /etc/shells
查看歷史記錄:history
查看別名:alias
輸出重定向: ls –l /tmp > /tmp.msg
查看開機啟動: chkconfig –list
NetworkManager 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
abrt-ccpp 0:關閉 1:關閉 2:關閉 3:啟用 4:關閉 5:啟用 6:關閉
abrtd 0:關閉 1:關閉 2:關閉 3:啟用 4:關閉 5:啟用 6:關閉
acpid 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
修改運行時候的服務狀態(tài) :
命令:chkconfig –levels 2345 sshd off //指定多個運行級別,它表示在運行級別2,3,4,5將sshd服務關閉,不再自啟
命令:chkconfig –level 2 sshd off //指定1個運行級別,它表示在運行級別2的時候,將sshd服務關閉
Hadoop偽分布式集群搭建
服務器網(wǎng)絡設置
Host-Only模式
橋接模式
NAT模式
登錄服務器:
userName:root
password:123456
查看linux的ip:ifconfig
重啟網(wǎng)絡:service network restart
重啟網(wǎng)絡:service network restart
主機名:hostname
更改主機名稱:vim /etc/sysconfig/network
域名映射:vim /etc/hosts
重啟系統(tǒng):init 6
SecureCRT遠程連接
域名設置
主機名設置
SSH免登錄配置
如果沒有就創(chuàng)建.ssh:mkdir .ssh
創(chuàng)建秘鑰:ssh-keygen 默認采用RSA算法
查看免登陸的主機:
[root@tourbis .ssh]# cat known_hosts
tourbis,192.168.1.88 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAre3rubrGIEoZO2CH3GgL9KJxzjqjtxFam/1cIYqgPAomm5iEuBAAI1ef+VMfA6/ePkSqQBTSfO8+tZlhNmwZWx0Cpjm9hliYLegI77M1LrqPZljY87ptD6qBBUq0nB+nQ+r67872xKmb5ns9hiG27olckXjFDB4El2fv1jOPtUWGrrynnjz/v5DJutMmscR+Oz54nWd52rXCn1sW3qzw35PsnZvTrflAG4FPqGU9h3roVAWWdrVL7N68wwufWL4Qr6wHu7ipE+RLjeXk8qDJhdRoqA1Ueh3hlJdwJW8P8WqmD7x2rBFmp8LhUqaalBmpA6CwScwjHFO1ooHOktpEhw==
dfs-node02,192.168.1.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAre3rubrGIEoZO2CH3GgL9KJxzjqjtxFam/1cIYqgPAomm5iEuBAAI1ef+VMfA6/ePkSqQBTSfO8+tZlhNmwZWx0Cpjm9hliYLegI77M1LrqPZljY87ptD6qBBUq0nB+nQ+r67872xKmb5ns9hiG27olckXjFDB4El2fv1jOPtUWGrrynnjz/v5DJutMmscR+Oz54nWd52rXCn1sW3qzw35PsnZvTrflAG4FPqGU9h3roVAWWdrVL7N68wwufWL4Qr6wHu7ipE+RLjeXk8qDJhdRoqA1Ueh3hlJdwJW8P8WqmD7x2rBFmp8LhUqaalBmpA6CwScwjHFO1ooHOktpEhw==
dfs-node03,192.168.1.90 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAre3rubrGIEoZO2CH3GgL9KJxzjqjtxFam/1cIYqgPAomm5iEuBAAI1ef+VMfA6/ePkSqQBTSfO8+tZlhNmwZWx0Cpjm9hliYLegI77M1LrqPZljY87ptD6qBBUq0nB+nQ+r67872xKmb5ns9hiG27olckXjFDB4El2fv1jOPtUWGrrynnjz/v5DJutMmscR+Oz54nWd52rXCn1sW3qzw35PsnZvTrflAG4FPqGU9h3roVAWWdrVL7N68wwufWL4Qr6wHu7ipE+RLjeXk8qDJhdRoqA1Ueh3hlJdwJW8P8WqmD7x2rBFmp8LhUqaalBmpA6CwScwjHFO1ooHOktpEhw==
0.0.0.0 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAre3rubrGIEoZO2CH3GgL9KJxzjqjtxFam/1cIYqgPAomm5iEuBAAI1ef+VMfA6/ePkSqQBTSfO8+tZlhNmwZWx0Cpjm9hliYLegI77M1LrqPZljY87ptD6qBBUq0nB+nQ+r67872xKmb5ns9hiG27olckXjFDB4El2fv1jOPtUWGrrynnjz/v5DJutMmscR+Oz54nWd52rXCn1sW3qzw35PsnZvTrflAG4FPqGU9h3roVAWWdrVL7N68wwufWL4Qr6wHu7ipE+RLjeXk8qDJhdRoqA1Ueh3hlJdwJW8P8WqmD7x2rBFmp8LhUqaalBmpA6CwScwjHFO1ooHOktpEhw==
localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAre3rubrGIEoZO2CH3GgL9KJxzjqjtxFam/1cIYqgPAomm5iEuBAAI1ef+VMfA6/ePkSqQBTSfO8+tZlhNmwZWx0Cpjm9hliYLegI77M1LrqPZljY87ptD6qBBUq0nB+nQ+r67872xKmb5ns9hiG27olckXjFDB4El2fv1jOPtUWGrrynnjz/v5DJutMmscR+Oz54nWd52rXCn1sW3qzw35PsnZvTrflAG4FPqGU9h3roVAWWdrVL7N68wwufWL4Qr6wHu7ipE+RLjeXk8qDJhdRoqA1Ueh3hlJdwJW8P8WqmD7x2rBFmp8LhUqaalBmpA6CwScwjHFO1ooHOktpEhw==
查看遠程登陸信息
拷貝秘鑰:ssh-copy-id 主機,比如ssh-copy-id -i docker
關閉防火墻
建議加入到開機啟動項:
命令:chkconfig –level 3456 iptables off
服務器JDK安裝
安裝步驟流程:
EXPORT JAVA_HOME=
PATH=$PATH:$JAVA_HOME/bin
上傳或下載文件
解壓文件
配置配置文件
配置環(huán)境變量
查看JDK版本信息
服務器Hadoop安裝
安裝步驟流程:
上傳或下載文件
解壓文件
配置配置文件
具體可以參考官網(wǎng)的單節(jié)點安裝,關于配置文件官網(wǎng)有詳細的解析。
export JAVA_HOME=/usr/jdk
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://tourbis:9000</value>
</property>
<property>
<name>hadoop.tmp.dir </name>
<value>/usr/hadoop/hdpdata</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>tourbis</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
slaves
配置datanode在哪臺機器上啟動
配置環(huán)境變量
格式化HDFS文件系統(tǒng)
[root@tourbis bin]# hdfs
Usage: hdfs [--config confdir] COMMAND
where COMMAND is one of:
dfs run a filesystem command on the file systems supported in Hadoop.
namenode -format format the DFS filesystem
secondarynamenode run the DFS secondary namenode
namenode run the DFS namenode
journalnode run the DFS journalnode
zkfc run the ZK Failover Controller daemon
分發(fā)到其它機器
scp -r source PATH
啟動HDFS集群
JPS查看進程
端口監(jiān)聽查看
查看啟動日志信息
網(wǎng)頁端查看
常見問題
loaded library異常
異常信息如下:
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /usr/hadoop/lib/native/libhadoop.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
18/08/09 09:58:56 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
我們檢測一下本地庫加載情況:
[root@hdfs ~]# hadoop checknative
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /usr/hadoop/lib/native/libhadoop.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
18/08/09 10:00:57 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop: false
zlib: false
snappy: false
lz4: false
bzip2: false
18/08/09 10:00:58 INFO util.ExitUtil: Exiting with status 1
hadoop本地庫加載情況
解決方案:
配置hadoop-env.sh文件尾端加下面參數(shù):
#解決Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError,
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"
Hadoop啟動不正常
用瀏覽器訪問namenode的50070端口,不正常,需要診斷問題出在哪里:
a、在服務器的終端命令行使用jps查看相關進程
(namenode1個節(jié)點 datanode3個節(jié)點 secondary namenode1個節(jié)點)
b、如果已經(jīng)知道了啟動失敗的服務進程,進入到相關進程的日志目錄下,查看日志,分析異常的原因
1)配置文件出錯,saxparser exception; ——找到錯誤提示中所指出的配置文件檢查修改即可
2)unknown host——主機名不認識,配置/etc/hosts文件即可,或者是配置文件中所用主機名跟實際不一致
(注:在配置文件中,統(tǒng)一使用主機名,而不要用ip地址)
3)directory 訪問異常—— 檢查namenode的工作目錄,看權(quán)限是否正常。
datanode啟動不正常
a)查看datanode的日志,看是否有異常,如果沒有異常,手動將datanode啟動起來
sbin/hadoop-daemon.sh start datanode
b)很有可能是slaves文件中就沒有列出需要啟動的datanode
c)排除上述兩種情況后,基本上,能在日志中看到異常信息:
1、配置文件
2、ssh免密登陸沒有配置好
3、datanode的身份標識跟namenode的集群身份標識不一致(刪掉datanode的工作目錄)
datanode節(jié)點超時時間設置
datanode進程死亡或者網(wǎng)絡故障造成datanode無法與namenode通信,namenode不會立即把該節(jié)點判定為死亡,要經(jīng)過一段時間,這段時間暫稱作超時時長。HDFS默認的超時時長為10分鐘+30秒。如果定義超時時間為timeout,則超時時長的計算公式為:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。
而默認的heartbeat.recheck.interval 大小為5分鐘,dfs.heartbeat.interval默認為3秒。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒。所以,舉個例子,如果heartbeat.recheck.interval設置為5000(毫秒),dfs.heartbeat.interval設置為3(秒,默認),則總的超時時間為40秒。
hdfs-site.xml中的參數(shù)設置格式:
<property>
<name>heartbeat.recheck.interval</name>
<value>2000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>1</value>
</property>
namenode安全模式
當namenode發(fā)現(xiàn)集群中的block丟失數(shù)量達到一個閥值時,namenode就進入安全模式狀態(tài),不再接受客戶端的數(shù)據(jù)更新請求
在正常情況下,namenode也有可能進入安全模式:
集群啟動時(namenode啟動時)必定會進入安全模式,然后過一段時間會自動退出安全模式(原因是datanode匯報的過程有一段持續(xù)時間)
也確實有異常情況下導致的安全模式
原因:block確實有缺失
措施:可以手動讓namenode退出安全模式,bin/hdfs dfsadmin -safemode leave
或者:調(diào)整safemode門限值: dfs.safemode.threshold.pct=0.999f
HDFS冗余數(shù)據(jù)塊自動刪除
在日常維護hadoop集群的過程中發(fā)現(xiàn)這樣一種情況:
某個節(jié)點由于網(wǎng)絡故障或者DataNode進程死亡,被NameNode判定為死亡,HDFS馬上自動開始數(shù)據(jù)塊的容錯拷貝;當該節(jié)點重新添加到集群中時,由于該節(jié)點上的數(shù)據(jù)其實并沒有損壞,所以造成了HDFS上某些block的備份數(shù)超過了設定的備份數(shù)。通過觀察發(fā)現(xiàn),這些多余的數(shù)據(jù)塊經(jīng)過很長的一段時間才會被完全刪除掉,那么這個時間取決于什么呢?
該時間的長短跟數(shù)據(jù)塊報告的間隔時間有關。Datanode會定期將當前該結(jié)點上所有的BLOCK信息報告給Namenode,參數(shù)dfs.blockreport.intervalMsec就是控制這個報告間隔的參數(shù)。
hdfs-site.xml文件中有一個參數(shù):
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>3600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
其中3600000為默認設置,3600000毫秒,即1個小時,也就是說,塊報告的時間間隔為1個小時,所以經(jīng)過了很長時間這些多余的塊才被刪除掉。通過實際測試發(fā)現(xiàn),當把該參數(shù)調(diào)整的稍小一點的時候(60秒),多余的數(shù)據(jù)塊確實很快就被刪除了。
集群初步使用
測試集群
測試的時候,往集群上傳和下載文件。也可以查看集群狀態(tài),比如hdfs dfsadmin
比如查看存活節(jié)點的信息
[root@hdfs ~]# hdfs dfsadmin -report -live
Configured Capacity: 37460910080 (34.89 GB)
Present Capacity: 24131354624 (22.47 GB)
DFS Remaining: 24130924544 (22.47 GB)
DFS Used: 430080 (420 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Live datanodes (2): Name: 192.168.1.91:50010 (dfs01)
Hostname: dfs01
Decommission Status : Normal
Configured Capacity: 18730455040 (17.44 GB)
DFS Used: 212992 (208 KB)
Non DFS Used: 6535073792 (6.09 GB)
DFS Remaining: 12195168256 (11.36 GB)
DFS Used%: 0.00%
DFS Remaining%: 65.11%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Aug 09 11:38:09 CST 2018 Name: 192.168.1.90:50010 (hdfs)
Hostname: hdfs
Decommission Status : Normal
Configured Capacity: 18730455040 (17.44 GB)
DFS Used: 217088 (212 KB)
Non DFS Used: 6794481664 (6.33 GB)
DFS Remaining: 11935756288 (11.12 GB)
DFS Used%: 0.00%
DFS Remaining%: 63.72%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Aug 09 11:38:06 CST 2018
Hadoop Shell命令
[root@tourbis hadoop]# hadoop fs
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] <path> ...]
[-cp [-f] [-p | -p[topax]] <src> ... <dst>]
…
動態(tài)擴容
如何實現(xiàn)?免登陸不需要做,但是域名映射,slaves需要改。
MapReducer使用
mapreduce是hadoop中的分布式運算編程框架,只要按照其編程規(guī)范,只需要編寫少量的業(yè)務邏輯代碼即可實現(xiàn)一個強大的海量數(shù)據(jù)并發(fā)處理程序
下面編寫大數(shù)據(jù)入門程序—WordCount程序
需求
從大量(比如T級別)文本文件中,統(tǒng)計出每一個單詞出現(xiàn)的總次數(shù)
mapreduce實現(xiàn)思路
Map階段:
a) 從HDFS的源數(shù)據(jù)文件中逐行讀取數(shù)據(jù)
b) 將每一行數(shù)據(jù)切分出單詞
c) 為每一個單詞構(gòu)造一個鍵值對(單詞,1)
d) 將鍵值對發(fā)送給reduce
Reduce階段:
a) 接收map階段輸出的單詞鍵值對
b) 將相同單詞的鍵值對匯聚成一組
c) 對每一組,遍歷組中的所有“值”,累加求和,即得到每一個單詞的總次數(shù)
d) 將(單詞,總次數(shù))輸出到HDFS的文件中
具體編碼實現(xiàn)
pom.xml導入依賴
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.1</version>
</dependency>
</dependencies>
編寫業(yè)務代碼
public class WordCountDriver {
public static class WordCountDriverMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String s = value.toString();
String[] lines = s.split(",");
for(String word:lines){
context.write(new Text(word),new IntWritable(1));
}
}
}
public static class WordCountDriverReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum=0;
for(IntWritable value:values){
sum+=value.get();
}
context.write(key,new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job wcJob = Job.getInstance();
wcJob.setJarByClass(WordCountDriver.class);
wcJob.setMapperClass(WordCountDriverMapper.class);
wcJob.setReducerClass(WordCountDriverReducer.class);
wcJob.setMapOutputKeyClass(Text.class);
wcJob.setMapOutputValueClass(IntWritable.class);
wcJob.setInputFormatClass(TextInputFormat.class);
FileInputFormat.setInputPaths(wcJob, new Path(args[0]));
FileSystem fileSystem = FileSystem.get(conf);
Path path = new Path(args[1]);
if(fileSystem.exists(path)){
fileSystem.delete(path,true);
}
FileOutputFormat.setOutputPath(wcJob, path);
System.out.println(wcJob.waitForCompletion(true) ? 0 : 1);
}
}
打包,并啟動服務器hadoop集群
先用IDEA打jar包。然后啟動Hadoop集群
由于需要用到MapReducer,所以還需要啟動start-yarn.sh
全部啟動:start-all.sh,全部停止:stop-all.sh
單獨啟動;start-dfs.sh ,start-yarn.sh
啟動之后,查看監(jiān)聽端口:
網(wǎng)頁端查看:
http://192.168.1.90:8088
上傳到服務器
把jar包上傳到服務器
運行jar包
[root@hdfs ~]# hadoop jar bigdatasum.jar /word /wordout
18/08/09 11:27:09 INFO client.RMProxy: Connecting to ResourceManager at hdfs/192.168.1.90:8032
18/08/09 11:27:12 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
18/08/09 11:27:22 INFO input.FileInputFormat: Total input paths to process : 1
18/08/09 11:27:22 INFO mapreduce.JobSubmitter: number of splits:1
18/08/09 11:27:24 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1533785079112_0001
18/08/09 11:27:27 INFO impl.YarnClientImpl: Submitted application application_1533785079112_0001
18/08/09 11:27:27 INFO mapreduce.Job: The url to track the job: http://hdfs:8088/proxy/application_1533785079112_0001/
18/08/09 11:27:27 INFO mapreduce.Job: Running job: job_1533785079112_0001
18/08/09 11:28:04 INFO mapreduce.Job: Job job_1533785079112_0001 running in uber mode : false
18/08/09 11:28:05 INFO mapreduce.Job: map 0% reduce 0%
18/08/09 11:28:25 INFO mapreduce.Job: map 100% reduce 0%
18/08/09 11:28:47 INFO mapreduce.Job: map 100% reduce 100%
18/08/09 11:28:48 INFO mapreduce.Job: Job job_1533785079112_0001 completed successfully
18/08/09 11:28:49 INFO mapreduce.Job: Counters: 49
運行jar
提交任務到集群: hadoop jar bigdatasum.jar /word /wordout
頁面查看提交的任務情況:
任務完成
查看結(jié)果
[root@hdfs wordout]# hdfs dfs -cat /wordout/part-r-00000
a 7
c 3
d 1
s 1
v 2
編碼運行過程報錯
第一種access0,權(quán)限問題
解決方案:
在我們的項目新建一個和源碼一樣的包,這樣它就可以覆蓋掉源代碼,然后我們?nèi)バ薷募纯桑襟E如下:
1、Maven下載hadoop的源代碼
2、新建項目包:org.apache.hadoop.io.native
在項目下面創(chuàng)建類NativeIO,然后到源代碼里面拷貝NativeIO代碼,覆蓋我們剛剛創(chuàng)建的那個類,然后搜索access0這個方法,把原來的返回值設置為返回true即可解決
缺失MSVCR100.dll而報錯
這個錯誤是缺失msvcr100.dll而報錯產(chǎn)生的,我們可以進入hadoop的bin目錄里面:
當我們雙擊這個文件的時候:
會彈出下面的報錯:
解決方案:
1.下載這個dll,如果系統(tǒng)是32位的,將其放到C:\Windows\System32里面,如果是64位的,將其放到C:\Windows\SysWOW64里面去
2.需要注冊這個dll
硬盤不夠用的時候?qū)е抡也坏轿募惓?/p>
在實際當中,有些人的tmp目錄非常大,這個時候?qū)е卤P符不夠用而使得map過程的臨時文件沒法保存,而發(fā)生報錯。
批注:
- [批注1]:
一共有9位,其中最后一位為保留位,其它位都有實際意義。
賬戶名稱
密碼位
這個密碼什么時候修改的(距離1970/1/1)
密碼不能修改的天數(shù)(0表示任何時間都可修改)
密碼需要被變更的天數(shù)(1表示永遠不能修改,99999表示不需要修改)
密碼變更前提前幾天警告(一般7天,-1表示沒有警告)
賬號失效日期(-1表示永遠不會禁用)
賬號取消日期或賬戶被禁用天數(shù)(-1表示該賬戶被啟用)shadow
- [批注2]:
*/1 * * * * echo “” //send email
/var/spool/mail/root
測試:
每隔1分鐘往文件里面寫入數(shù)據(jù)
*/1 * * * * echo 'write data 2 this file'>>/root/file
查看:tail –F file每隔1小時只需要在第二列寫*/1即可
總結(jié)
以上是生活随笔為你收集整理的大数据初级笔记二:Hadoop入门之Hadoop集群搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逗号字符的使用、字符数组与字符串数组、s
- 下一篇: [LeetCode] 107. 二叉树