Bootstrap

大数据离线数仓常用组件安装汇总

一、版本规划

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版本为准

框架版本
hadoop3.2.1
zookeeper3.6.2
mysql5.7.23
hive3.1.2
spark3.0.0
hbase2.2.6
phoenix5.0.0
azkaban3.89.0
sqoop1.4.7
kettle8.0.22
zabbix5.0 LTS
jdk1.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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;