1. 程式人生 > >一臺阿里雲2臺騰訊雲伺服器搭建Hadoop叢集

一臺阿里雲2臺騰訊雲伺服器搭建Hadoop叢集


1.準備工作:jdk安裝(個人選擇的1.8版本)
2.ssh免密登陸:
關閉放火牆(可以將要開放的埠加入防火牆的開發埠中,學習用就直接關閉防火牆了):
1)關閉firewall:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
firewall-cmd

2) 重啟後生效
開啟: chkconfig iptables on
關閉: chkconfig iptables off
即時生效,重啟後失效
開啟: service iptables start
關閉: service iptables stop
需要說明的是對於Linux下的其它服務都可以用以上命令執行開啟和關閉操作。
在開啟了防火牆時,做如下設定,開啟相關埠,
修改/etc/sysconfig/iptables 檔案,新增以下內容:
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT

3)vi /etc/hosts
ip1 master
ip2 slave1
ip3 slave2
此處特別注意下,我自己由於這個地方出問題導致Hadoop叢集延遲啟動3,4天,那種感覺實在是難受。。。
問題是:如果是在master上操作的話ip1 必須是master 的內網ip 同理slaves上也是一樣,自己的主機上的IP要改成內網IP,其他的要用外網IP。
補充網路知識:伺服器公網ip
  可以用於域名解析ip,伺服器遠端登入ip,是最主要的伺服器ip地址。
   內網ip
  不能用於域名解析。
  不可以直接用於伺服器遠端登入,其主要作用是:跟當前帳號下的其他同叢集的機器通訊。
  一些小型企業或者學校,通常都是申請一個固定的IP地址,然後通過IP共享(IP Sharing),使用整個公司或學校的機器都能夠訪問網際網路。而這些企業或學校的機器使用的IP地址就是內網IP,內網IP是在規劃IPv4協議時,考慮到IP地址資源可能不足,就專門為內部網設計私有IP地址(或稱之為保留地址),一般常用內網IP地址都是這種形式的:10.X.X.X、

172.16.X.X-172.31.X.X、192.168.X.X等。需要注意的是,內網的計算機可向Internet上的其他計算機發送連線請求,但Internet上其他的計算機無法向內網的計算機發送連線請求。
  公網IP就是除了保留IP地址以外的IP地址,可以與Internet上的其他計算機隨意互相訪問。我們通常所說的IP地址,其實就是指的公網 IP。網際網路上的每臺計算機都有一個獨立的IP地址,該IP地址唯一確定網際網路上的一臺計算機。這裡的IP地址就是指的公網IP地址。
  其實,網際網路上的計算機是通過“公網IP+內網IP”來唯一確定的,就像很多大樓都是201房間一樣,房間號可能一樣,但是大樓肯定是唯一的。公網
IP地址和內網IP地址也是同樣,不同企業或學校的機器可能有相同的內網IP地址,但是他們的公網IP地址肯定不同。那麼這些企業或學校的計算機是怎樣
IP地址共享的呢?這就需要使用NAT(Network Address Translation,網路地址轉換)功能。當內部計算機要連線網際網路時,首先需要通過NAT技術,將內部計算機資料包中有關IP地址的設定都設成
NAT主機的公共IP地址,然後再傳送到Internet,雖然內部計算機使用的是私有IP地址,但在連線Internet時,就可以通過NAT主機的
NAT技術,將內網我IP地址修改為公網IP地址,如此一來,內網計算機就可以向Internet請求資料了。——百度百科
此處master的IP對於slaves是公網IP,但是對於master自己應該用內網IP—正真的對應自己的機器的ifconfig。
以上在master,salve1和slave2上都要執行,為了方便,jdk的安裝目錄最好一樣,之後的目錄操作也是。

4)在所有的主機上建立Hadoop使用者:
adduser hadoop–使用者名稱
passwd 123456–密碼
新建立的使用者並不能使用sudo命令,需要給他新增授權。
sudo命令的授權管理是在sudoers檔案裡的。可以看看sudoers:
[[email protected] ~]# whereis sudoers
sudoers: /etc/sudoers /etc/sudoers.d /usr/libexec/sudoers.so /usr/share/man/man5/sudoers.5.gz
找到這個檔案位置之後再檢視許可權:
[[email protected] ~]# ls -l /etc/sudoers
-r–r—– 1 root root 4251 9月 25 15:08 /etc/sudoers
是的,只有只讀的許可權,如果想要修改的話,需要先新增w許可權:
[[email protected] ~]# chmod -v u+w /etc/sudoers
mode of “/etc/sudoers” changed from 0440 (r–r—–) to 0640 (rw-r—–)
然後就可以新增內容了,在下面的一行下追加新增的使用者:
[[email protected] ~]# vim /etc/sudoers

Allow root to run any commands anywher

