@(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 |
這是爲了不出現一些安全問題,畢竟是生產環境,即便不是也養成習慣。
各個機器的用戶名保持一致,須要超級用戶權限時加入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
將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包到/usr/local/bigdata並解壓縮,進入etc/hadoop目錄
hadoop-env.sh
考慮到數據和程序的分離,決定將那些會不斷增加的文件都配置到/data2/bigdata/hadoop下,包括:日誌文件,pid目錄,journal目錄。
因此在此文件中須要配置:
- JAVA_HOME
- HADOOP_PID_DIR
- HADOOP_LOG_DIR
- HADOOP_CLASSPATH
HADOOP_CLASSPATH根據須要配置其餘jar包的路徑
yarn-en.sh
- YARN_LOG_DIR
- 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集羣,要修改3個文件
注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下,讓hbase節點知道hdfs的映射關係,也能夠在hbase-site.xml中配置
hbase-env.sh
- JAVA_HOME
- HBASE_MANAGES_ZK設置爲false,使用外部的zk
- HBASE_CLASSPATH設置爲hadoop配置文件的目錄
- HBASE_PID_DIR
- 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來啓動
安裝scala
將scala包解壓到/usr/local下,配置環境變量便可
上傳spark包到/usr/local/bigdata下並解壓縮
進入conf目錄,修改slaves,將各個子節點的主機名加入
spark-env.sh
- SPARK_MASTER_IP:master主機名
- SPARK_WORKER_MEMORY:子節點可用內存
- JAVA_HOME:java home路徑
- SCALA_HOME:scala home路徑
- SPARK_HOME:spark home路徑
- HADOOP_CONF_DIR:hadoop配置文件路徑
- SPARK_LIBRARY_PATH:spark lib目錄
- SCALA_LIBRARY_PATH:值同上
- SPARK_WORKER_CORES:子節點的可用核心數
- SPARK_WORKER_INSTANCES:子節點worker進程數
- SPARK_MASTER_PORT:主節點開放端口
- SPARK_CLASSPATH:其餘須要添加的jar包路徑
- SPARK_DAEMON_JAVA_OPTS:」-Dspark.storage.blockManagerHeartBeatMs=6000000」
- SPARK_LOG_DIR:log目錄
- SpARK_PID_DIR:pid目錄
spark配置詳見:
Spark 配置
將hadoop1上配置好的spark和scala經過scp複製到其餘各個節點上(注意其餘節點上的~/.bash_profle文件也要配置好)
經過spark/sbin/start-all.sh啓動
安裝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配置項,並從新加載集羣配置!
端口名 | 用途 |
---|---|
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端口 |
不定時更新。
有時候各個集羣之間,集羣內部各個節點之間,以及外網內網等問題,若是網絡組策略比較嚴格的話,會常常要求開通端口權限,能夠參考這個表的內容,以避免每次都會漏過一些端口影響效率。
做者:@小黑