一、版本规划
1.1 技术选型
1.1.1 必装
jdk、hadoop、zookeeper、mysql、hive、spark、hbase
ps:spark 仅用于替换 hive 的 mr 计算引擎
1.1.2 选装
数据查询:phoenix
数据同步:sqoop、kettle
任务调度:azkaban
集群监控:zabbix
1.2 框架选型
选择Apache开源版本
1.3 版本选型
原则:选取最新版前半年的稳定版;若有版本不兼容问题以兼容hadoop版本为准
框架 | 版本 |
---|---|
hadoop | 3.2.1 |
zookeeper | 3.6.2 |
mysql | 5.7.23 |
hive | 3.1.2 |
spark | 3.0.0 |
hbase | 2.2.6 |
phoenix | 5.0.0 |
azkaban | 3.89.0 |
sqoop | 1.4.7 |
kettle | 8.0.22 |
zabbix | 5.0 LTS |
jdk | 1.8.212 |
ps:spark 为纯净版,剔除 hadoop 依赖
1.4 集群规划
根据具体服务器配置、个数按照资源均衡原则;有依赖的服务则安装在同一节点,如:Azkaban的Executor调度hive或Sqoop则与hive cli安装在同一节点
二、安装文档
2.1 集群环境准备
2.1.1 jdk 安装
解压
tar -zxvf jdk-8u212-linux-x64.tar.gz
mv jdk1.8.0_212 jdk1.8
配置环境变量
vim /etc/profile
验证
java -version
2.1.2 ssh免密登录
配置集群的主机名映射
vim /etc/hosts
生成公钥、私钥
ssh-keygen -t rsa
拷贝公钥到指定服务器
ssh-copy-id hostname
2.1.3 集群分发脚本
基于 rsync 实现集群的文件拷贝,实现集群间脚本、配置、组件的快速同步
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if [ $pcount == 0 ]
then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for host in '集群主机名,空格隔开'
do
echo ------------------- $host --------------
rsync -rvl $pdir/$fname $user@$host:$pdir
done
2.1.4 集群时间同步
Hbase 以及任务调度需要集群的时间在一定程度上要保持一致
2.2 Hadoop 安装
仅进行基本配置,高可用及其定制化配置按需配置
2.2.1 hadoop-env.sh
写死 export JAVA_HOME=…
2.2.2 core-site.xml
hadoop集群核心配置
<property>
<name>fs.defaultFS</name>
<value>hdfs://待配置:9000</value>
<description>其本质是指定nn所在节点</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/待配置</value>
<description>最基础的路径,后续的nn,dn数据路径皆基于此路径</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>待配置</value>
<description>若有必要可配置dn多目录</description>
</property>
2.2.3 hdfs-site.xml
hdfs组件核心配置
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>待配置:50090</value>
<description>指定2nn所在位置</description>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>配置副本数</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>待配置</value>
<description>nn数据本地存储路径,可默认</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>待配置</value>
<description>dn数据本地存储路径,可默认</description>
</property>
2.2.4 mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定mr运行在yarn上</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>待配置:10020</value>
<description>配置历史服务器</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>待配置:19888</value>
<description>配置历史服务器web页面</description>
</property>
2.2.5 yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>待配置</value>
<description>指定rm所在节点,其他节点默认为nm</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
2.2.6 works
添加集群主机名,主机名与主机名间换行隔开且文件内不能有空格
2.2.7 配置环境变量
export HADOOP_HOME=...
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
2.2.8 格式化namenode
hdfs namenode -format
若格式化出错,检查错误原因,并删除 ${HADOOP_HOME}/logs 和配置的 ${hadoop.tmp.dir} 目录后重新格式化
2.2.9 启动/关闭hadoop
# 群起hdfs
start-dfs.sh
# 群起yarn
start-yarn.sh
# 启动历史服务
mapred --daemon start historyserver
# 关闭hdfs
stop-dfs.sh
# 关闭yarn
stop-yarn.sh
# 启动历史服务
mapred --daemon stop historyserver
2.3 Zookeeper 安装
2.3.1 修改配置
在 ${ZOOKEEPER_HOME} 下创建 zkData 文件夹,进入该文件夹创建 myid 文件
mkdir zkData
cd zkData
touch myid
在 myid 文件添加 server 编号,建议为1,2,3…每个节点不能一样
复制 ${ZOOKEEPER_HOME}/conf 下的 zoo_sample.cfg 为 zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=待配置/zkData
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
# server.myid=节点ip:2888:3888 有几个节点配置几个 文件分发后注意修改myid
server.1=hostname1:2888:3888
server.2=hostname2:2888:3888
...
2.4 Hive On Spark 安装
2.4.1 安装hive
ps:安装 hive 前需保证当前节点能连接上一台 mysql
解压,修改文件名
tar -zxvf apache-hive-3.1.2-bin.tar.gz
mv apache-hive-3.1.2-bin hive
修改${HIVE_HOME}/conf下hive-site.xml,hive-env.sh
hive-env.sh
export HADOOP_HOME=/Users/wjun/env/hadoop
export HIVE_CONF_DIR=/Users/wjun/env/hive/conf
hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://待配置:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>待配置</value>
<description>MYSQL 用户名</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>待配置</value>
<description>MYSQL 密码</description>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.server2.transport.mode</name>
<value>binary</value>
<description>Expects one of [binary, http]. Transport mode of HiveServer2.</description>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.webui.host</name>
<value>127.0.0.1</value>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
<description>
Setting this property to true will have HiveServer2 execute
Hive operations as the user making the calls to it.
</description>
</property>
</configuration>
hive-log4j2.properties
property.hive.log.dir = 待配置/logs
替换 hive 的 guava.jar
cp ~/env/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar ./
rm -rf guava-19.0.jar
将对应的 MySQL 连接驱动复制到 ${HIVE_HOME}/lib 下,初始化元数据库
schematool -dbType mysql -initSchema
2.4.2 启动hive
# 启动hiveserver2
hiveserver2&
# 连接hive
beeline -u "jdbc:hive2://localhost:10000" -n "" -p ""
注:hiveserver2 启动后需等待一会才能通过 beeline 连接,等待 hiveserver2 日志打印4个Hive Session ID
2.4.3 替换引擎
安装spark
# 解压
tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz
# 重命名
mv spark-3.0.0-bin-hadoop3.2/ spark
# 配置spark环境变量
export SPARK_HOME=/Users/wjun/env/spark
export PATH=$PATH:$SPARK_HOME/bin
# 修改spark配置文件spark-default.conf
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://127.0.0.1:9000/spark-history
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 4g
# 创建spark日志目录
hadoop fs -mkdir /spark-history
上传 spark 纯净版 jar 至 hdfs
说明 1:由于 Spark3.0.0 非纯净版默认支持的是 hive2.3.7 版本,直接使用会和安装的Hive3.1.2 出现兼容性问题。所以采用 Spark 纯净版 jar 包,不包含 hadoop 和 hive 相关依赖, 避免冲突。
说明 2:Hive 任务最终由 Spark 来执行,Spark 任务资源分配由 Yarn 来调度,该任务有可能被分配到集群的任何一个节点。所以需要将 Spark 的依赖上传到 HDFS 集群路径,这样集群中任何一个节点都能获取到。
本地解压纯净版 spark
tar -zxvf spark-3.0.0-bin-without-hadoop.tgz
上传文件
hadoop fs -put spark-3.0.0-bin-without-hadoop/jars/* /spark/spark-jars
修改 hive-site.xml
<!--Spark 依赖位置(注意:端口号 9000 必须和 namenode 的端口号一致)-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://127.0.0.1:9000/spark/spark-jars/*</value>
</property>
<!--Hive 执行引擎-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
<!--Hive 和 Spark 连接超时时间-->
<property>
<name>hive.spark.client.connect.timeout</name>
<value>10000ms</value>
</property>
注意: hive.spark.client.connect.timeout 的默认值是 1000ms,如果执行 hive 的 insert 语句 时,抛如下异常,可以调大该参数到 10000ms
FAILED: SemanticException Failed to get a spark session: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to create Spark client for Spark session d9e0224c-3d14-4bf4-95bc-ee3ec56df48e
2.4.5 可能出现的错误
错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
yarn-site.xml
<property>
<name>yarn.application.classpath</name>
<value>`hadoop classpath`</value>
</property>
2.5 Hbase 安装
解压,并修改文件名
tar -zxvf hbase-2.2.6-bin.tar.gz
mv hbase-2.2.6 hbase
配置环境变量
export HBASE_HOME=待配置
export PATH=$PATH:$HBASE_HOME/bin
2.5.1 安装Hbase
修改配置文件 hbase-env.sh
# 写死JAVA_HOME
export JAVA_HOME=待配置
# 默认为true,即使用hbase自带的zk,建议自己安装zk,方便管理以及后续的api操作
export HBASE_MANAGES_ZK=false
修改配置文件 hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value> </property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/Users/wjun/env/zookeeper/zkData</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>当集群时间不一致时,可通过增大该值;但最好的方式时同步集群时间</description>
</property>
软连接 hadoop 的配置文件 core-site.xml 和 hdfs-site.xml
ln -s ~/env/hadoop/etc/hadoop/hdfs-site.xml hdfs-site.xml
ln -s ~/env/hadoop/etc/hadoop/core-site.xml core-site.xml
启动hbase
start-hbase.sh
web 页面端口:16010
2.5.2 测试
hbase shell
2.5.3 安装Phoenix
解压,并修改文件名
tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
mv apache-phoenix-5.0.0-HBase-2.0-bin phoenix
配置环境变量
export PHOENIX_HOME=待配置
export PHOENIX_CLASSPATH=$PHOENIX_HOME
进入到 phoenix 的安装目录,找到 phoenix-5.0.0-HBase-2.0-server.jar ,拷贝到 HBase 各个节点的$HBASE_HOME/lib 下
cp phoenix-5.0.0-HBase-2.0-server.jar ~/env/hbase/lib
启动 phoenix
sqlline.py localhost:2181