写点什么

Hadoop 分布式高可用 HA 集群搭建笔记(含 Hive 之构建)

用户头像
极客good
关注
发布于: 刚刚


根据官方文档来看,是个入口类。用来加载 myid


二、Hadoop 三节点搭建


============================================================================


2.1 环境准备




还是需要 JDK,这个在 1.2.6 中已经完成。


2.2 安装 Hadoop



2.2.1 修改配置文件

首先还是在主机上进行,首先进入到安装目录下的 etc/hadoop 目录下去。编辑 hadoop-env.sh 文件



JAVA_HOME 参数本来不这样,你改成 JDK 目录即可。等下分发的时候如果不同的机器 JDK 目录不一致,则自己还是要做相应


然后要编辑相同目录下的 core.site.xml 文件



用这一段替换原有的 configuration 即可。除了 hadoop.tmp.dir 需要自定义其他可以不用管。这个是 hadoop 临时目录,上传到 hdfs 的文件需要在这里暂存,配置完后还得手动建这么个目录然后更改拥有者为 hadoop,方式见 1.3.1


然后修改 hdfs-site.xml


<?xml version="1.0" encoding="UTF-8"?>


<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>


<!--


Licensed 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. See accompanying LICENSE file.


-->


<configuration>


<property>


<name>dfs.replication</name>


<value>3</value>


</property>


<property>


<name>dfs.permissions</name>


<value>false</value>


</property>


<property>


<name>dfs.permissions.enabled</name>


<value>false</value>


</property>


<property>


<name>dfs.nameservices</name>


<value>cluster1</value>


</property>


<property>


<name>dfs.ha.namenodes.cluster1</name>


<value>masternode,slavenode1</value>


</property>


<property>


<name>dfs.namenode.rpc-address.cluster1.masternode</name>


<value>masternode:9000</value>


</property>


<property>


<name>dfs.namenode.http-address.cluster1.masternode</name>


<value>masternode:50070</value>


</property>


<property>


<name>dfs.namenode.rpc-address.cluster1.slavenode1</name>


<value>slavenode1:9000</value>


</property>


<property>


<name>dfs.namenode.http-address.cluster1.slavenode1</name>


<value>slavenode1:50070</value>


</property>


<property>


<name>dfs.ha.automatic-failover.enabled</name>


<value>true</value>


</property>


<property>


<name>dfs.namenode.shared.edits.dir</name>


<value>qjournal://masternode:8485;slavenode1:8485;slavenode2:8485/cluster1</value>


</property>


<property>


<name>dfs.client.failover.proxy.provider.cluster1</name>


<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>


</property>


<property>


<name>dfs.journalnode.edits.dir</name>


<value>/home/hadoop/data/journaldata/jn</value>


</property>


<property>


<name>dfs.ha.fencing.methods</name>


<value>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>10000</value>


</property>


<property>


<name>dfs.namenode.handler.count</name>


<value>100</value>


</property>


</configuration>


将这段覆盖进去即可


编辑 slaves 文件



把主机名写入即可。


编辑 mapred-site.xml


<?xml version="1.0"?>


<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>


<!--


Licensed 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. See accompanying LICENSE file.


-->


<configuration>


<property>


<name>mapreduce.framework.name</name>


<value>yarn</value>


</property>


</configuration>


将这段覆盖进去即可,这表示等下要调用 yarn 框架。这个配置限于 hadoop2.x 及以上版本,因为 1.x 是没有 yarn 框架的。yarn 的作用在于进行 mapreduce 运行时的资源调度。而 1.x 的资源调度是由 mapreduce 本身来进行的。


编辑 yarn-site.xml 文件


<?xml version="1.0"?>


<!--


Licensed 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. See accompanying LICENSE file.


-->


<configuration>


<property>


<name>yarn.resourcemanager.connect.retry-interval.ms</name>


<value>2000</value>


</property>


<property>


<name>yarn.resourcemanager.ha.enabled</name>


<value>true</value>


</property>


<property>


<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>


<value>true</value>


</property>


<property>


<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>


<value>true</value>


</property>


<property>


<name>yarn.resourcemanager.cluster-id</name>


<value>yarn-rm-cluster</value>


</property>


<property>


<name>yarn.resourcemanager.ha.rm-ids</name>


<value>rm1,rm2</value>


</property>


<property>


<name>yarn.resourcemanager.hostname.rm1</name>


<value>masternode</value>


</property>


<property>


<name>yarn.resourcemanager.hostname.rm2</name>


<value>slavenode1</value>


</property>


<property>


<name>yarn.resourcemanager.recovery.enabled</name>


<value>true</value>


</property>


<property>


<name>yarn.resourcemanager.zk.state-store.address</name>


<value>masternode:2181,slavenode1:2181,slavenode2:2181</value>


</property>


<property>


<name>yarn.resourcemanager.zk-address</name>


