Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 – HA方式 (2台服务器)

Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 – HA方式 (2台服务器)具体的讲解一下如何将hadoop安装成HA模式

大家好,又见面了,我是你们的朋友全栈君。

原帖地址: http://blog.csdn.net/nsrainbow/article/details/42013293 最新课程请关注原作者博客

声明

  • 本文基于Centos 6.x + CDH 5.x 
  • 官方英文安装教程 http://www.cloudera.com/content/cloudera/en/documentation/cdh5/v5-0-0/CDH5-Installation-Guide/cdh5ig_cdh5_install.html 本文并不是简单翻译,而是再整理
  • 如果没有yum源请参考http://blog.csdn.net/nsrainbow/article/details/36629339#t2

架构图

hadoop各个组件的关系是这样的

Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 - HA方式 (2台服务器)

  • namenode 总数就2个,不能多也不能少,一个是active状态,一个是standby状态,只有active状态的在工作,另一个只是备份,当active状态的挂了之后,standby的会切换为active状态。但是这个动作其实不是天生自动的,配合上zookeeper才能实现自动化切换。
  • journalNode 用于存储active状态的namenode所做的所有改变,并同步到standby的namenode,以保证在standby转换为active之后不会漏掉操作
  • namenode管理着datanode,namenode负责存储地址空间,datanode负责真正的存储数据

本次部署之后的架构图是这样的
Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 - HA方式 (2台服务器)

  • 为了降低部署的难度,我就虚拟了两台机子,其实真正部署的时候至少要有3台(保持奇数个)
  • zookeeper是负责在active的namenode挂掉之后自动把standby状态的namenode切换成active的
这幅图则解释了zookeeper在整个hadoop集群中的作用
Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 - HA方式 (2台服务器)

  • zookeeper是游离于hadoop集群之外的组件
  • hadoop利用 zkfc (zookeeperFC) 来跟 zookeeper进行协作,其实目的很简单,就是在一个namenode挂掉的时候,自动切换成另一个namenode为active状态

准备工作

  1. 用vmware开出两台虚拟机,安装上Centos6。 我弄了两个host,分别是 host1(192.168.199.126)  和host2(192.168.199.128)
  2. 开始前请按照 Alex 的 Hadoop 菜鸟教程: 第2课 hadoop 安装教程 (CentOS6 CDH分支 yum方式) 里面的方式添加yum源

安装

安装Zookeeper

注意:我这人比较懒,所以基本都是用root在安装,所以以下命令,如果你们无法执行,请再前面加一个 sudo 。或者想我一样直接用root玩

在两台机都执行
yum install zookeeper -y

都安装 zookeeper-server

sudo yum install zookeeper-server -y


host1 上启动zookeeper

$ sudo service zookeeper-server init --myid=1
$ sudo service zookeeper-server start
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED


注意:这个 –myid=1 标定了zookeeper的id,会在  /var/lib/zookeeper 下建立一个 myid 文件

host2 上启动zookeeper

$ sudo service zookeeper-server init --myid=2
$ sudo service zookeeper-server start
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED

检查下是否在2181端口监听

 $ netstat -tpnl | grep 2181
tcp        0      0 :::2181                     :::*                        LISTEN      5477/java

用client端测试一下

zookeeper-client -server host1:2181

配置zookeeper

在两台机子上都编辑 /etc/zookeeper/conf/zoo.cfg 文件

tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=host1:2888:3888
server.2=host2:2888:3888

改完记得重启zookeeper


注意:其实zookeeper的服务器最小的安装数量是3台机器,但是现在只有2台,只能凑合了。因为zookeeper是根据超过半数出问题来关停系统的,所以2台就无法正确的判断了,不过我们只是做例子所以没关系。

hadoop在启动的时候会自动去找zookeeper的2181端口,如果没有就启动不起来

安装Resource Manager

你需要在两台机子中挑选一台作为resource manager,在这里我挑选
host1(192.168.199.126) 安装
在 host1 上执行
yum install hadoop-yarn-resourcemanager -y

