大資料平臺生產環境部署指南

xiaohei.info發表於2016-03-18
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/50922643

總結一下在生產環境部署Hadoop+Spark+HBase+Hue等產品遇到的問題、提高效率的方法和相關的配置。

叢集規劃

假設現在生產環境的資訊如下:

  • 伺服器數量:6
  • 作業系統:Centos7
  • Master節點數:2
  • Zookeeper節點數:3
  • Slave節點數:4

劃分各個機器的角色如下:

主機名 角色 執行程式
hadoop1 Master Namenode
hadoop2 Master_backup Namenode
hadoop3 Slave、Yarn Datanode、ResourceManager、NodeManager
hadoop4 Slave、Zookeeper Datanode、NodeManager、QuorumPeerMain
hadoop5 Slave、Zookeeper Datanode、NodeManager、QuorumPeerMain
hadoop6 Slave、Zookeeper Datanode、NodeManager、QuorumPeerMain

一些注意事項

儘量使用非root使用者

這是為了避免出現一些安全問題,畢竟是生產環境,即使不是也養成習慣。
各個機器的使用者名稱保持一致,需要超級使用者許可權時加入sudoers裡面即可。

資料存放的目錄和配置檔案分離

一般我們在自己的虛擬機器上搭建叢集的時候這個可以忽略不計,但是生產機器上需要注意一下。

由於生產機一般配置都很高,幾十T的硬碟很常見,但是這些硬碟都是mount上去的,如果我們按照虛擬機器上的操作方式來部署的話,叢集的所有資料還是會在/目錄下,而這個目錄肯定是不會大到哪裡去,
有可能就出現跑著跑著拋磁碟空間爆滿的異常,但是回頭一查,90%的資源沒有利用到。
所以,將叢集存放資料的目錄統一配置到空間大的盤上去,而配置檔案保持不變,即配置檔案和資料目錄的分離,避免互相影響,另外在使用rsync進行叢集檔案同步的時候也比較方便。

規劃叢集部署的目錄

部署之前提前將各個目錄分配好,針對性的幹活~
這裡將Hadoop、HBase、Spark等軟體安裝在:/usr/local/bigdata目錄下
資料存放目錄配置在:/data2/bigdata下
這裡的/data2為mount上去的硬碟

叢集部署

這裡使用的各個軟體版本號為:

  • Zookeeper3.4.5
  • Hadoop2.2.0
  • HBase0.98
  • Spark1.4.1
  • Hive1.2.1
  • Hue3.7.0

必要準備

1、修改主機名和IP的對映關係

編輯/etc/hosts檔案,確保各個機器主機名和IP地址的對映關係

2、防火牆設定

生產環境上防火牆不可能關閉,所以查考下方的埠表讓網路管理員開通吧~
P.S. 當然如果你不care的話直接關防火牆很省事,不過不推薦。。

3、JDK的配置

先檢查一下生產機上有沒有預裝了OpenJDK,有的話卸了吧~

rpm -qa | grep OracleJDK

把出現的所有包都

rpm -e --nodeps

解除安裝掉。

重新安裝OracleJDK,版本沒有太高要求,這裡使用1.7。
到Oracle官網下載對應版本的JDK之後在安裝在/usr/local下面,在~/.bash_profile中配置好環境變數,輸入java -version出現對應資訊即可。

4、ssh免密碼登陸

這個步驟如果機器比較多的話就會很煩了,現在各個機器上生成ssh金鑰:

ssh-keygen -t rsa

一路回車儲存預設目錄:~/.ssh
通過ssh將各個機器的公鑰複製到hadoop1的~/.ssh/authorized_keys中,然後發放出去:

#本機的公鑰
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
#各個節點的公鑰
ssh hadoopN cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
#複製完之後將authorized_keys發放給各個節點
scp ~/.ssh/authorized_keys hadoopN:~/.ssh/authorized_keys

測試:

ssh date hadoop2

如果出現許可權問題嘗試使用:

chmod -R 700 ~/.ssh

Zookeeper

將zk上傳到/usr/local/bigdata中解壓縮
進入conf目錄,修改zoo.cfg:

cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
#修改:
dataDir=/data2/bigdata/zookeeper/tmp
ticktickTime=20000

#在最後新增:
server.1=hadoop4:2888:3888
server.2=hadoop5:2888:3888
server.3=hadoop6:2888:3888