<value>masternode:2181,slavenode1:2181,slavenode2:2181</value>


</property>


<property>


<name>yarn.resourcemanager.address.rm1</name>


<value>masternode:8032</value>


</property>


<property>


<name>yarn.resourcemanager.scheduler.address.rm1</name>


<value>masternode:8034</value>


</property>


<property>


<name>yarn.resourcemanager.webapp.address.rm1</name>


<value>masternode:8088</value>


</property>


<property>


<name>yarn.resourcemanager.address.rm2</name>


<value>slavenode1:8032</value>


</property>


<property>


<name>yarn.resourcemanager.scheduler.address.rm2</name>


<value>slavenode1:8034</value>


</property>


<property>


<name>yarn.resourcemanager.webapp.address.rm2</name>


<value>slavenode1:8088</value>


</property>


<property>


<name>yarn.nodemanager.aux-services</name>


<value>mapreduce_shuffle</value>


</property>


<property>


<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>


<value>org.apache.hadoop.mapred.ShuffleHandler</value>


</property>


</configuration>


将这段覆盖进去即可。这是相关资源调度信息。

2.2.2 分发

见 1.3.2 的方式

2.2.3 启动 journalnode

runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all



用于 namenade 之间的数据共享,它从属于 zookeeper。所有 namenode 可以不是只有一个,如果你配置的只有一个,那么不用管这个,如果有,需要做数据共享。我这版是配置了两个的。

2.2.4 格式化

这时候需要格式化 namenode 了,什么是 namenode?


Namenode 是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。


在主节点上


bin/hdfs namenode -format #namenode 格式化


bin/hdfs zkfc -formatZK #格式化高可用


bin/hdfs namenode #启动 namenode


接下来要做一个备节点


在备节点上(slavenode1)


bin/hdfs namenode -bootstrapStandby

2.2.5 启动集群

sbin/start-all.sh


这条命令将会启动 HDFS 与 YARN,即文件系统与资源调度框架。



来验证下





namenode 并没有启动,经检查发现这是因为我用的一个已经废弃的环境,数据目录已经被我改得面目全非。所有 namenode 不能启动,关掉之后换用 hadoop2.7 配的新环境




这下 namenode 出现了。我们进 GUI 界面看看




可以看见作为 namenode,masternode 处于激活状态,而 slavenode1 处于准备状态。


与此同时三个节点都可以作为 datanode 来使用,那么 datanode 是什么呢?


Namenode 管理文件系统的元数据,而 Datanode 存储了实际的数据。客户端联系 Namenode 以获取文件的元数据或修饰属性,而真正的文件 I/O 操作是直接和 Datanode 进行交互的。


三、Hive 环境配置


=========================================================================


3.1 个人理解




Hive 是 Facebook 开源的一个数据仓库,它的作用在于,可以以 SQL 的形式去操纵 HDFS 文件系统里的数据,它的上层是 SQL 解释器,底层是 Map/Reduce 运算框架。


直接与 HDFS 交互很可能需要写代码,即自己编写 Map/Reduce 程序,这是有一定门槛的。但通过 Hive,可以以 SQL 的形式将数据扔进已写好的 Map/Reduce 的程序进行运算,大大降低了运维难度。


但也正因此,Hive 对数据的处理是非常慢的,因为底层复杂的矩阵运算注定了 Hive 的 SQL 不能像主流数据库的 SQL 那么快,Hive 之慢,相较于真正的 SQL,是以指数级递增的。正因此,Hive 适合大数据的一次写入多次读取,数据不到 TB 级,使用 Hive 是严重的浪费,是技术选型的典型失败。


3.2 安装配置




Hive 在随便哪个节点上配置一次即可,不用分发。

3.2.1 配置文件

首先是配置环境变量,编辑/etc/profile 文件



然后使环境变量

3.2.2 元数据库

Hive 不是真正的数据库,它需要一个真正的数据库来辅助自己存储一些元数据。元数据库默认采用 de


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


rby,但一一般采用 mysql。顺便说一些,Hive 的语法与 Mysql 非常相似,并且都不是特别符合主流的 SQL 标准。


进入安装目录的 conf 目录,编辑 hive-site.xml,如果没有自己创建一个,将下面内容覆盖进去,然后根据自己情况做略微修改。


<?xml version="1.0" encoding="UTF-8" standalone="no"?>


<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>


<configuration>


<property>


<name>javax.jdo.option.ConnectionURL</name>


<value>jdbc:mysql://IP:PORT/db</value>


</property>


<property>


<name>javax.jdo.option.ConnectionDriverName</name>


<value>com.mysql.jdbc.Driver</value>


</property>


<property>


<name>javax.jdo.option.ConnectionUserName</name>


<value>******</value>


</property>


<property>


<name>javax.jdo.option.ConnectionPassword</name>


<value>**********</value>


</property>


<property>


<name>hive.metastore.schema.verification</name>


<value>false</value>


</property>


</configuration>


我写注释的地方全部要根据自己情况进行修改


装入 MySQL 启动


连接 MySQL 是要驱动文件的,如果你用的 MySQL5.x


用下面的驱动



版本号为 5.1.x 即可


如果你的 MySQL 是 8.x


版本号为 8.x


这些官网有下,网上也流传着很大,将它放在安装目录下的 lib 目录


初始化元数据库


进入安装目录的 bin 目录,执行


schematool -initSchema -dbType mysql

3.2.2 简单使用

直接用 hive 命令进入 shell


hive



查看数据库



建表



展示表



插数据


To Do……


hiveserver2



可能会报 SSL 警告,只有进程不中止,就不用管它。


用 beeline 工具在客户端进行连接,beeline 是 hive 自带的,不用额外下载安装


四、技术总结


=====================================================================


关于 hadoop


  • 单机模式:默认情况下,Hadoop 被配置成以非分布式模式运行一个独立 java 进程。做调试用。

  • 伪分布式:在单节点上以伪分布式模式运行,此时每一个 hadoop 守护进程都作为一个独立的 java 进程运行。

  • 格式化分布式文件系统:bin/hadoop namenode -format

  • 启动 hadoop 守护进程:sbin/start-all.sh

  • namenode 默认地址:localhost:50700

  • jobtracker 默认地址:localhost:50030

  • 通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为 JobTracker。这些机器是 masters。余下的机器即作为 DataNode 也作为 TaskTracker。这些机器是 slaves。

  • hadoop 的守护进程:NameNode/DataNode 和 JobTracker/TaskTracker

  • 错误检测和快速、自动的回复是 HDFS 最核心的架构目标

  • HDFS 的设计中更多的考虑到了数据批处理,而不是用户交互处理。比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。

  • HDFS 被调节以支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的 HDFS 实例应该能支撑数以千万计的文件。

  • 一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。

  • 一个应用请求的计算,离它操作的数据越近就越高效,在数据达到海量级别的时候更是如此。

  • master/slave 架构:一个 HDFS 集群是由一个 Namenode 和一定数目的 Datanodes 组成。Namenode 是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的 Datanode 一般是一个节点一个,负责管理它所在节点上的存储。HDFS 暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。

  • 数据复制:HDFS 被设计成能够在一个大集群中跨机器可靠地存储超大文件。它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的。为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。HDFS 中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。

  • 机架感知:通过机架感知,NameNode 可以确定每个 DataNode 所属的机架 ID

  • 通讯协议:HDFS 通讯协议建立在 TCP/IP 协议之上。

  • HDFS 常见的出错情况:Namenode 出错,Datanode 出错和网络割裂。

  • 心跳检测:Datanode 节点周期性地向 Namenode 发送心跳信号。网络割裂可能导致 Datanode 跟 Namenode 失去联系。Namenode 通过心跳信号的缺失来检测这一状况,不再发送心跳信号的 Datanode 会被 Namenode 标为宕机,不会再有 IO 请求发给它们。

  • 负载均衡:如果某个 Datanode 节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动地将数据从这个 Datanode 移动到其他空闲的 Datanode。当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。

  • 数据完整性:HDFS 客户端软件实现了对 HDFS 文件内容的校验和(checksum)检查。当客户端创建一个新的 HDFS 文件,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个 HDFS 名字空间下。当客户端获取文件内容后,它会检验从 Datanode 获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他 Datanode 获取该数据块的副本。

  • 数据块:HDFS 支持文件的“一次写入多次读取”语义。一个典型的数据块大小是 64MB。

  • 临时文件:在刚开始阶段 HDFS 客户端会先将文件数据缓存到本地的一个临时文件。应用程序的写操作被透明地重定向到这个临时文件。当这个临时文件累积的数据量超过一个数据块的大小,客户端才会联系 Namenode。Namenode 将文件名插入文件系统的层次结构中,并且分配一个数据块给它。然后返回 Datanode 的标识符和目标数据块给客户端。接着客户端将这块数据从本地临时文件上传到指定的 Datanode 上。当文件关闭时,在临时文件中剩余的没有上传的数据也会传输到指定的 Datanode 上。然后客户端告诉 Namenode 文件已经关闭。此时 Namenode 才将文件创建操作提交到日志里进行存储。

  • HDFS:HDFS 是 Hadoop 应用用到的一个最主要的分布式存储系统。一个 HDFS 集群主要由一个 NameNode 和很多个 Datanode 组成:Namenode 管理文件系统的元数据,而 Datanode 存储了实际的数据。客户端联系 Namenode 以获取文件的元数据或修饰属性,而真正的文件 I/O 操作是直接和 Datanode 进行交互的。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Hadoop分布式高可用HA集群搭建笔记(含Hive之构建)