hadoop1

hadoop包括:

 

文件切割后的块里面有偏移量,第3块的偏移量是第1块和第二块的大小合,也等于前一块的偏移量+前一块大小,节点就是服务器。副本数不能太少,否则这几个副本所在的节点资源都用完的话,就不能再有程序访问节点了;只能读

 

 服务器就是台式机,下图有2个机架,每个机架有3个服务器(节点),灰色是副本,dn:datanode,一个文件块至少有3个副本(它们id都一样),就至少要放到3个dn上

 

文件包括元数据和数据本身,元数据放到namenode里面,数据放到datanode里面,hsdfclient如果想要存取数据,首先要去namenode里面知道元数据信息,再自己去datanode拿数据。

元数据存在内存,隔一段时间会持久化,fsimage就是元数据到磁盘后的文件(隔一段时间更新),edis保存对元数据的操作(实时更新),snn根据nn的edis去更新nn上的fsimage(合并edis)

 

 

 

配置如下:其中node2部署了snn和dn,nn和snn都要大量io,不应当放到一个node上;node01运行一个命令启动集群后,需要ssh配置好才能自动启动node3的集群,通过一个机器控制其他机器;

 

步骤:

配置ip:vi /etc/sysconfig/network-scripts/ifcfg-ens32

 

  重启网络:systemctl restart network

配置好jdk后,永久设置主机名:hostnamectl set-hostname 新主机名(把/etc/hostname文件旧的主机名删除,替换为新的主机名),ip与主机名的映射:vi /etc/hosts

 

 

 重启网络:systemctl restart network

 对node01拍个快照,然后克隆node02,node03,node04,再配置下ip和主机名

 node01创建秘钥,此时会生成文件.ssh:ssh-keygen

 把公钥拷贝到node01,node02,node03,node04:ssh-copy-id -i ./.ssh/id_rsa.pub root@node01;...2;..3;...4

然后测试登录所有机器:ssh root@node01;ssh root@node02;...

 node01中把hadoop3.1.0.tar.gz(这是已经编译好的,无需编译源码)上传,然后tar -xvf had..

将一个没什么用的目录删掉,方便后面复制:rm -rf hadoop-3.1.0/share/doc/

修改:vi etc/hadoop/hadoop-env.sh,(环境变量在/etc/profile)末尾加(gg:光标首行;G:光标末尾):

export JAVA_HOME=/usr/java/jdk1.8.0_161

export HDFS_NAMENODE_USER=root

export HDFS_DATANODE_USER=root

export HDFS_SECONDARYNAMENODE_USER=root

上面表示由root用户来操作namenode,dn,snn节点

配置nn:vi etc/hadoop/core-site.xml:

fs.defaultFS表示namenode,即nn在node01上,hadoop.tmp.dir表示把元数据和数据块放到/home/hadoop_data

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9820</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop_data</value>
</property>

</configuration>

告诉它snn在node02上:vi etc/hadoop/hdfs-site.xml:

<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node02:9868</value>
</property>
</configuration>

配置dn在node02.node03,node04:vi etc/hadoop/workers

node02

node03

node04

将hadoop目录拷贝到node02,node03,node04的家目录上:

scp -r hadoop-3.1.0 root@node02:~

scp -r hadoop-3.1.0 root@node03:~

scp -r hadoop-3.1.0 root@node04:~

第一次安装要格式化来创建一个空白的fsimage(他在/home/hadoop_data/dfs/name/current/,.md5是验证文件):

hadoop-3.1.0/bin/hdfs namenode -format

启动hadoop:  cd hadoop-3.1.0/sbin ./start-dfs.sh

用jps显示各个node上当前所有java进程

关闭4个node的防火墙和自启动:

systemctl stop firewalld.service

systemctl disable firewalld.service

访问namenode的http监控页面:http://192.168.154.101:9870/

配置windows下的C:\Windows\System32\drivers\etc\hosts:

192.168.154.101 node01
192.168.154.102 node02
192.168.154.103 node03
192.168.154.104 node04

上面不是高可用的,因为node01可能死掉,高可用HA(可靠的)的hdfs集群中,有多个nn,这几个nn除了状态都一样,没有snn,nn有2个状态active和standby,只有一个nn处于active状态,还有:

 

 

 active的nn把产生的edis保存到所有的 jn 上,处于standby的nn把jn上的新增的edis定时同步下来(时间很快,相当于实时同步),每个zkfc对应一个nn

 

 dn将block的位置数据汇报给所有的nn,zkfc监控到处于active的nn有问题,则通知zookeeper,zookeeper选择一个standby状态的nn,通知对应的zkfc,zkfc让该nn变为active:

 

 nn的fsimage都是相同的原因:一个nn初始化创建一个fsimage后,接下来拷贝到其他的nn上 ,一个standby的nn拿到 jn 上的edis来更新了fsimage后拷贝到其他所有的nn上