安装Name Node


两台机子上都安装name node
sudo yum install hadoop-hdfs-namenode -y

安装Date Node 等

官方文档说在除了Resource Manager 以外的所有机器上安装以下几个包,不过你要是非在有Resource Manager的机器上装这些也不会出错,只是生产环境肯定不能这么干了。既然我们只有两台机子而且都装datanode,那肯定是只能两台机都要安装了
yum install hadoop-yarn-nodemanager hadoop-hdfs-datanode hadoop-mapreduce -y

官方文档说在其中一台机子上安装以下软件,随便挑一台,就挑
host2

yum install hadoop-mapreduce-historyserver hadoop-yarn-proxyserver -y

在随便一台机器上安装client,选
host1安装吧

yum install hadoop-client -y

配置

配置网络

hadoop官方强烈建议,大家不要用ip,而是用host的名字来进行配置,所以我们要先配置host文件
在host1上运行该命令设置机器名字
sudo hostname host1

在host2 上

sudo hostname host2

这样定义的名字只保持在下次重启之前


在两台机的 /etc/hosts 文件里面都插入这段
192.168.199.126 host1.localdomain host1192.168.199.128 host2.localdomain host2

那个localdomain代表的是本地的域名,相当于localhost一样的东西


修改 /etc/sysconfig/network 确保里面的 HOSTNAME 是 host1.localdomain 或者 host2.localdomain
用uname -a 可以检查是否正确的设置了主机名
[root@localhost conf]# uname -aLinux host1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

配置HDFS


host1
到 /etc/hadoop/conf 文件夹下,编辑
core-site.xml 在 <configuration> 中增加
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://host1.localdomain:8020</value>
</property>

打开 hdfs-site.xml 添加

<property> <name>dfs.permissions.superusergroup</name> <value>hadoop</value></property>

在hdfs-site.xml里面修改一下 namanode 的实际存储位置为更大的磁盘

<configuration>  <property>     <name>dfs.namenode.name.dir</name>     <value>file:///data/hdfs/1/dfs/nn</value>  </property>  <property>   <name>dfs.permissions.superusergroup</name>    <value>hadoop</value>    </property></configuration>

官方文档说在
每一个datanode节点上的hdfs-site.xml里面都配置相同的文件夹来存储数据,比如我就建三个文件夹来存储datanode数据
  <property>    <name>dfs.datanode.data.dir</name>    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>  </property>

所以最后hdfs-site.xml 是这样的

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

<configuration>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:///data/hdfs/1/dfs/nn</value>
  </property>
  <property>
    <name>dfs.permissions.superusergroup</name>
    <value>hadoop</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>
  </property>
</configuration>

PS:默认情况下只要有一台datanode挂了,整个集群就停了然后启动的时候会自动修复数据,如果要提高容错机制,就设置 dfs.datanode.failed.volumes.tolerated ,如果设置为3,那就只有4台挂了才会停止

把 

  • /data/hdfs/1/dfs/nn
  • /data/hdfs/1/dfs/dn
  • /data/hdfs/2/dfs/dn
  • /data/hdfs/3/dfs/dn
全都建立出来,并统一把用户改成 hdfs.hdfs
chown -R hdfs.hdfs hdfs


host2

core-site.xml
<configuration>     <property>       <name>fs.defaultFS</name>       <value>hdfs://host2.localdomain:8020</value>     </property></configuration>

hdfs-site.xml

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

<configuration>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:///data/hdfs/1/dfs/nn</value>
  </property>
  <property>
     <name>dfs.permissions.superusergroup</name>
     <value>hadoop</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>
  </property>
</configuration>

把需要的文件夹也都建立出来,并分配权限
chown -R hdfs.hdfs hdfs

格式化namenode

在两台机子上都使用hdfs来格式化namenode
sudo -u hdfs hdfs namenode -format

启动HDFS

在两台机器上都运行
for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done

建立/tmp文件夹