ticktickTime預設為2000,2-20倍的minSessionTimeout與maxSessionTimeout
注: tickTime 心跳基本時間單位毫秒,ZK基本上所有的時間都是這個時間的整數倍。
zk的詳細配置見:
zookeeper配置檔案詳解

建立配置的dataDir:

mkdir /data2/bigdata/zookeeper/tmp
touch /data2/bigdata/zookeeper/tmp/myid
echo 1 > /data2/bigdata/zookeeper/tmp/myid

配置結束,將Zookeeper傳到hadoop5、6上,建立dataDir並修改myid為2、3

啟動

在hadoop4、5、6上進入zk的bin目錄:

./zkServer.sh start
./zkServer.sh status

正確的結果應該是一個leader,兩個follower

Hadoop

上傳hadoop包到/usr/local/bigdata並解壓縮,進入etc/hadoop目錄

hadoop-env.sh

考慮到資料和程式的分離,決定將那些會不斷增長的檔案都配置到/data2/bigdata/hadoop下,包括:日誌檔案,pid目錄,journal目錄。
所以在此檔案中需要配置:

  1. JAVA_HOME
  2. HADOOP_PID_DIR
  3. HADOOP_LOG_DIR
  4. HADOOP_CLASSPATH

HADOOP_CLASSPATH根據需要配置其他jar包的路徑

yarn-en.sh

  1. YARN_LOG_DIR
  2. YARN_PID_DIR

其他五個核心檔案內容如下:

core-site.xml:

<configuration>
<!--hdfs通訊地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!--資料存放目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/data2/bigdata/hadoop/tmp</value>
</property>
<!--zk地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop4:2181,hadoop5:2181,hadoop6:2181</value>
</property>
<!--hdfs回收站檔案保留時間-->
<property>
<name>fs.trash.interval</name>
<value>4320</value>
</property>
<!--hue相關配置-->
<property>
<name>hadoop.proxyuser.hue.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hue.groups</name>
<value>*</value>
</property>
<!--Zookeeper連線超時的設定-->
<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>
<!--hdfs後設資料存放路徑-->
<property>
<name>dfs.name.dir</name>  
<value>/data2/hadoop/hdfs/name</value>  
</property>
<!--hdfs資料目錄,可配置多個-->
<property>
<name>dfs.data.dir</name>  
<value>/data2/hadoop/hdfs/data</value>  
</property>
<!--節點上剩下多少空間時不再寫入,配置為6G,手動調整-->
<property>
<name>dfs.datanode.reserved</name> 
<value>6000000000</value> 
</property>
<!--節點訪問控制-->
<property>
<name>dfs.hosts</name>
<value>/usr/local/bigdata/hadoop/etc/hadoop/datanode-allow.list</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/bigdata/hadoop/etc/hadoop/datanode-deny.list</value>
</property>
<!--Namenode服務名-->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!--Namenode配置-->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop2:50070</value>
</property>
<!--journalnode配置-->
<property>
<name>dfs.namenode.shared.edits.dir</name> 
<value>qjournal://hadoop4:8485;hadoop5:8485;hadoop6:8485/ns1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data2/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/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--為hue開啟webhdfs-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</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>

dfs.name.dir和dfs.data.dir分別是儲存hdfs後設資料資訊和資料的目錄,如果沒有配置則預設儲存到hadoop.tmp.dir中。
其中dfs.name.dir可以配置為多個目錄,相當於備份,以免出現後設資料被破壞的情況。

mapred-site.xml:

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>

yarn-site.xml:

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<property> 
<name>yarn.nodemanager.aux-services</name> 
<value>mapreduce_shuffle</value> 
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/data2/bigdata/hadoop/logs/yarn</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>259200</value>
</property>
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>3600</value>
</property>
<property>
<name>yarn.nodemanager.webapp.address</name>
<value>0.0.0.0:8042</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data2/bigdata/hadoop/logs/yarn/containers</value>
</property>
</configuration>

修改slaves檔案將各個子節點主機名加入
將配置好的hadoop通過scp拷貝到其他節點

第一次格式化HDFS

啟動journalnode(在hadoop1上啟動所有journalnode,注意:是呼叫的hadoop-daemons.sh這個指令碼,注意是複數s的那個指令碼)
進入hadoop/sbin目錄:

./hadoop-daemons.sh start journalnode

執行jps命令檢驗,hadoop4、hadoop5、hadoop6上多了JournalNode程式

格式化HDFS(在bin目錄下),在hadoop1上執行命令:

./hdfs namenode -format

格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,將對應tmp目錄拷貝到hadoop2對應的目錄下(hadoop初次格式化之後要將兩個nn節點的tmp/dfs/name資料夾同步)。

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

./hdfs zkfc -formatZK

之後啟動hdfs和yarn,並用jps命令檢查

HBase

解壓之後配置hbase叢集,要修改3個檔案
注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下,讓hbase節點知道hdfs的對映關係,也可以在hbase-site.xml中配置

hbase-env.sh

  1. JAVA_HOME
  2. HBASE_MANAGES_ZK設定為false,使用外部的zk
  3. HBASE_CLASSPATH設定為hadoop配置檔案的目錄
  4. HBASE_PID_DIR
  5. HBASE_LOG_DIR

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>hadoop4:2181,hadoop5:2181,hadoop16:2181</value>
</property>
<property>
<name>hbase.master</name>
<value>hadoop11</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>6000000</value>
</property>
</configuration>

在regionservers中新增各個子節點的主機名並把zoo.cfg 拷貝到hbase的conf目錄下

使用scp將配置好的hbase拷貝到叢集的各個節點上,在hadoop1上通過hbase/bin/start-hbase.sh來啟動

Spark

安裝scala

將scala包解壓到/usr/local下,配置環境變數即可

上傳spark包到/usr/local/bigdata下並解壓縮

進入conf目錄,修改slaves,將各個子節點的主機名加入

spark-env.sh

  1. SPARK_MASTER_IP:master主機名
  2. SPARK_WORKER_MEMORY:子節點可用記憶體
  3. JAVA_HOME:java home路徑
  4. SCALA_HOME:scala home路徑
  5. SPARK_HOME:spark home路徑
  6. HADOOP_CONF_DIR:hadoop配置檔案路徑
  7. SPARK_LIBRARY_PATH:spark lib目錄
  8. SCALA_LIBRARY_PATH:值同上
  9. SPARK_WORKER_CORES:子節點的可用核心數
  10. SPARK_WORKER_INSTANCES:子節點worker程式數
  11. SPARK_MASTER_PORT:主節點開放埠
  12. SPARK_CLASSPATH:其他需要新增的jar包路徑
  13. SPARK_DAEMON_JAVA_OPTS:”-Dspark.storage.blockManagerHeartBeatMs=6000000”
  14. SPARK_LOG_DIR:log目錄
  15. SpARK_PID_DIR:pid目錄

spark配置詳見:
Spark 配置

將hadoop1上配置好的spark和scala通過scp複製到其他各個節點上(注意其他節點上的~/.bash_profle檔案也要配置好)

通過spark/sbin/start-all.sh啟動

Hue

安裝hue要求有maven環境和其他環境,具體見:

  • ant
  • asciidoc
  • cyrus-sasl-devel
  • cyrus-sasl-gssapi
  • gcc
  • gcc-c++
  • krb5-devel
  • libtidy (for unit tests only)
  • libxml2-devel
  • libxslt-devel
  • make
  • mvn (from maven package or maven3 tarball)
  • mysql
  • mysql-devel
  • openldap-devel
  • python-devel
  • sqlite-devel
  • openssl-devel (for version 7+)

上傳hue的安裝包到/usr/local/bigdata,解壓縮並進入目錄,執行:

make apps

進行編譯,期間會下載各種依賴包,如果預設中央倉庫的地址連結太慢可以換成CSDN的中央倉庫:
修改maven/conf/settings.xml,在中新增:

<profile>
<id>jdk-1.4</id>
<activation>
<jdk>1.4</jdk>
</activation>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>

如果還是出現相關依賴的錯誤,可以嘗試修改hue/maven/pom.xml,將

2.3.0-mr1-cdh5.0.1-SNAPSHOT

編譯成功之後進入hue/desktop/conf修改pseudo-distributed.ini配置檔案:

# web監聽地址
http_host=0.0.0.0
# web監聽埠
http_port=8000
# 時區
time_zone=Asia/Shanghai
# 在linux上執行hue的使用者
server_user=hue
# 在linux上執行hue的使用者組
server_group=hue
# hue預設使用者
default_user=hue
# hdfs配置的使用者
default_hdfs_superuser=hadoop