如果本机的dn挂了,可启动它:bin/hdfs --daemon start datanode

node01上传zookeeper,然后tar -xvf ...;

配置zookeeper数据存放位置,3个zookeeper放到node01,node02,node03,2888是zookeeper接收其他zookeeper的数据端口,3888是发送

vi zookeeper-3.4.6/conf/zoo.cfg

tickTime=2000
clientPort=2181
initLimit=5
syncLimit=2
dataDir=/home/zookeeper
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888

创建服务编号,在node01,node02,3上同时输入:mkdir /home/zookeeper

node01:echo 1 >  /home/zookeeper/myid

node02:echo 2 >  /home/zookeeper/myid

node03:echo 3 >  /home/zookeeper/myid

将zookeeper拷贝到node02,3:

scp -r zookeeper-3.4.6 root@node02:~

scp -r zookeeper-3.4.6 root@node03:~

 三台机器同时启动zookeeper:

zookeeper-3.4.6/bin/zkServer.sh start

 jps看一下zookeeper有么有启动(QuorumPeerMain)

  结构:

 

 node01上配置其他节点的权限,注释掉snn,再加zkfc和jn:

vi hadoop-3.1.0/etc/hadoop/hadoop-env.sh

#export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root

配置浏览器权限为root方便浏览器操作,bjsxt是集群的名字,不是单个节点的名字:vi hadoop-3.1.0/etc/hadoop/core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bjsxt</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop_data</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- HDFS连接zookeeper集群的地址和端口 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>

</configuration>

node04需要有秘钥:ssh-keygen

node01配置:vi hadoop-3.1.0/etc/hadoop/hdfs-site.xml

<configuration>
<!-- 定义hdfs集群ID号方便别人访问 -->
<property>
<name>dfs.nameservices</name>
<value>bjsxt</value>
</property>
<!-- 定义hdfs集群中namenode的ID号 -->
<property>
<name>dfs.ha.namenodes.bjsxt</name>
<value>nn1,nn2</value>
</property>
<!-- 定义namenode的主机名和RPC协议的端口 -->
<property>
<name>dfs.namenode.rpc-address.bjsxt.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.bjsxt.nn2</name>
<value>node04:8020</value>
</property>
<!-- 定义namenode的主机名和HTTP协议的端口 -->
<property>
<name>dfs.namenode.http-address.bjsxt.nn1</name>
<value>node01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.bjsxt.nn2</name>
<value>node04:9870</value>
</property>
<!-- 定义共享edits的URL,jn -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node02:8485;node03:8485;node04:8485/laoxiao</value>
</property>
<!-- 定义HDFS的客户端连接HDFS集群时返回active namenode地址 -->
<property>
<name>dfs.client.failover.proxy.provider.bjsxt</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- HDFS集群中两个namenode切换状态时的隔离方法,通过隔离方法,当一个nn切换到active后,将另一个处于active的nn强制状态转换为standby -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- HDFS集群中两个namenode切换状态时的隔离方法的密钥 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>

<!-- journalnode集群中用于保存edits文件的目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/journalnode/data</value>
</property>

<!-- HA的HDFS集群自动切换namenode的开关,改为true就能自动切换了-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>

 拷贝到node02,node03,node04:

scp  hadoop-3.1.0/etc/hadoop/* root@node02:~/hadoop-3.1.0/etc/hadoop/

scp  hadoop-3.1.0/etc/hadoop/* root@node03:~/hadoop-3.1.0/etc/hadoop/

scp  hadoop-3.1.0/etc/hadoop/* root@node04:~/hadoop-3.1.0/etc/hadoop/

由于之前有了非HA的元数据,此时把集群变成HA的

node01配置一个变量:vi /etc/profile

export HADOOP_HOME=/root/hadoop-3.1.0

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

重新加载一下:source /etc/profile

启动集群的所有 jn:hadoop-daemons.sh start journalnode

jps看一下node02,3,4有没有启动

再看看有没有报错:tail -100 hadoop-3.1.0/logs/hadoop-root-journalnode-node04.log

共享namenode的edis到 jn 上,node01:

hdfs namenode -initializeSharedEdits

去node02,3,4看有没有edis:cd /opt/journalnode/data/laoxiao/current/

由于node01已经初始化,则node01上启动namenode:

hdfs --daemon start namenode

node04上执行命令拷贝node01的元数据:

cd hadoop-3.1.0/bin/

./hdfs namenode -bootstrapStandby

停止集群:stop-dfs.sh

 

posted @ 2021-01-25 23:45  Jary霸  阅读(109)  评论(0)    收藏  举报