root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL #這個是新增的使用者
wq儲存退出,這時候要記得將寫許可權收回:
[[email protected] ~]# chmod -v u-w /etc/sudoers
mode of “/etc/sudoers” changed from 0640 (rw-r—–) to 0440 (r–r—–)
這時候使用新使用者登入,使用sudo:
[[email protected] ~]# su hadoop
輸入密碼
[[email protected] ~]$ sudo cat /etc/passwd
[sudo] password for hadoop:

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

第一次使用會提示你,你已經化身超人,身負責任。而且需要輸入密碼才可以下一步。如果不想需要輸入密碼怎麼辦,將最後一個ALL修改成NOPASSWD: ALL。

5)安裝ssh,由於雲伺服器都有自帶,不在贅述。

接下來有關Hadoop叢集的操作,務必在Hadoop使用者下進行操作。
ssh master ssh-keygen –t rsa
此時在master節點主機的~/.ssh目錄生成金鑰對id_rsa和di_rsa.pub,可以通過ls命令列表檢視。
ssh slave1 ssh-keygen -t rsa
ssh slave2 ssh-keygen -t rsa

將剛剛生成的金鑰對中的公鑰複製到master節點的~/.ssh/目錄之下
scp [email protected]:~/.ssh/id_rsa.pub ~/.ssh/slave1.pub
scp [email protected]:~/.ssh/id_rsa.pub ~/.ssh/slave2.pub