在host1 上运行
$ sudo -u hdfs hadoop fs -mkdir /tmp
$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp

这样会在hdfs集群上建立 /tmp 文件夹。


注意:这里的 /tmp 并不是某一台机器上的 /tmp 文件夹,是hdfs这个分布式文件系统上的 tmp 文件夹,这是一个高于真实物理机器环境的一个文件环境,host1 和 host2 共同组成了它
可以用 
sudo -u hdfs hadoop fs -ls /

来看下hdfs上根目录下有什么文件夹

检查是否启动成功

启动完后可以用jps 命令 检查是否启动成功

host1
[root@host1 ~]# jps
12044 Jps
2207 ResourceManager
11857 NameNode


host2

[root@host2 ~]# jps10735 NameNode10855 Jps10644 DataNode2272 JobHistoryServer


客户端测试


打开你的浏览器输入 http://<hadoop server ip>:50070

如果看到

Overview ‘host1.localdomain:8020’ (active)

这样的字样就成功进入了hadoop的命令控制台


提示:但是此时你会发现host1 跟 host2 之间其实没有什么关联,通过控制台只能查到各自的datanode信息,接下来我们说下怎么样把两个host组成一个集群

设置HA

最早的时候一个hadoop集群只能有一个namenode如果这个namenode挂了,整个集群就挂了,后来hadoop结合zookeeper发展出新的部署模式,就是HA(High Availability)模式。在这种模式下
  • 一个集群可以有多个namenode
  • 只有一个namenode处于活跃状态,其他namenode处于备选状态
  • 活跃状态的namenode跟备选状态的namenode之间有一定的时间差
  • 采用journalNode来记录namenode的所有改动,在活跃namenode到备选namenode切换过程中保证不漏掉操作步骤

配置HA

先从修改core-site.xml 开始
接下来的配置是
两台机器都一样的,所以我就只写一份
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>
  <property>
     <name>hadoop.tmp.dir</name>            
     <value>/data/hdfs/tmp</value>                                         
  </property>
  <property>       
     <name>ha.zookeeper.quorum</name>                  
     <value>host1:2181,host2:2181</value>                                                                                
  </property>
</configuration>

建立对应的文件夹并分配权限

cd /data/hdfs
mkdir tmp
chown -R hdfs.hdfs tmp

参数解释:

  • fs.defaultFS 用一个统一的名字来标定集群的名字
  • hadoop.tmp.dir 是yarn使用的临时文件夹
  • ha.zookeeper.quorum 设定所有zookeeper server的地址,理论上一定要是奇数个,但是现在条件所迫就设置成2个吧
接下来是hdfs-site.xml

<configuration>
  <property>  
     <name>dfs.replication</name>  
     <value>2</value>  
  </property>
  <property>  
    <name>dfs.permissions</name>  
    <value>false</value>  
  </property>
  <property>      
    <name>dfs.nameservices</name>    
    <value>mycluster</value>      
  </property>
  <property>  
    <name>dfs.ha.namenodes.mycluster</name>  
    <value>host1,host2</value>  
  </property>
  <property>  
    <name>dfs.namenode.rpc-address.mycluster.host1</name>  
    <value>host1:8020</value>  
  </property>  
  <property>      
    <name>dfs.namenode.http-address.mycluster.host1</name>      
    <value>host1:50070</value>      
  </property>   
  <property>      
    <name>dfs.namenode.rpc-address.mycluster.host2</name>      
    <value>host2:8020</value>      
  </property>  
  <property>      
    <name>dfs.namenode.http-address.mycluster.host2</name>      
    <value>host2:50070</value>     
  </property>  
  <property>    
    <name>dfs.ha.automatic-failover.enabled</name>    
    <value>false</value>    
  </property>     
  <property>  
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://host1:8485;host2:8485/mycluster</value>  
  </property>
  <property>  
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
  </property>
  <property>      
    <name>dfs.journalnode.edits.dir</name>      
    <value>/data/yarn/tmp/journal</value>      
  </property>       
  <property>      
    <name>dfs.ha.fencing.methods</name>      
    <value>sshfence</value>      
  </property>  
  <property>      
       <name>dfs.ha.fencing.ssh.private-key-files</name>      
       <value>/var/lib/hadoop-hdfs/.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>
