天天看點

Hadoop+Spark+Hbase部署整合篇

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/46673079

之前的幾篇部落格中記錄的Hadoop、Spark和Hbase部署過程雖然看起來是沒多大問題,但是之後在上面跑任務的時候出現了各種各樣的配置問題。慶幸有将問題記錄下來,可以整理出這篇部署整合篇。

確定叢集的每台機器使用者名都為cloud(或者一樣)

為了避免過多重複的解釋,這裡僅僅示意了怎麼配置,關于配置的詳情解釋可自行百度,必應之~或者參考:

hadoop2.2.0叢集安裝和配置 HBase叢集的安裝部署 Spark(一)– Standalone HA的部署

修改各個節點上的/etc/hosts檔案確定ip與主機名的映射關系正确

關閉系統防火牆

service iptables stop

chkconfig iptables off

reboot

配置ssh免密碼登陸

在每台機器上都執行下列指令

chmod -R 755 /home/cloud

mkdir ~/.ssh

ssh-keygen -t rsa

之後在cloud1上收集各個機器的公鑰

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

ssh cloud2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

ssh cloud3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

ssh cloud4 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

ssh cloud5 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

ssh cloud6 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

将公鑰拷貝到其他節節點

scp ~/.ssh/authorized_keys cloud2:~/.ssh/authorized_keys

scp ~/.ssh/authorized_keys cloud3:~/.ssh/authorized_keys

scp ~/.ssh/authorized_keys cloud4:~/.ssh/authorized_keys

scp ~/.ssh/authorized_keys cloud5:~/.ssh/authorized_keys

scp ~/.ssh/authorized_keys cloud6:~/.ssh/authorized_keys

在每台機器上都執行(很重要,注意配置ssh的時候要使用cloud使用者來配置)

chmod -R 700 ~/.ssh

Zookeeper安裝:

zk伺服器叢集規模不小于3個節點,要求各伺服器之間系統時間要保持一緻

設定環境變量

vi /etc/profile

新增

export ZOOKEEPER_HOME=/home/cloud/zk

path後新增

:$ZOOKEEPER_HOME/bin

source /etc/profile

儲存檔案生效

在另外兩個節點slave1和slave2上分别設定改環境變量

進入zk目錄

在conf目錄下,重命名檔案

mv zoo_sample.cfg zoo.cfg

編輯該檔案,執行vi zoo.cfg

修改dataDir=/home/cloud/zk/data

server.1=cloud4:2888:3888

server.2=cloud5:2888:3888

server.3=cloud6:2888:3888

ticktickTime=20000 (預設)2-20倍的minSessionTimeout與maxSessionTimeout

注: tickTime 心跳基本時間機關毫秒,ZK基本上所有的時間都是這個時間的整數倍。

zk的詳細配置見:

zookeeper配置檔案詳解

建立檔案夾mkdir /home/cloud/zk/data

在data目錄下,建立檔案myid,内容為1

echo 1 > /home/cloud/zk/data/myid

把zk目錄複制到slave1和slave2中

scp -r zk slave1:/home/cloud

scp -r zk slave2:/home/cloud

把cloud5中相應的myid的值改為1

把cloud6中相應的myid的值改為2

啟動,在三個節點上分别執行指令./zkServer.sh start

檢驗,在三個節點上分别執行指令./zkServer.sh status

JDK安裝

使用root使用者

在usr目錄下建立java目錄。

将jdk上傳到linux中

在/usr/java下

chmod 755 jdk-6u45-linux-i586.bin

./jdk-6u45-linux-i586.bin

mv jdk1.6.0_45 jdk

vi /etc/profile

export JAVA_HOME=/usr/java/jdk
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile           

Hadoop安裝

解壓Hadoop檔案之後,進入conf目錄

修改hadoop-env.sh

加入

export JAVA_HOME=/usr/java/jdk           

(為了解決網絡不好或者其他情況下造成的通信失敗,下列有些簡單粗暴的配置了連接配接zk的timeout時間)

修改core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/cloud/hadoop/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name> 
<value>cloud4:2181,cloud5:2181,cloud6:2181</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>6000000</value>
</property>
<property>  
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>  
<value>6000000</value>  
</property>  
<property>  
<name>ipc.client.connect.timeout</name>  
<value>6000000</value>  
</property>
</configuration>           

修改hdfs-site.xml

<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>cloud1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>cloud1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>cloud2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>cloud2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name> 
<value>qjournal://cloud4:8485;cloud5:8485;cloud6:8485/ns1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/cloud/hadoop/journal</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/cloud/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.qjournal.start-segment.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.prepare-recovery.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.accept-recovery.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.prepare-recovery.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.accept-recovery.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.finalize-segment.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.select-input-streams.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.get-journal-state.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.new-epoch.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>dfs.qjournal.write-txns.timeout.ms</name>
<value>600000000</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>6000000</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>cloud3</value>
</property>
<property> 
<name>yarn.nodemanager.aux-services</name> 
<value>mapreduce_shuffle</value> 
</property>                                                                                            
</configuration>            

