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

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

@(Hadoop)java

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

集羣規劃

假設如今生產環境的信息以下:python

  • 服務器數量:6
  • 操做系統:Centos7
  • Master節點數:2
  • Zookeeper節點數:3
  • Slave節點數:4

劃分各個機器的角色以下:mysql

主機名 角色 運行進程
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裏面便可。 linux

數據存放的目錄和配置文件分離

通常咱們在本身的虛擬機上搭建集羣的時候這個能夠忽略不計,可是生產機器上須要注意一下。c++

因爲生產機通常配置都很高,幾十T的硬盤很常見,可是這些硬盤都是mount上去的,若是咱們按照虛擬機上的操做方式來部署的話,集羣的全部數據仍是會在/目錄下,而這個目錄確定是不會大到哪裏去,
有可能就出現跑着跑着拋磁盤空間爆滿的異常,可是回頭一查,90%的資源沒有利用到。
因此,將集羣存放數據的目錄統一配置到空間大的盤上去,而配置文件保持不變,即配置文件和數據目錄的分離,避免互相影響,另外在使用rsync進行集羣文件同步的時候也比較方便。web

規劃集羣部署的目錄

部署以前提早將各個目錄分配好,針對性的幹活~
這裏將Hadoop、HBase、Spark等軟件安裝在:/usr/local/bigdata目錄下
數據存放目錄配置在:/data2/bigdata下
這裏的/data2爲mount上去的硬盤sql

集羣部署

這裏使用的各個軟件版本號爲:shell

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

必要準備

一、修改主機名和IP的映射關係apache

編輯/etc/hosts文件,確保各個機器主機名和IP地址的映射關係

二、防火牆設置

生產環境上防火牆不可能關閉,因此查考下方的端口表讓網絡管理員開通吧~
P.S. 固然若是你不care的話直接關防火牆很省事,不過不推薦。。

三、JDK的配置

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

rpm -qa | grep OracleJDK

把出現的全部包都

rpm -e --nodeps

卸載掉。

從新安裝OracleJDK,版本沒有過高要求,這裏使用1.7。
到Oracle官網下載對應版本的JDK以後在安裝在/usr/local下面,在~/.bash_profile中配置好環境變量,輸入java -version出現對應信息便可。

四、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傳到hadoop五、6上,建立dataDir並修改myid爲二、3

啓動

在hadoop四、五、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命令檢驗,hadoop四、hadoop五、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的界面

相關的異常信息

一、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用戶組中。

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

不定時更新。

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

做者:@小黑

相關文章
相關標籤/搜索