大數據平台生產環境部署指南


大數據平台生產環境部署指南

@(Hadoop)

總結一下在生產環境部署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>
<!--節點訪問控制-->
<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中。

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端口

不定時更新。

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

作者:@小黑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM