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

一、Zookeeper三节点搭建

1.1 设备规划

HOSTNAMEIP操作系统
masterndoe192.168.122.128Manjaro 20.1
slavenode1192.168.122.130CentOS 7.4
slavenode2192.168.122.131CentOS 7.4

1.2 环境准备

1.2.1 新增hadoop用户

已有

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

没有的话使用该命令

groupadd hadoop
useradd -g hadoop -m -d /home/hadoop -s /bin/bash hadoop

在三台机器

1.2.2 防火墙检查

此处我的代表已被关闭

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

如果没有,执行如下命令

systemctl disable firewalld  # 禁用防火墙
systemctl stop firewalld #关闭防火墙

顺便还要检查所有机器是否能相互ping通

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

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

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

All right. 如果不能,要进行处理,需得注意IP配在同一网段。VM虚拟机可能会为你准备两块虚拟网卡。在三个系统里需要激活同一块

1.2.3 设置免秘登录

在任意一台机器上,这里我使用的masternode,收集其他机器的ssh公钥。

ssh-keygen -t rsa

执行完这条命令之后会在~/下产生文件夹.ssh

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

将三个节点的id_rsa.pub的内容复制到masternode下的authorized_keys文件中去(这个文件是要自己新建的),然后将其分发到slavenode1和slavenode2的相同目录下。

这个操作用于免密通信,方便等下的文件分发

弄完之后测试下能否进行免密登录

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

如图示中进行ssh来连接并且没有要求输入密码则视为成功,注意一定要进行六组两两测试。

如果发生了ssh,connort connection的错误,那么认为是ssh隧道坍塌。须在待连接端重启ssh服务。这个服务名在centos7下为sshd,在centos6下是ssh,在其他debian系和arch系Linux下一般为sshd

systemctl restart sshd

1.2.4 修改主机名

修改三台机器的/etc/hosts文件

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

加入如下内容。为了等下能在物理主机上访问HDFS web管理工具。还需要在本地进行该映射。不过在Windows下,要修改的是C:\Windows\System32\drivers\etc\hosts

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

这个文件一般来讲是不能直接编辑的,需要修改权限。

右键属性->安全->编辑

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

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

添加

把登录用户名写进去

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

添加写入权限

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

1.2.5 脚本准备

这是一个批处理脚本,转载自网友“子墨良言”

通过它可以方便地在一整个集群当中执行相同的命令并获得回显。

deploy.conf

masternode,all,namenode,zookeeper,resourcemanager,
slavenode1,all,slave,namenode,zookeeper,resourcemanager,
slavenode2,all,slave,datanode,zookeeper,

deploy.sh

#!/bin/bash
#set -x
 