修改slaves

cloud3

cloud4

cloud5

cloud6

将配置好的hadoop拷貝到其他節點

scp -r ~/hadoop/ cloud2:~/

scp -r ~/hadoop/ cloud3:~/

scp -r ~/hadoop/ cloud4:~/

scp -r ~/hadoop/ cloud5:~/

scp -r ~/hadoop/ cloud6:~/

啟動Hadoop之前先啟動zk

cd ~/zookeeper/bin/

./zkServer.sh start

檢視狀态:一個leader,兩個follower

./zkServer.sh status

啟動journalnode(在cloud1上啟動所有journalnode,注意:是調用的hadoop-daemons.sh這個腳本,注意是複數s的那個腳本)

cd ~/hadoop

~/hadoop/sbin/hadoop-daemons.sh start journalnode

運作jps指令檢驗,cloud4、cloud5、cloud6上多了JournalNode程序

格式化HDFS(在bin目錄下)

在cloud1上執行指令:

./hdfs namenode -format

格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡

我配置的是~/hadoop/tmp,然後将~/hadoop/tmp拷貝到cloud2的~/hadoop/下。

scp -r ~/hadoop/tmp/ cloud2:~/hadoop/

格式化ZK(在cloud1上執行即可,在bin目錄下)

./hdfs zkfc -formatZK

啟動HDFS(在cloud1上執行)

~/hadoop/sbin/start-dfs.sh

啟動YARN(cloud2)

~/hadoop/sbin/start-yarn.sh

注意:hadoop初次格式化之後要将兩個nn節點的tmp/dfs/name檔案夾同步

Hbase安裝

解壓之後配置hbase叢集,要修改3個檔案(首先zk叢集已經安裝好了)

注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下

讓hbase節點知道hdfs的映射關系,也可以在hbase-site.xml中配置

修改hbase-env.sh

export JAVA_HOME=/usr/java/jdk
//告訴hbase使用外部的zk 
export HBASE_MANAGES_ZK=false
export HBASE_CLASSPATH=/usr/local/hadoop/conf           

vi hbase-site.xml

<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>cloud4:2181,cloud5:2181,cloud6:2181</value>
</property>
<property>
<name>hbase.master</name>
<value>cloud1</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>6000000</value>
</property>
</configuration>           

和hdfs的配置一樣,說明hbase的子節點都在哪些機器上

vi regionservers

把zoo.cfg 拷貝到 hbase-0.90.3/conf/下

拷貝hbase到其他節點

scp -r ~/hbase/ cloud2:~/

scp -r ~/hbase/ cloud3:~/

scp -r ~/hbase/ cloud4:~/

scp -r ~/hbase/ cloud5:~/

scp -r ~/hbase/ cloud6:~/

将配置好的HBase拷貝到每一個節點并同步時間。

Spark安裝

安裝scala:

tar –zxvf scala-2.10.5.tgz

mv scala-2.10.5 scala

安裝spark:

tar -zxvf spark-1.3.0-bin-hadoop2.3.tgz

mv spark-1.3.1 spark

進入spark目錄,修改檔案slaves

vi conf/slaves

cloud2

cloud3

cloud4

cloud5

修改spark-env.sh

vi conf/spark-env.sh

export SPARK_MASTER_IP=cloud1 
export SPARK_WORKER_MEMORY=512m 
export JAVA_HOME=/usr/java/jdk 
export SCALA_HOME=/home/cloud/scala 
export SPARK_HOME=/home/cloud/spark 
export HADOOP_CONF_DIR=/home/cloud/hadoop/etc/hadoop 
export SPARK_LIBRARY_PATH=$SPARK_HOME/lib 
export SCALA_LIBRARY_PATH=SPARK_LIBRARY_PATH 
export SPARK_WORKER_CORES=1 
export SPARK_WORKER_INSTANCES=1 
export SPARK_MASTER_PORT=7077
#錯誤:節點無法加載到hbase包
#處理方式:sh中加入classpath指向hbasejar路徑
export SPARK_CLASSPATH=/home/cloud/hbase/lib/*
export SPARK_DAEMON_JAVA_OPTS="-Dspark.storage.blockManagerHeartBeatMs=6000000"           

spark配置詳見:

Spark 配置

将cloud1上配置好的spark和scala通過scp複制到其他各個節點上(注意其他節點上的profile檔案也要一緻)

各個節點的profile檔案内容:

export JAVA_HOME=/usr/java/jdk
export HADOOP_HOME=/home/cloud/hadoop
export SCALA_HOME=/home/cloud/scala
export SPARK_HOME=/home/cloud/spark
export HBASE_HOME=/home/cloud/hbase
export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$HBASE_HOME/bin