<property>
     <name>dfs.namenode.name.dir</name>
     <value>file:///data/hdfs/1/dfs/nn</value>
  </property>
  <property>
    <name>dfs.permissions.superusergroup</name>
    <value>hadoop</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn</value>
  </property>
</configuration>

配置解释

  • dfs.replication 数据的复制份数
  • dfs.nameservices serviceid 接下来的配置参数中会用到,也就是一个集群的名字
  • dfs.ha.namenodes.mycluster 这个mycluster就是之前定义的serviceid,这边列出所属的namenode,也就是namenode的host名字
  • dfs.namenode.rpc-address.mycluster.host1 各个namenode的 rpc通讯地址
  • dfs.namenode.http-address.mycluster.host1 各个namenode的http状态页面地址
  • dfs.ha.automatic-failover.enabled 是否启用故障自动处理?就是故障的时候会自动启用备选的namenode,暂时设定为false
  • dfs.namenode.shared.edits.dir 定义了集群的日志节点,采用统一格式  “qjournal://host1:port1;host2:port2;host3:port3/journalId” ,日志节点是由active状态的namenode写入,由standby(备选)状态节点读出
  • dfs.ha.fencing.methods 处于故障状态的时候hadoop要防止脑裂问题,所以在standby机器切换到active后,hadoop还会试图通过内部网络的ssh连过去,并把namenode的相关进程给kill掉,一般是sshfence 就是ssh方式,后面的 dfs.ha.fencing.ssh.private-key-files 则配置了 ssh用的 key 的位置

建立文件夹,并分配权限

sudo mkdir -p /data/yarn/tmp/journal
sudo chown -R hdfs:hdfs /data/yarn

删除之前建立的dn文件夹,重新建立新的dn文件夹

# rm -rf /data/hdfs/3
# rm -rf /data/hdfs/1/dfs/dn
# rm -rf /data/hdfs/2/dfs/dn
# mkdir /data/hdfs/1/dfs/dn
# chown -R hdfs.hdfs /data/hdfs/1/dfs/dn/
# mkdir /data/hdfs/2/dfs/dn
# chown -R hdfs.hdfs /data/hdfs/2/dfs/dn/

为 dfs.ha.fencing.ssh.private-key-files 建立sshkey

step1

在host1 上切换到root用户创建id_rsa文件

