大数据基础
Hadoop 三大发行版本:Apache、Cloudera、Hortonworks。这里以普通的 Apache Hadoop 方式搭建大数据环境(后面会考虑使用更贴合实际的 CDH 版本的 Hadoop集群)
Hadoop Yarn集群的搭建 虚拟机的准备
先准备三台centos7虚拟机,具体方式不做演示
修改 IP
第一台虚拟机修改为如下内容:
# vim /etc/sysconfig/network-scripts/ifcfgens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=29b35945-26d7-4f4f-9924-ff97b9bf0638 DEVICE=ens33 ONBOOT=yes IPADDR=10.144.144.102 PREFIX=24 GATEWAY=10.144.144.2 DNS1=10.144.144.2
第二台虚拟机修改为如下内容:
BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="07ad7c52-3d68-4e89-a699-8be6a0bd92d0" DEVICE="ens33" ONBOOT="yes" IPADDR="10.144.144.103" PREFIX="24" GATEWAY="10.144.144.2" DNS1="10.144.144.2"
第三台虚拟机修改为如下内容:
BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="07ad7c52-3d68-4e89-a699-8be6a0bd92d0" DEVICE="ens33" ONBOOT="yes" IPADDR="10.144.144.104" PREFIX="24" GATEWAY="10.144.144.2" DNS1="10.144.144.2"
修改主机名
第一台虚拟机修改为如下内容:
# vim /etc/hostname hadoop102
第二台虚拟机修改为如下内容:
# vim /etc/hostname hadoop103
第三台虚拟机修改为如下内容:
# vim /etc/hostname hadoop104
配置 Linux 克隆机主机名称映射 hosts 文件,打开/etc/hosts # vim /etc/hosts 三台主机都如此修改即可 10.144.144.144 my_centos 10.144.144.102 hadoop102 10.144.144.103 hadoop103 10.144.144.104 hadoop104 10.144.144.254 my_portable_centos
Windows host文件配置 # windows/system32/drivers/etc/hosts 10.144.144.144 my_centos 10.144.144.102 hadoop102 10.144.144.103 hadoop103 10.144.144.104 hadoop104 10.144.144.254 my_portable_centos
卸载自带的 jdk rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
➢ rpm -qa:查询所安装的所有 rpm 软件包
➢ grep -i:忽略大小写
➢ xargs -n1:表示每次只传递一个参数
➢ rpm -e –nodeps:强制卸载软件
关闭防火墙并禁用开机自启动防火墙 # hadoop102 hadoop103 hadoop104 都需要如下配置 systemctl stop firewalld systemctl disable firewalld.service
创建普通用户 # 使用 root 账户操作 useradd admin passwd admin # 回车后,提示输入新密码,建议123456
配置 admin 用户具有 root 权限,方便后期加 sudo 执行 root 权限的命令 修改/etc/sudoers 文件,在%wheel 这行下面添加一行,如下所示:
# vim /etc/sudoers # root ALL=(ALL) ALL # % wheel ALL=(ALL) ALL admin ALL=(ALL) NOPASSWD:ALL # 注意,位置一定要放到 wheel 下面一行
注意:admin 这一行不要直接放到 root 行下面,因为所有用户都属于 wheel 组,你先 配置了 admin 具有免密功能,但是程序执行到%wheel 行时,该功能又被覆盖回需要 密码。所以 admin 要放到%wheel 这行下面。
在/opt 目录下创建文件夹,并修改所属主和所属组 (1)在/opt 目录下创建 module、software 文件夹 【三台主机都需要如下操作,如果你是采用的clone模式另外两台主机,只需要Hadoop102操作即可】
[root@hadoop102 ~]# mkdir /opt/module [root@hadoop102 ~]# mkdir /opt/software
(2)修改 module、software 文件夹的所有者和所属组均为 admin 用户
[root@hadoop102 ~]# chown admin:admin /opt/module [root@hadoop102 ~]# chown admin:admin /opt/software
三台主机都编辑完成后,reboot 。
Hadoop102上安装jdk
用 XShell 传输工具将 JDK 导入到 opt 目录下面的 software 文件夹下面
解压 JDK 到/opt/module 目录下 tar -zxvf jdkjdk-8u311-linux-x64.tar.gz -C /opt/module/
配置 JDK 环境变量
(1)新建/etc/profile.d/my_env.sh 文件
[admin@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
添加如下内容
# JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_311 export PATH=$PATH:$JAVA_HOME/bin
保存, source 一下/etc/profile 文件,让新的环境变量 PATH 生效即可
编写集群分发脚本 xsync
(1)需求:循环复制文件到所有节点的相同目录下
# 在/home/admin/bin 目录下创建 xsync 文件 # 在该文件中编写如下代码 # !/bin/bash # 1. 判断参数个数 if [ $# -lt 1 ]; then echo Not Enough Arguement! exit fi # 2. 遍历集群所有机器 for host in hadoop102 hadoop103 hadoop104; do echo ==================== $host ==================== # 3. 遍历所有目录,挨个发送 for file in $@; do # 4. 判断文件是否存在 if [ -e $file ]; then # 5. 获取父目录 pdir=$( cd -P $(dirname $file) pwd ) # 6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done done
(2)修改脚本 xsync 具有执行权限
[admin@hadoop102 bin]$ chmod +x xsync
(3)测试脚本
[admin@hadoop102 ~]$ xsync /home/admin/bin
(4)将脚本复制到/bin 中,以便全局调用
[admin@hadoop102 bin]$ sudo cp xsync /bin/
(5)同步环境变量配置(root 所有者)
[admin@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
注意:如果用了 sudo,那么 xsync 一定要给它的路径补全。
(6)让环境变量生效
[admin@hadoop102 bin]$ source /etc/profile
SSH 无密登录配置 需求:ssh 另一台电脑的ip地址
[root@hadoop102 .ssh]$ pwd /root/.ssh [root@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
[root@hadoop102 .ssh]$ ssh-copy-id hadoop102 [root@hadoop102 .ssh]$ ssh-copy-id hadoop103 [root@hadoop102 .ssh]$ ssh-copy-id hadoop104
登录 hadoop103,104 ,在其上也执行一遍如上操作
# 登录 hadoop103 [root@hadoop103 .ssh]$ ssh-copy-id hadoop102 [root@hadoop103 .ssh]$ ssh-copy-id hadoop103 [root@hadoop103 .ssh]$ ssh-copy-id hadoop104 # 登录 hadoop104 [root@hadoop104 .ssh]$ ssh-copy-id hadoop102 [root@hadoop104 .ssh]$ ssh-copy-id hadoop103 [root@hadoop104 .ssh]$ ssh-copy-id hadoop104
切换成 admin 用户,然后重复一遍上面的操作即可【注意:不需要重新生成 id_rsa 了】
同步 jdk 到 Hadoop103,Hadoop104 [admin@hadoop102 module]$ xsync jdk1.8.0_311/ # 同步 my_env.sh [admin@hadoop102 module]$ xsync /etc/profile.d/my_env.sh
Hadoop 安装 Hadoop 下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
1)用 XShell 文件传输工具将 hadoop-3.1.3.tar.gz 导入到 opt 目录下面的 software 文件夹下 面
2)进入到 Hadoop 安装包路径下 [atguigu@hadoop102 ~]$ cd /opt/software/
3)解压安装文件到/opt/module 下面
[admin@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
4)查看是否解压成功
[admin@hadoop102 software]$ ls /opt/module/ hadoop-3.1.3
5)将 Hadoop 添加到环境变量
(1)获取 Hadoop 安装路径 [admin@hadoop102 hadoop-3.1.3]$ pwd /opt/module/hadoop-3.1.3
(2)打开/etc/profile.d/my_env.sh 文件 [admin@hadoop102 hadoop-3.1.3]$ sudo vim /etc/profile.d/my_env.sh
# HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
Hadoop Yarn集群配置 配置 core-site.xml 核心配置文件 vim $HADOOP_HOME/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration > <property > <name > fs.defaultFS</name > <value > hdfs://hadoop102:8020</value > </property > <property > <name > hadoop.tmp.dir</name > <value > /opt/module/hadoop-3.1.3/data</value > </property > <property > <name > hadoop.http.staticuser.user</name > <value > admin</value > </property > </configuration >
配置 hdfs-site.xml HDFS 配置文件 vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration > <property > <name > dfs.namenode.http-address</name > <value > hadoop102:9870</value > </property > <property > <name > dfs.namenode.secondary.http-address</name > <value > hadoop104:9868</value > </property > </configuration >
配置 yarn-site.xml YARN 配置文件 vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration > <property > <name > yarn.nodemanager.aux-services</name > <value > mapreduce_shuffle</value > </property > <property > <name > yarn.resourcemanager.hostname</name > <value > hadoop103</value > </property > <property > <name > yarn.nodemanager.env-whitelist</name > <value > JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value > </property > </configuration >
配置 mapred-site.xml MapReduce 配置文件 vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration > <property > <name > mapreduce.framework.name</name > <value > yarn</value > </property > </configuration >
配置 workers vim $HADOOP_HOME/etc/hadoop/workers
在该文件中增加如下内容:
hadoop102 hadoop103 hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
配置历史服务器 为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
配置 mapred-site.xml vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
在该文件里面增加如下配置:
<property > <name > mapreduce.jobhistory.address</name > <value > hadoop102:10020</value > </property > <property > <name > mapreduce.jobhistory.webapp.address</name > <value > hadoop102:19888</value > </property >
查看 JobHistory: http://hadoop102:19888/jobhistory
配置日志的聚集 日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer。此处建议直接重启 hdfs ,yarn
配置 yarn-site.xml vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
在该文件里面增加如下配置。
<property > <name > yarn.log-aggregation-enable</name > <value > true</value > </property > <property > <name > yarn.log.server.url</name > <value > http://hadoop102:19888/jobhistory/logs</value > </property > <property > <name > yarn.log-aggregation.retain-seconds</name > <value > 604800</value > </property >
集群启动/停止方式 (1)各个模块分开启动/停止(配置 ssh 是前提)常用
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止 YARN
start-yarn.sh/stop-yarn.sh
(3)各个服务组件逐一启动/停止
分别启动/停止 HDFS 组件 hdfs --daemon start/stop namenode/datanode/secondarynamenode
启动/停止 YARN yarn --daemon start/stop resourcemanager/nodemanager
Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver):myhadoop.sh cd /home/admin/bin
vim myhadoop.sh
➢ 输入如下内容
# !/bin/bash if [ $# -lt 1 ]; then echo "No Args Input..." exit fi case $1 in "start") echo " =================== 启动 hadoop 集群 ===================" echo " --------------- 启动 hdfs ---------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh" echo " --------------- 启动 yarn ---------------" ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh" echo " --------------- 启动 historyserver ---------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver" ;; "stop") echo " =================== 关闭 hadoop 集群 ===================" echo " --------------- 关闭 historyserver ---------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver" echo " --------------- 关闭 yarn ---------------" ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh" echo " --------------- 关闭 hdfs ---------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh" ;; *) echo "Input Args Error..." ;; esac
注意hadoop版本,路径确认一致
赋予脚本执行权限 chmod +x myhadoop.sh
查看三台服务器 Java 进程脚本:jpsall cd /home/admin/bin
vim jpsall
➢ 输入如下内容
# !/bin/bash for host in hadoop102 hadoop103 hadoop104 do echo =============== $host =============== ssh $host jps done
赋予脚本执行权限 chmod +x jpsall
分发内容到其它主机 前面已经将 jdk 分发了,此处只需要分发 hadoop my_env.sh 即可
# 分发/home/admin/bin 目录,保证自定义脚本在三台机器上都可以使用 xsync /home/admin/bin/ # hadoop xsync /opt/module/hadoop-3.1.3/ # my_env.sh xsync /etc/profile.d/my_env.sh
启动集群测试 # 启动 myhadoop.sh start # jps jpsall
Hive 搭建 hive 的元素据选择存储在mysql中,因此需要安装 mysql
hive 包准备 apache-hive-3.0.0-bin.tar.gz (从硬盘中获取该文件,上传到 hadoop102/opt/software/目录下)
解压到 /opt/module/ 目录下,重命名为 hive-3.0.0
MySQL安装 参考文章:https://hello-github-ui.github.io/posts/8567/
配置hive文件 修改/opt/module/hive-3.0.0/conf/hive-env.sh
cp hive-env.sh.template hive-env.sh
增加内容如下:
export HADOOP_HOME=/opt/module/hadoop-3.1.3 export HIVE_CONF_DIR=/opt/module/hive-3.0.0/conf export HIVE_AUX_JARS_PATH=/opt/module/hive-3.0.0/lib
配置hive-site.xml文件 直接新建 hive-site.xml 文件
vim hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration > <property > <name > hive.metastore.local</name > <value > false</value > </property > <property > <name > hive.metastore.warehouse.dir</name > <value > /hive/warehouse</value > <description > location of default database for the warehouse</description > </property > <property > <name > hive.exec.scratchdir</name > <value > /tmp/hive</value > </property > <property > <name > hive.scratch.dir.permission</name > <value > 777</value > <description > The permission for the user specific scratch directories that get created.</description > </property > <property > <name > hive.exec.local.scratchdir</name > <value > /opt/module/hive-3.0.0/tmp/hive/root</value > <description > Local scratch space for Hive jobs</description > </property > <property > <name > hive.downloaded.resources.dir</name > <value > /opt/module/hive-3.0.0/tmp/resources</value > <description > Temporary local directory for added resources in the remote file system.</description > </property > <property > <name > javax.jdo.option.ConnectionURL</name > <value > jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true& useSSL=false& allowPublicKeyRetrieval=true</value > <description > JDBC connect string for a JDBC metastore</description > </property > <property > <name > javax.jdo.option.ConnectionDriverName</name > <value > com.mysql.cj.jdbc.Driver</value > <description > Driver class name for a JDBC metastore</description > </property > <property > <name > javax.jdo.option.ConnectionUserName</name > <value > root</value > <description > username to use against metastore database</description > </property > <property > <name > javax.jdo.option.ConnectionPassword</name > <value > 123456</value > <description > password to use against metastore database</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.metastore.schema.verification</name > <value > false</value > </property > <property > <name > hive.metastore.uris</name > <value > thrift://hadoop102:9083</value > </property > </configuration >
hive连接MySQL驱动连接包 拷贝 mysql-connector-java-8.0.26.jar 包 ,将其放到 /opt/module/hive-3.0.0/lib 目录下。
硬盘上mysql目录下应该有这个 connector 包
配置 hive 日志 mv hive-log4j2.properties.template hive-log4j2.properties
在 /opt/module/hive-3.0.0/ 新建目录 log,用于存放 hive 日志
修改 hive-log4j2.properties 配置:
# 找到改行内容,将其修改为如下 property.hive.log.dir = /opt/module/hive-3.0.0/log
新建hive仓库目录 hdfs dfs -mkdir -p /hive/warehouse hdfs dfs -mkdir -p /tmp/hive
配置环境变量 # vim /etc/profile.d/my_env.sh # JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_311 export PATH=$PATH:$JAVA_HOME/bin # HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin # HIVE_HOME export HIVE_HOME=/opt/module/hive-3.0.0 export PATH=$PATH:$HIVE_HOME/bin export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS=-Djava.library.path=$HADOOP_HOME/lib
元数据库初始化 进入目录 /opt/module/hive-3.0.0/bin
schematool -dbType mysql -initSchema
启动hive
注意:启动hive前,一定要先启动 metastore 或者 hiveserver2 Spark Thrift Server 是 Spark 社区基于 HiveServer2 实现的一个 Thrift 服务。旨在无缝兼容HiveServer2。因为 Spark Thrift Server 的接口和协议都和 HiveServer2 完全一致,因此我们部 署好 Spark Thrift Server 后,可以直接使用 hive 的 beeline 访问 Spark Thrift Server 执行相关语句。Spark Thrift Server 的目的也只是取代 HiveServer2,因此它依旧可以和 Hive Metastore 进行交互,获取到 hive 的元数据。
此处通过 Thrift 服务来启动 客户端配置:sh /opt/module/spark-yarn/sbin/start-thriftserver.sh
使用 beeline 连接 Thrift Server: bin/beeline -u jdbc:hive2://hadoop102:10000 -n admin
当然你也可以通过启动 metasotre,进入hive的bin目录 : ./hive --service metastore &
,然后再启动hive: hive
Spark 搭建 spark-3.0.0-bin-hadoop3.2.tgz 准备,从硬盘上获取
上传到 hadoop102 /opt/software/ 上,解压缩到 /opt/module/ 下
重命名为 mv spark-3.0.0-bin-hadoop3.2 spark-yarn
编辑文件 vim /opt/module/spark-yarn/conf/spark-env.sh 文末增加如下内容
export JAVA_HOME=/opt/module/jdk1.8.0_311 YARN_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop export SPARK_HISTORY_OPTS=" -Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://hadoop102:8020/directory -Dspark.history.retainedApplications=30
Spark连接外置hive 通常来说如果你下载的是二进制版本的Spark,它应该已经在编译时添加了hive支持
若要把 Spark SQL连接到一个部署好的hive上,你必须把 hive-site.xml 复制到 Spark的配置文件目录中,即使没有部署好 hive,Spark SQL 也可以运行。因为实际中这种方式比较少,所以我们这里主要来讲 连接 外置hive
如果想连接外部已经部署好的 Hive,需要通过以下几个步骤:
➢ Spark 要接管 Hive 需要把 /opt/module/hive-3.0.0/conf/hive-site.xml
拷贝到 /opt/module/spark-yarn/conf/
目录下
➢ 把 Mysql 的驱动 copy 到 /opt/module/spark-yarn/jars/
目录下
➢ 如果访问不到 hdfs,则需要把 /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
和 /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
拷贝到 conf/目录下
➢ 重启 spark-shell