if [ $# -lt 3 ]
then 
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag"
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile"
  exit 
fi
 
src=$1
dest=$2
tag=$3
if [ 'a'$4'a' == 'aa' ]
then
  confFile=/home/hadoop/tools/deploy.conf
else 
  confFile=$4
fi
 
if [ -f $confFile ]
then
  if [ -f $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
    do
       scp $src $server":"${dest}
    done 
  elif [ -d $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
    do
       scp -r $src $server":"${dest}
    done 
  else
      echo "Error: No source file exist"
  fi
 
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

runRemoteCmd.sh

#set -x
 
if [ $# -lt 2 ]
then 
  echo "Usage: ./runRemoteCmd.sh Command MachineTag"
  echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile"
  exit 
fi
 
cmd=$1
tag=$2
if [ 'a'$3'a' == 'aa' ]
then
  
  confFile=/home/hadoop/tools/deploy.conf
else 
  confFile=$3
fi
 
if [ -f $confFile ]
then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
    do
       echo "*******************$server***************************"
       ssh $server "source /etc/profile; $cmd"
    done 
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

新建文件夹将其存入,等下会用到,作用等下讲解。

这一步在masternode进行即可。后续所有文件从masternode进行分发。

1.2.6 JDK准备

解压JDK并配置环境变量

tar -zxvf jdk<-version> -C [目标路径]
vim /etc/profile

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

source /etc/profile

这一步要在所有节点进行。

1.3 安装Zookeeper

先解压

方式见1.2.6

1.3.1 修改配置文件

进入解压目录下的conf

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

zoo.cfg本来是没有的,将zoo_sample.cfg拷贝一份并命名为zoo.cfg。编辑

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

以上是该文件需要的全部内容。记得一定要编辑第一二行是zookeeper的日志和数据目录,可以自定义,但一定要自己建立相应的目录并且将其所有者修改为hadoop用户,命令如下

chown hadoop:hadoop -R [目录]

最后三行是节点的myid及主机名及通信端口。

其他参数关系到Hive的正常启动,如果只装hadoop,可以不用配置。

1.3.2 分发

scp -r [zookerper目录] hadoop@slavenode1:[相同路径]

一定要分发到和master相同的路径,这样便于统一调度。

1.3.3 配置环境变量

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

加入这些并使环境变量生效,环境变量如何生效

1.3.4 配置ID

三节点同时进行,在数据目录下新建名为myid的文件

在masternode下的该文件中写入”1″

slavenode1为“2”

slavenode2为“3”

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

如图,只

1.3.4 启动并查看状态

在masternode上启动三节点的zookeeper服务

这时候需要用到runRemoteCmd.sh文件了,记得先给它一个执行权限

chmod 777 runRemoteCmd.sh

执行

runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper

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

三节点的服务已全部开启,但它不会报错,所以我们要自己验证下服务的状态

runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh status" zookeeper

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

显示masternode、slavenode2为跟随者,slavenode1为领导者。代表成功,领导者只有一个,不一定是slavenode1,它是被选举出来的。所以如果不一样不代表失败。如果失败了,则不会显示mode。

1.3.5 什么是JPS

jps是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。我们使用一下

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

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

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

我们发现每个节点上都出先了JPS进程和QuorumPeerMain。

JPS是这条命令本身拉起的进程,QuorumPeerMain则是zookeeper拉起的,那么QuorumPeerMain是什么呢?

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

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

二、Hadoop三节点搭建

2.1 环境准备

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

2.2 安装Hadoop

2.2.1 修改配置文件

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

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

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

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

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

用这一段替换原有的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. -->

<!-- Put site-specific property overrides in this 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>
        <!--命名空间,拼装URL会用到-->        
    </property>
    <property>
        <name>dfs.ha.namenodes.cluster1</name>
        <value>masternode,slavenode1</value>
        <!--可以成为namenode的节点-->        
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster1.masternode</name>
        <value>masternode:9000</value>
        <!--rpc通信-->        
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster1.masternode</name>
        <value>masternode:50070</value>
        <!--http通信-->        
    </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文件

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

把主机名写入即可。

编辑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. -->

<!-- Put site-specific property overrides in this 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

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

用于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,即文件系统与资源调度框架。

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

来验证下

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

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

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

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

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

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

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

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

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

可以看见作为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文件

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

然后使环境变量

3.2.2 元数据库

Hive不是真正的数据库,它需要一个真正的数据库来辅助自己存储一些元数据。元数据库默认采用derby,但一一般采用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>
        <!--Ip,端口,数据库名,这个数据库要先创建一个空的-->            
        </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

用下面的驱动

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

版本号为5.1.x即可

如果你的MySQL是8.x

版本号为8.x

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

初始化元数据库

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

schematool -initSchema -dbType mysql

3.2.2 简单使用

直接用hive命令进入shell

hive

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

查看数据库

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

建表

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

展示表

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

插数据

To Do……

hiveserver2

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

可能会报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进行交互的。

  • HDFS跟Map-Reduce是分开来看的,但它们都被集成到了Hadoop里。

  • HDFS的特性:文件权限和授权、机架感知(在调度任务和分配存储空间时考虑节点的物理位置)、安全模式(一种维护需要的管理模式)、fsck(一个诊断文件系统健康状况的工具,能够发现丢失的文件和数据块)、Rebalance(当datanode之间数据不均衡时,平衡集群上的数据负载)、升级和回滚(在软件更新后有异常发生的情形下,能够回滚到HDFS升级之前的状态)、Secondary Namenode(对文件系统名字空间执行周期性的检查点,将Namenode上HDFS改动日志文件的大小控制在某个特定的限度下)。

  • 超级用户:超级用户即运行name node进程的用户。宽泛的讲,如果你启动了name node,你就是超级用户。超级用户干任何事情,因为超级用户能够通过所有的权限检查。没有永久记号保留谁过去是超级用户;当name node开始运行时,进程自动判断谁现在是超级用户。HDFS的超级用户不一定非得是name node主机上的超级用户,也不需要所有的集群的超级用户都是一个。同样的,在个人工作站上运行HDFS的实验者,不需任何配置就已方便的成为了他的部署实例的超级用户。

  • 命令:所有的hadoop命令均由bin/hadoop脚本引发

  • Map/Reduce:它是一个软件框架,以可靠容错的方式并行处理上T级别的数据。

  • Map/Reduce作业:它会将输入的数据集切分为若干独立的数据块,由map任务以完全并行的方式处理。框架会对map的输出进行排序,然后j把结果输入给reduce任务。对于h该框架来讲,计算节点和存储节点通常在一起。这能使网络带宽的利用率更高。虽然框架是用java实现的,但应用程序不一定要用java来写。

  • JournalNode的作用:用于namenade之间的数据共享,它从属于zookeeper

  • 格式话HDFS之后NameNode启动失败:InconsistentFSStateException: Directory /user/hadoop/tmp/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.一般格式化之后可以看见dfs目录下有data和name两个目录,这时候少一个,重新格式化一遍就可以了

  • 关于hdfs、hive和mysql
    如果你格式化了hadoop的namenode节点。那么重启集群之后为了避免spaceid不一致导致的数据库分裂,你应该删除masternode下的数据文件。可是这样一来,hive的元数据库里的内容将会与HDFS的内容无法对应,从而导致hiveserver不能正常启动,因此,你需要重新初始化元数据库。并且由于hive自身的缺陷,已经遭到修改的元数据库是无法直接被初始化的,因此你需要进入到mysql,手动将元数据库清空。

    原文作者:原味吐司
    原文地址: https://blog.csdn.net/qq_42229092/article/details/109329766
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