# hadoop->hdfs_clusters->default的選項下
# hdfs訪問地址
fs_defaultfs=hdfs://ns1
# hdfs webapi地址
webhdfs_url=http://hadoop1:50070/webhdfs/v1
# hdfs是否使用Kerberos安全機制
security_enabled=false
# hadoop配置檔案目錄
umask=022
hadoop_conf_dir=/usr/local/bigdata/hadoop/etc/hadoop

# hadoop->yarn_clusters->default的選項下
# yarn主節點地址
resourcemanager_host=hadoop1
# yarn ipc監聽埠
resourcemanager_port=8032
# 是否可以在叢集上提交作業
submit_to=True
# ResourceManager webapi地址
resourcemanager_api_url=http://hadoop1:8088
# 代理服務地址
proxy_api_url=http://hadoop1:8088

# hadoop->mapred_clusters->default的選項下
# jobtracker的主機
jobtracker_host=hadoop1

# beeswax選項下(hive)
# hive執行的節點
hive_server_host=zx-hadoop1
# hive server埠
hive_server_port=10000
# hive配置檔案路徑
hive_conf_dir=/usr/local/bigdata/hive/conf
# 連線超時時間等
server_conn_timeout=120
browse_partitioned_table_limit=250
download_row_limit=1000000


# zookeeper->clusters->default選項下
# zk地址
host_ports=hadoop4:2181,hadoop5:2181,hadoop6:2181

# spark選項下
# spark jobserver地址
server_url=http://hadoop1:8090/

這裡hue只配置了hadoop,hive(連線到spark需要部署spark jobserver)其餘元件需要時進行配置即可。

進入hive目錄執行啟動metastrore和hiveserver2服務(如果已經啟動就不需要了):

bin/hive --service metastore
bin/hiveserver2

進入hue,執行:

build/env/bin/supervisor 

進入hadoop:8000即可訪問到hue的介面

相關的異常資訊

1、hue介面沒有讀取hdfs的許可權

錯誤現象:使用任何使用者啟動hue程式之後始終無法訪問hdfs檔案系統。
異常提示:WebHdfsException: SecurityException: Failed to obtain user group information:
pache.hadoop.security.authorize.AuthorizationException: User: hue is not allowed to impersonate admin (error 401)
原因分析:使用者許可權問題。
解決方案:需要在hue的配置檔案中設定以hue使用者啟動web程式,並且該使用者需要在hadoop使用者組中。

2、hue介面無法獲取hdfs資訊

錯誤現象:使用任何使用者啟動hue程式之後始終無法訪問hdfs檔案系統。
異常提示:not able to access the filesystem.
原因分析:hue通過hadoop的web api進行通訊,無法獲取檔案系統可能是這個環節出錯。
解決方案:在pdfs-site.xml檔案中新增dfs.webhdfs.enabled配置項,並重新載入叢集配置!

使用rsync進行叢集檔案同步

參考:使用rsync進行多伺服器同步

叢集埠一覽表

埠名 用途
50070 Hadoop Namenode UI埠
50075 Hadoop Datanode UI埠
50090 Hadoop SecondaryNamenode 埠
50030 JobTracker監控埠
50060 TaskTrackers埠
8088 Yarn任務監控埠
60010 Hbase HMaster監控UI埠
60030 Hbase HRegionServer埠
8080 Spark監控UI埠
4040 Spark任務UI埠
9000 HDFS連線埠
9090 HBase Thrift1埠
8000 Hue WebUI埠
9083 Hive metastore埠
10000 Hive service埠

不定時更新。

有時候各個叢集之間,叢集內部各個節點之間,以及外網內網等問題,如果網路組策略比較嚴格的話,會經常要求開通埠許可權,可以參考這個表的內容,以免每次都會漏過一些埠影響效率。

其他一些可用技能

叢集中的datanode出現資料分佈不均勻的時候可以用hadoop的balancer工具將資料打散

# 進行資料的balancer操作,直到該節點的磁碟使用率低於叢集的平均使用率的15%
bin/start-balancer.sh -threshold 15

檢查hdfs中出現損壞的block塊

bin/hadoop fsck file -blocks -files -locations

作者:@小黑


相關文章