[root@host1 ~]# sudo su -
[root@host1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

中间过程问的问题全部回车解决

Step2

把生成的 /root/.ssh/id_rsa.pub 拷贝到 host2 上,然后到host2上用root 权限执行
[root@host2 .ssh]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

Step3

回到 host1 ,把 /root/.ssh/id_rsa 拷贝到 hdfs 的 .ssh  目录,并且修改用户为hdfs
[root@host1 .ssh]# cp /root/.ssh/id_rsa /var/lib/hadoop-hdfs/.ssh/
[root@host1 .ssh]# chown hdfs.hdfs /var/lib/hadoop-hdfs/.ssh/id_rsa 

Step4

在host1上用hdfs测试一下看能不能用root身份ssh连上host2
[root@host2 .ssh]# sudo su hdfs
bash-4.1$ ssh root@host2
The authenticity of host 'host2' can't be established.
RSA key fingerprint is dd:91:6c:c2:df:65:20:68:e7:e4:fc:5b:a8:4f:c6:8c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'host2' (RSA) to the list of known hosts.
Last login: Tue Dec 30 20:34:00 2014 from 10.172.252.22
[root@host2 ~]# ll

Step5

在host2上重复以上4步

修改mapred-site.xml

<configuration>
  <property>  
       <name>mapreduce.framework.name</name>  
       <value>yarn</value>  
  </property>
</configuration>

修改yarn-site.xml ,在 <configuration/> 节点里面插入一个属性

<property>            <name>yarn.resourcemanager.hostname</name>            <value>host1</value>        </property>

修改文件slave

host1
host2

把 core-site.xml , hdfs-site.xml, mapred-site.xml, yarn-site.xml, slaves 复制到host2上

重启两台机器上的hadoop, 顺序无所谓

for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x stop; done
for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done


注意:如果你启动有错,不要慌,去 /var/log/hadoop-hdfs 看下日志,看具体错在哪里再想解决方案


这个时候你可以访问 host1:50070 或者 host2:50070 会看到两个namenode都处在standby状态,是不能对外服务的


接下来我们来看下如何部署HA

部署HA

安装并启动JournalNodes


两台机器上都执行
yum install hadoop-hdfs-journalnode -y

在两台机器上都启动服务

service hadoop-hdfs-journalnode start

格式化

在两台机器上格式化namenode
sudo -u hdfs hdfs namenode -format -clusterId mycluster

在两台机器上停止namenode
service hadoop-hdfs-namenode stop


host1上初始化journalnode
hdfs namenode -initializeSharedEdits

启动namenode

再启动
第一个namenode就是你要作为主要的namenode的那个,这里我把host1作为主要的

在host1上执行
service hadoop-hdfs-namenode start

接下来启动备用namenode,这里我把host2作为备用的namenode

sudo -u hdfs hdfs namenode -bootstrapStandby

可能会问你是否要格式化,记得选Y


启动备用namenode
service hadoop-hdfs-namenode start

我解释一下,当你用 -bootstrapStandby 启动备选的namenode的时候,它会将内容从主namenode上复制过来(包括命名空间信息和最近修改信息)存储的位置就是你在 dfs.namenode.name.dir 和 dfs.namenode.edits.dir里面配置的,在本教程中就是 file:///data/hdfs/1/dfs/nn

启动 datanode

请大家记住hadoop的基本启动顺序
  1. 最先启动的是所有机器上的 journalnode
  2. 再启动主机上的namenode
  3. 启动备选机上的namenode(还需要用 -bootstrapStandby 拉取镜像)
  4. 启动所有机器上的datanode

设置host1为active状态

现在我们用浏览器访问 http://host1:50070 和 http://host2:50070 你会发现两个namenode 都还是standby状态。这时你需要把其中一个转化为active状态才行。不过前提是你得先把 dfs.ha.automatic-failover.enabled 设置成false,所以前面我设置的时候设置成了false 。
现在我们来设置host1 为active状态
hdfs haadmin -failover host2 host1

成功后再去看 http://host1:50070 会看到 ‘host1:8020’ (active) 字样,标志着 host1终于处在活跃状态,集群终于可以工作了!
其实haadmin 有一个transitionToActive命令,但是最好不要用这个命令,因为主备切换的时候最大的问题就是 脑裂问题,说具体了就是,有可能一不小心把俩namenode都弄成active状态,并且还都同时工作,造成数据写入的不一致,后果不堪设想。所以用failover的好处就是会检查另外一个namenode,如果是active就会设置成standby,如果已经是standby就什么也不做,这样比较安全。

设置自动failover

部署还没有结束,我们之前用的是手动failover,其实是不够的,如果每次出问题都要手动解决,这个集群等于是不稳定的。所以要设置自动failover。自动failover用的是zookeeper 的 ZooKeeper FailoverController (ZKFC) 
安装zkfc
两台机器都运行
yum install hadoop-hdfs-zkfc -y

先去把 hdfs-site.xml 里面的 dfs.ha.automatic-failover.enabled 弄成true,然后重启namenode
  <property>    <name>dfs.ha.automatic-failover.enabled</name>    <value>true</value>  </property>

格式化zookeeper

在host1 上执行 
hdfs zkfc -formatZK

这一步会在zookeeper根目录下建立 /hadoop-ha/mycluster 这个目录。

建立完后我们去验证一下用 zookeeper-client 连接上zookeeper
# zookeeper-client -server host1:2181[zk: host1:2181(CONNECTED) 0] ls /[hadoop-ha, zookeeper]

在两台机器上都启动 zkfc


service hadoop-hdfs-zkfc start

官方说明了几点:

  • zkfc跟zookeeper关系密切,要是zookeeper挂了,zkfc也就失效了
  • 最好监控着zkfc进程,防止zkfc退出了,造成无法自动切换
  • zkfc跟namenode的启动顺序是无所谓的

验证namenode状态

打开浏览器访问 host1:50070 会发现 这个 namenode 变成了active 状态,再看看 host2:50070 会发现是 standby 状态。并且datanode下有两个datanode节点出现

恭喜你!配置完成!

参考资料

  • http://blog.csdn.net/yczws1/article/details/23566383 这篇教程建议大家也去看下,可以对大于2台机器的安装有些概念上的认识
  • http://pan.baidu.com/share/link?shareid=3918641874&uk=2248644272 这篇文章写的相当不错,对概念的解释很到位
  • http://www.sizeofvoid.net/hadoop-2-0-namenode-ha-federation-practice-zh/ 对更进一步的 HDFS联盟感兴趣的可以看下这篇文章

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135740.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle创建索引的sql语句_mysql创建组合索引

    oracle创建索引的sql语句_mysql创建组合索引Oracle创建索引

    2025年9月13日
    6
  • hadoop生态圈详解

    hadoop生态圈详解学习和使用hadoop有一年了,这里主要分享一下对hadoop整体上的理解,分门别类的介绍一下相关组件,最后提供了建议的学习路线,希望对hadoop的初学者有参考作用。1.Hadoop核心件组有哪些?广义hadoop指什么?l核心组件有:Hdfs、Yarn、MapReduce;l广义上指一个生态圈,泛指大数据技术相关的开源组件或产品,如hdfs、yarn、h…

    2022年5月22日
    50
  • DOM简要

    DOM简要

    2022年1月6日
    47
  • Vue的axios封装

    Vue的axios封装Vue 的 axios 封装在 vue 项目中 经常需要封装 axios 文档又看不懂 所以总结一下方法 安装 npminstallax 安装 axios 引入在项目的 src 目录中 新建一个 request 文件夹 然后在里面新建一个 http js 和一个 api js 文件 http js 文件用来封装我们的 axios api js 用来统一管理我们的接口 在 http js 中引入 axiosimporta axios 引入 axiosimportQ

    2025年7月10日
    4
  • 基于SwipeRefreshLayout的上拉加载控件

    基于SwipeRefreshLayout的上拉加载控件距离上一篇博客,居然已经过了大半年的时间,时间过得真快啊!CSDN最近大改版,各种用户体验也是被无数人吐槽,让人提不起任何写博客的兴趣,不过,该写的博客还是必须得写,话不多话,直接进入正题。现在项目中用列表来展示数据比比皆是,ListView和RecyclerView大家也是耳熟能详。实际项目中,后台肯定的接口肯定都是分页的,那么,分页加载也是自然而然的事,下面基于Google原生的下拉刷新控

    2022年6月25日
    27
  • 编写java判断闰年_用Java程序判断是否是闰年的简单实例[通俗易懂]

    编写java判断闰年_用Java程序判断是否是闰年的简单实例[通俗易懂]我们知道,(1)如果是整百的年份,能被400整除的,是闰年;(2)如果不是整百的年份,能被4整除的,也是闰年。每400年,有97个闰年。鉴于此,程序可以作以下设计:第一步,判断年份是否被400整除,能的话,就是闰年。比如1600、2000、2400年是闰年。第二步,在第一步不成立的基础上,判断年份能否被100整除,如果是,则不是闰年。比如1900、2100、2200年不是闰年。第三步,在第二步不成…

    2022年7月8日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号