將master、slave1、slave2主機的公鑰寫入master主機~/.ssh目錄的認證檔案authorized_keys中
cat ~/.ssh/*.pub > ~/.ssh/authorized_keys
用chmod命令修改認證檔案authorized_keys的屬性為600
chomd 600 ~/.ssh/authorized_keys

將~/.ssh/authorized_keys認證檔案複製到所有節點主機的~/.ssh/目錄中,並進行免密碼連線測試。

ssh slave1
exit;
ssh slave2
exit;

mkdir /home/hadoop/chadoop
cd /home/hadoop/chadoop
mkdir hadoop
cd hadoop
如果有下載好的安裝包可以直接利用ssh工具將那個安裝包傳到這個資料夾下,我的是Hadoop2.5.0
tar -zxvf xxxx.gz
cd xxxx
進入Hadoop的根目錄
mkdir tmp
mkdir dfs
cd dfs
mkdir data
mkdir name

vi ~/.bash_profile
(此處附上我的配置檔案,請根據自己的需求更改,另外每次想要快捷的使用命令之前都需要source ~/.bash_profile,否則需要去相應的目錄下操作)

export JAVA_HOME=/usr/local/jdk/jdk1.8.0_131
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/home/hadoop/chadoop/hadoop/hadoop-2.5.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export ZOOKEEPER_HOME=/home/hadoop/chadoop/zookeeper/zookeeper-3.4.6
export HBASE_HOME=/home/hadoop/chadoop/hbase/hbase-1.1.2
export HIVE_HOME=/home/hadoop/chadoop/hive/apache-hive-0.13.0-bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/lib
export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/conf
export PIG_HOME=/home/hadoop/chadoop/pig/pig-0.16.0
export PATH=$PATH:$PIG_HOME/bin
export PIG_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HIVE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export SQOOP_HOME=/home/hadoop/chadoop/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
export PATH=$PATH:$SQOOP_HOME/bin
export SPARK_HOME=/home/hadoop/chadoop/spark/spark-2.1.1-bin-hadoop2.6/
export PATH=$PATH:$SPARK_HOME/bin
export OOZIE_HOME=/home/hadoop/chadoop/oozie/oozie-4.3.0
export MAVEN_HOME=/home/hadoop/chadoop/maven/apache-maven-3.5.0
export PATH=$PATH:$MAVEN_HOME/bin
export OOZIE_HOME=/home/hadoop/chadoop/local/oozie/oozie-4.3.0
export MAVEN_HOME=/home/hadoop/chadoop/maven/apache-maven-3.5.0
export PATH=$PATH:$MAVEN_HOME/bin
export OOZIE_URL=http://47.93.10.102:11000/oozie
export CATALINA_HOME=/home/hadoop/chadoop/local/oozie/oozie-4.3.0/oozie-server
export PATH=${CATALINA_HOME}/bin:${OOZIE_HOME}/bin:$PATH
export OOZIE_CONFIG=/home/hadoop/chadoop/local/oozie/oozie-4.3.0/conf

export 
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$HBASE_H
OME/bin:$OOZIE_HOME/bin:$PATH
export HADOOP_HOME_WARN_SUPPRESS=not_null

hadoop-2.8.0/etc/hadoop目錄下的檔案(core-site.xml,hdfs-site.xml, mapred-site.xml, yarn-site.xml,hadoop-env.sh, mapred-env.sh,yarn-env.sh 和slaves)

core-site.xml
<configuration>
 <property>
  <name>fs.defaultFS</name>
  <value>hdfs://master:8020</value>
 </property>
<property>
  <name>io.file.buffer.size</name>
  <value>131072</value>
 </property>
 <property>
  <name>hadoop.tmp.dir</name>
  <value>file:/home/hadoop/chadoop/hadoop/hadoop-2.5.0/tmp</value>
  <description>Abasefor other temporary directories.</description>
 </property>
 <property>
  <name>hadoop.proxyuser.hadoop.hosts</name>
  <value>master</value>
 </property>
<property>
  <name>hadoop.proxyuser.hadoop.groups</name>
  <value>*</value>
 </property>
<!-- 指定zookeeper地址 -->
                <property>
                    <name>ha.zookeeper.quorum</name>
                    <value>master:2181,slave1:2181,slave2:2181</value>
                </property>
</configuration>

hdfs-site.xml

<configuration>

 <property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>master:9001</value>
  <description>備份namenode的http地址</description>
 </property>
  <property>
   <name>dfs.namenode.name.dir</name>
   <value>file:/home/hadoop/chadoop/hadoop/hadoop-2.5.0/dfs/name</value>
   <description>namenode的目錄位置</description>
 </property>

 <property>
  <name>dfs.datanode.data.dir</name>
  <value>file:/home/hadoop/chadoop/hadoop/hadoop-2.5.0/dfs/data</value>
  <description>datanode's address</description>
  </property>

 <property>
  <name>dfs.replication</name>
  <value>3</value>
  <description>hdfs系統的副本數量</description>
 </property>
<property>
     <name>dfs.permissions</name>
     <value>false</value>
</property>
 <property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
 </property>
<property> 
<name>dfs.datanode.max.xcievers</name> 
<value>4096</value> 
</property>
</configuration>

mapred-site.xml(有一個是模板cp 一個新的出來)

<configuration>
<property>
   <name>mapreduce.framework.name</name>
   <value>yarn</value>
   <description>指明mapreduce的排程框架為yarn</description>
 </property>
 <property>
  <name>mapreduce.jobhistory.address</name>
  <value>master:10020</value>
  <description>指明mapreduce的作業歷史地址</description>
 </property>
 <property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>master:19888</value>
  <description>指明mapreduce的作業歷史web地址</description>
 </property>
</configuration>


yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
<property>
   <name>yarn.nodemanager.aux-services</name>
   <value>mapreduce_shuffle</value>
  </property>
<property>
                <name>yarn.resourcemanager.hostname</name>
                <value>master</value>
        </property>  
<property>
   <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
   <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  <property>
   <name>yarn.resourcemanager.address</name>
   <value>master:50066</value>
  </property>
  <property>
   <name>yarn.resourcemanager.scheduler.address</name>
   <value>master:50067</value>
  </property>
  <property>
   <name>yarn.resourcemanager.resource-tracker.address</name>
   <value>master:50068</value>
  </property>
<property>
   <name>yarn.resourcemanager.admin.address</name>
   <value>master:50069</value>
  </property>
  <property>
   <name>yarn.resourcemanager.webapp.address</name>
   <value>master:8088</value>
  </property>
<property>
                       <name>yarn.resourcemanager.zk-address</name>
                       <value>master:2181,slave1:2181,slave2:2181</value>
                    </property>
</configuration>

hadoop-env.sh,mapred-env.sh,yarn-env.sh
加入jdk目錄:export JAVA_HOME=/usr/local/jdk/jdk1.8.0_131
vi slaves

master
slave1
slave2

scp ~/[email protected]:~/
scp ~/[email protected]:~/

ssh [email protected] . ~/.bash_profile
ssh [email protected] . ~/.bash_profile

scp -r chadoop/[email protected]:~
scp -r chadoop/[email protected]:~
(還是建議直接用ssh工具再做一次工作,實在是慢~)

在master節點主機上格式化hdfs檔案系統
hdfs namenode -format

start-all.sh
jps
2646 NodeManager
24038 Jps
2380 SecondaryNameNode
2524 ResourceManager
11373 RunJar
13726 NameNode
2223 DataNode
(master節點有4個ResourceManager, Jps, NameNode, SecondaryNamenode,slave1與slave2有3個NodeManager, DataNode, Jps)

在hdfs檔案系統裡面操作。首先,用-mkdir命令在hdfs中建立一個mydir目錄,然後用-put命令上載檔案,步驟如下:
hdfs dfs -mkdir /mydir
hdfs dfs -put ** (檔案) /mydir
hdfs dfs -ls /mydir
hadoop jar~/chadoop/hadoop/hadoop-2.5.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jarwordcount /mydir/* /mydir/output
每個mr程式需要不同的輸出目錄,相同已存在需要重新命名或刪除。
netstat -antpl|grep xxxx
檢視埠號是否監聽
結果檢視(hdfs dfs -cat/mydir/output/part-r-00000)
可以在瀏覽器中用master的外網IP:8088或50070檢視剛剛的一些操作,也可以看看datanode的狀態。

歡迎評論。