小型Hadoop集群的Ganglia配置和一些故障排除

Ganglia是一个针对大型集群的开源,可扩展且分布式的监视系统。 它收集,汇总并提供数十种与计算机相关的指标(例如CPU,内存,存储,网络使用情况)的时序视图。 您可以在UC Berkeley Grid上看到Ganglia的运行情况。

Ganglia也是监视Hadoop和HBase群集的流行解决方案,因为Hadoop(和HBase)具有将其度量发布到Ganglia的内置支持。 使用Ganglia,您可以轻松地查看特定HDSF数据节点随时间写入的字节数,给定HBase区域服务器的块缓存命中率,对HBase集群的请求总数,花费在垃圾收集上的时间以及很多很多其他。

基本神经节概述

神经节由三部分组成:

  • Ganglia监视守护程序(gmond) –一个守护程序,需要在每个受监视的节点上运行。 它收集本地监视指标并宣布它们,并且(如果已配置)接收并汇总从othergmond发送给它的指标
    s(甚至来自自身)。
  • Ganglia meta守护程序(gmetad) –定期从一个或多个数据源(数据源可以是agmond或othergmetad)进行轮询以接收和汇总当前指标的守护程序。 汇总结果存储在数据库中,并且可以XML格式导出到其他客户端,例如Web前端。
  • Ganglia PHP Web前端 –它从meta守护程序检索组合的指标,并以精美的动态HTML页面的形式显示它们,其中包含各种实时图形。

如果您想了解有关gmond,gmetad和Web前端的更多信息,请在Ganglia的Wikipedia页面上找到很好的描述。 希望下面的图片(显示示例性配置)有助于理解这个想法:

在本文中,我将重点介绍Ganglia的配置。 如果您使用的是Debian,请参考以下教程进行安装(只需输入几个命令)。 我们在这篇文章中使用Ganglia 3.1.7。

小型Hadoop集群的Ganglia

虽然Ganglia是可伸缩的,分布式的并且可以监视数百乃至数千个节点,但是小型集群也可以从中受益(开发人员和管理员也可以从中受益,因为Ganglia是学习Hadoop和HBase内部的一种很好的经验方法)。 在本文中,我想描述一下我们如何在运行Hadoop和HBase的五节点群集(1个主节点和4个从属节点)上配置Ganglia。 我相信5节点集群(或类似大小)是许多公司和组织开始使用Hadoop的典型配置。 请注意,Ganglia具有足够的灵活性,可以通过多种方式进行配置。 在这里,我将简单描述我想要实现的最终效果以及实现方式。 我们的监控要求可以指定如下:

  • 从每个节点轻松获取指标
  • 轻松获取所有从属节点的汇总指标(这样我们将知道MapReduce作业和HBase操作使用了多少资源)
  • 轻松获取所有主节点的聚合指标(到目前为止,我们只有一个主节点,但是当集群增长时,我们将一些主重传(例如JobTracker,Secondary Namenode)移动到单独的机器上)
  • 轻松获取所有节点的汇总指标(以获取集群的总体状态)

这意味着我希望Ganglia将集群视为两个“逻辑”子集群,例如“主”和“从”。 基本上,我希望看到这样的页面:

可能的Ganglia配置

这是一张说明性图片,显示了满足我们所有要求的5节点Hadoop集群的简单Ganglia配置。 因此,让我们以这种方式进行配置!

请注意,我们希望保留尽可能多的默认设置。 默认:

  • gmond在UDP端口8649上进行通信(在gmond.conf中指定了inudp_send_channel和udp_recv_channel部分)
  • gmetad在TCP端口8649上下载指标(在intcp_accept_channel部分ingmond.conf中指定,在gmetad.conf中的data_source条目中)

但是,一项设置​​将被更改。 我们将gmond之间的通信方法设置为单播UDP消息(而不是多播UDP消息)。 与多播相比,单播具有以下优点:对于较大的群集(例如,具有一百多个节点的群集)更好,并且Amazon EC2环境也支持单播(与多播不同)。

Ganglia监视守护程序(gmond)配置

根据上图:

    • 每个节点都运行agmond。

从站子集群配置

    • slave1,slave2,slave3和slave4节点上的每个gmond都定义udp_send_channel,以将度量标准发送到slave1(端口8649)
    • slave1上的gmond定义udp_recv_channel(端口8649)以侦听传入的度量,并定义tcp_accept_channel(端口8649)以宣布它们。 这意味着该gmond是该子集群的“引导节点”,并收集所有gmond从从节点(甚至从自身)通过UDP(端口8649)发送的所有度量标准,稍后可以由gmetad通过TCP(端口8649)进行轮询。

掌握子集群配置

  • 主节点上的gmond定义udp_send_channel以将数据发送到主节点(端口8649),udp_recv_channel(端口8649)和tcp_accept_channel(端口8649)。 这意味着它成为该单节点群集的“主导节点”,并从自身收集所有指标并将其公开给gmetad。 该配置应在gmond.conf文件中指定(您可以在/ etc / ganglia /中找到它)。 slave1的gmond.conf(仅包括最重要的设置):
cluster {name = 'hadoop-slaves'...
}
udp_send_channel {host = slave1.node.IP.addressport = 8649
}
udp_recv_channel {port = 8649
}
tcp_accept_channel {port = 8649
}

适用于slave2,slave3,slave4的gmond.conf(实际上,也可以使用与slave1相同的gmond.conf文件):

cluster {name = 'hadoop-slaves'...
}
udp_send_channel {host = slave1.node.IP.addressport = 8649
}
udp_recv_channel {}
tcp_accept_channel {}

主节点的gmond.conf文件应与slave1的gmond.conf文件类似–只需将master1的IP地址替换为slave1的IP地址,并将群集名称设置为“ hadoop-masters”。 您可以在此处阅读有关gmond的配置部分和属性的更多信息。

Ganglia meta守护程序(gmetad)

gmetad的配置更加简单:

  • 大师级跑步
  • gmetad定义了两个数据源:
data_source 'hadoop-masters' master.node.IP.address
data_source 'hadoop-slaves' slave1.node.IP.address

该配置应在gmetad.conf文件中指定(您可以在/ etc / ganglia /中找到它)。

Hadoop和HBase与Ganglia集成

Hadoop和HBase使用GangliaContext类将每个守护程序收集的指标(例如datanode,tasktracker,jobtracker,HMaster等)发送到gmond。 成功设置Ganglia后,您可能需要编辑/etc/hadoop/conf/hadoop-metrics.properties和/etc/hbase/conf/hadoop-metrics.properties,以向Ganglia宣布与Hadoop和HBase相关的度量。 由于我们使用与Ganglia版本3.1.x兼容的CDH 4.0.1,因此我们在属性文件中使用了新引入的GangliaContext31(而不是较旧的GangliaContext类)。

从站的度量标准配置

# /etc/hadoop/conf/hadoop-metrics.properties
...
dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext31
dfs.period=10
dfs.servers=hadoop-slave1.IP.address:8649
...
mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext31
mapred.period=10
mapred.servers=hadoop-slave1.IP.address:8649
...

主站的指标配置

应该与从站相同–例如,只需使用hadoop-master.IP.address:8649(而不是hadoop slave1.IP.address:8649)即可:

# /etc/hbase/conf/hadoop-metrics.properties
...
hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext31
hbase.period=10
hbase.servers=hadoop-master.IP.address:8649
...

切记在所有节点上都编辑两个属性文件(对于Hadoop编辑/etc/hadoop/conf/hadoop-metrics.properties,对于HBase编辑/etc/hbase/conf/hadoop-metrics.properties),然后重新启动Hadoop和HBase集群。 无需其他配置。

更多细节

实际上,令我惊讶的是Hadoop的恶魔确实将数据发送到某个地方,而不仅仅是被轮询该数据。 这是什么意思? 例如,这意味着每个单个从节点都运行多个进程(例如gmond,datanode,tasktracker和regionserver),这些进程收集度量并将其发送到在slave1节点上运行的gmond。 如果我们在slave2,slave3和slave4上停止gmonds,但仍运行Hadoop的守护程序,我们仍将获得与Hadoop相关的度量标准(但不会获得有关内存,cpu使用情况的度量标准,因为它们是由停止的gmond s发送的)。 请查看下面的图片中的slave2节点,以了解(或多或少)它是如何工作的(tt,dd和rs分别表示tasktracker,datanode和regionserver,而删除slave4是为了提高可读性)。

单点故障

在节点开始出现故障之前,此配置效果良好。 而且我们知道他们会的! 而且我们知道,不幸的是,我们的配置至少有两个单点故障(SPoF):

  • 在slave1上的gmond(如果该节点发生故障,则有关所有从节点的所有监视统计信息将不可用)
  • gmetad和master上的Web前端(如果该节点发生故障,则整个监视系统将不可用。这意味着我们不仅会释放最重要的Hadoop节点(实际上,它应称为SUPER-master,因为它有很多master守护程序)已安装,但我们也失去了宝贵的监视信息源,可通过查看该节点在发生故障前的瞬间生成的图形和度量来帮助我们检测故障原因)

避免在slave1节点上使用Ganglia的SPoF

幸运的是,您可以根据需要指定任意数量的udp_send_channels,以向其他gmond冗余发送度量(假设这些gmond指定udp_recv_channels来监听传入的度量)。 在我们的例子中,我们可能选择slave2也是额外的引导节点(与slave1一起)以冗余地收集指标(并向gmetad通知他们)

  • 在所有从属节点上运行updategmond.conf并定义其他udp_send_channel部分以将度量标准发送到slave2(端口8649)
  • 在slave2上的updategmond.conf上定义udp_recv_channel(端口8649)以侦听传入的度量,并在tcp_accept_channel(端口8649)上宣布它们(在slave1的gmond.conf中已经设置了相同的设置)
  • 在从属节点上运行的Hadoop和HBase守护程序的updatehadoop-metrics.properties文件,以将其度量标准同时发送到slave1和slave2。例如:
# /etc/hbase/conf/hadoop-metrics.properties
...
hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext31
hbase.period=10
hbase.servers=hadoop-slave1.IP.address:8649,hadoop-slave2.IP.address:8649
  • 最终updatedata_source“ hadoop-slaves” ingmetad.conf从两个冗余gmond s轮询数据(如果gmetad无法从slave1.node.IP.address提取数据,它将继续尝试slave2.node.IP.address):
data_source 'hadoop-slaves' slave1.node.IP.address slave2.node.IP.address

也许下面的图片不是很幸运(有很多箭头),但是它的意思是,如果slave1发生故障,那么gmetad将能够从slave2节点上的gmond获取指标(因为所有从节点都将指标冗余地发送给在slave1上运行的gmond s和slave2)。

避免在主节点上使用Ganglia的SPoF

这里的主要思想是不要将gmetad(和Web前端)与Hadoop主守护程序并置,这样,如果主节点发生故障(或根本变得不可用),我们就不会丢失监视统计信息。 一个想法是,例如,将gmetad(和Web前端)从slave1移到slave3(或slave4),或者简单地引入一个在slave3(或slave4)上运行的冗余gmetad。 前者的想法似乎还可以,而后者则使如此小的集群变得非常复杂。 我想,更好的主意是引入一个额外的节点(如果可能,称为“边缘”节点),该节点运行gmetad和Web前端(它可能还安装了基本的Hadoop和HBase软件包,但不运行任何Hadoop的守护程序-它仅充当客户端计算机,以启动MapReduce作业并访问HBase。 实际上,“边缘”节点通常用于在用户和群集之间提供接口(例如,它运行Pig和Hive , Oozie )。

故障排除和提示可能会有所帮助

由于调试配置的各个方面是设置Ganglia的最长部分,因此我在这里分享了一些技巧。 请注意,本文并不涵盖所有可能的疑难解答,而是基于我们遇到并最终设法解决的问题。

从小开始

尽管Ganglia的过程配置不是那么复杂,但是最好仅从两个节点开始,如果可行,将其扩展到更大的集群。 但是之前,您需要安装任何Ganglia的守护程序…

尝试将“ Hello”从node1发送到node2

确保可以使用UDP协议与给定目标主机上的端口8649进行通信。 netcat是一个简单的工具,可以帮助您进行验证。 打开节点1(稍后称为“引导节点”)上的端口8649以进行入站UDP连接,然后从节点2向其发送一些文本。

# listen (-l option) for inbound UDP (-u option) connections on port 8649 
# and prints received data
akawa@hadoop-slave1:~$ nc -u -l -p 8649
# create a UDP (-u option) connection to hadoop-slave1:8649 
# and send text from stdin to that node:
akawa@hadoop-slave2:~$ nc -u hadoop-slave1 8649
Hello My Lead Node
# look at slave1's console to see if the text was sucessfully delivered
akawa@hadoop-slave1:~$
Hello My Lead Node

如果不起作用,请仔细检查您的iptables规则(如果使用IPv6,则为iptables或ip6tables)是否为UDP和TCP连接打开了端口8649。

让gmond将数据发送到另一个gmond

在两个节点上安装gmond,并验证一个节点是否可以使用端口8649上的UDP连接将其指标发送到另一个节点。您可以在gmond.conf文件中为两个节点使用以下设置:

cluster {name = 'hadoop-slaves'
}
udp_send_channel {host = the.lead.node.IP.addressport = 8649
}
udp_recv_channel {port = 8649
}
tcp_accept_channel {}

运行完gmonds后(sudo /etc/init.d/ganglia-monitor start),可以使用lsof检查连接是否建立:

akawa@hadoop-slave1:~$ sudo lsof -i :8649
COMMAND   PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
gmond   48746 ganglia    4u  IPv4 201166172      0t0  UDP *:8649 
gmond   48746 ganglia    5u  IPv4 201166173      0t0  TCP *:8649 (LISTEN)
gmond   48746 ganglia    6u  IPv4 201166175      0t0  UDP hadoop-slave1:35702->hadoop-slave1:8649
akawa@hadoop-slave2:~$ sudo lsof -i :8649
COMMAND   PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
gmond   31025 ganglia    6u  IPv4 383110679      0t0  UDP hadoop-slave2:60789->hadoop-slave1:8649

要查看是否有任何数据实际发送到引导节点,请使用tcpdump转储端口8649上的网络流量:

akawa@hadoop-slave1:~$ sudo tcpdump -i eth-pub udp port 8649
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth-pub, link-type EN10MB (Ethernet), capture size 65535 bytes
18:08:02.236625 IP hadoop-slave2.60789 > hadoop-slave1.8649: UDP, length 224
18:08:02.236652 IP hadoop-slave2.60789 > hadoop-slave1.8649: UDP, length 52
18:08:02.236661 IP hadoop-slave2.60789 > hadoop-slave1.8649: UDP, length 236

使用调试选项

tcpdump显示某些数据已传输,但没有告诉您发送了哪种数据。 希望在调试模式下运行gmond或gmetad可以为我们提供更多信息(由于在调试模式下它不能作为守护程序运行,因此只需使用Ctrl + C即可停止运行)

akawa@hadoop-slave1:~$ sudo /etc/init.d/ganglia-monitor stop
akawa@hadoop-slave1:~$ sudo /usr/sbin/gmond -d 2loaded module: core_metrics
loaded module: cpu_module
...
udp_recv_channel mcast_join=NULL mcast_if=NULL port=-1 bind=NULL
tcp_accept_channel bind=NULL port=-1
udp_send_channel mcast_join=NULL mcast_if=NULL host=hadoop-slave1.IP.address port=8649metric 'cpu_user' being collected nowmetric 'cpu_user' has value_threshold 1.000000...............metric 'swap_free' being collected nowmetric 'swap_free' has value_threshold 1024.000000metric 'bytes_out' being collected now********** bytes_out:  21741.789062....
Counting device /dev/mapper/lvm0-rootfs (96.66 %)
Counting device /dev/mapper/360a980006467435a6c5a687069326462 (35.31 %)
For all disks: 8064.911 GB total, 5209.690 GB free for users.metric 'disk_total' has value_threshold 1.000000metric 'disk_free' being collected now.....sent message 'cpu_num' of length 52 with 0 errorssending metadata for metric: cpu_speed

我们看到收集了各种度量并将其发送到host = hadoop-slave1.IP.address port = 8649。 不幸的是,它只能告诉您您是通过UDP发送的,因此无法正确传递您的消息。

不要混合使用IPv4和IPv6

让我们看一下集群中遇到的实际情况(这是神秘而烦人的Ganglia错误配置的根本原因)。 首先,查看lsof结果。

akawa@hadoop-slave1:~$ sudo  lsof -i :8649
COMMAND   PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
gmond   38431 ganglia    4u  IPv4 197424417      0t0  UDP *:8649 
gmond   38431 ganglia    5u  IPv4 197424418      0t0  TCP *:8649 (LISTEN)
gmond   38431 ganglia    6u  IPv4 197424422      0t0  UDP hadoop-slave1:58304->hadoop-slave1:864913:56:33
akawa@ceon.pl: akawa@hadoop-slave2:~$ sudo  lsof -i :8649
COMMAND   PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
gmond   23552 ganglia    6u  IPv6 382340910      0t0  UDP hadoop-slave2:36999->hadoop-slave1:8649

在此,hadoop-slave2将度量发送到右侧端口上的hadoop-slave1,并且hadoop-slave1也将在右侧端口上侦听。 除了一个重要的细节外,所有内容都与上一节中的代码片段几乎相同– hadoop-slave2通过IPv6发送,而hadoop-slave1通过IPv4读取! 最初的猜测是更新ip6tables(除iptables之外)规则以打开端口8649,以通过IPv6进行UDP和TCP连接。 但这没有用。 当我们在gmond.conf文件中将主机名“ hadoop-slave1.vls”更改为其IP地址时,它就起作用了(是的,之前我在每个文件中都使用主机名而不是IP地址)。 确保将您的IP地址正确解析为主机名,反之亦然。

使用gstat获取集群摘要

如果您设法将发送指标从slave2发送到slave1,则意味着您的集群正在运行。 在Ganglia的术语中,群集是一组主机,它们在gmond.conf文件中共享相同的群集名称属性,例如“ hadoop-slaves”。 Ganglia提供了一个有用的名为gstat的功能,它可以打印由在给定节点上运行的gmond表示的主机列表。

akawa@hadoop-slave1:~$ gstat --all
CLUSTER INFORMATIONName: hadoop-slavesHosts: 2
Gexec Hosts: 0Dead Hosts: 0Localtime: Tue Aug 21 22:46:21 2012CLUSTER HOSTS
Hostname                     LOAD                       CPU              GexecCPUs (Procs/Total) [     1,     5, 15min] [  User,  Nice, System, Idle, Wio]
hadoop-slave248 (    0/  707) [  0.01,  0.07,  0.09] [   0.1,   0.0,   0.1,  99.8,   0.0] OFF
hadoop-slave148 (    0/  731) [  0.01,  0.06,  0.07] [   0.0,   0.0,   0.1,  99.9,   0.0] OFF

检查gmetad从哪里轮询指标

在运行gmetad的主机上运行以下命令,以检查其轮询指标的群集和主机(以某种方式grep以仅显示有用的行):

akawa@hadoop-master:~$ nc localhost 8651 | grep hadoop<GRID NAME='Hadoop_And_HBase' AUTHORITY='http://hadoop-master/ganglia/' LOCALTIME='1345642845'>
<CLUSTER NAME='hadoop-masters' LOCALTIME='1345642831' OWNER='ICM' LATLONG='unspecified' URL='http://ceon.pl'>
<HOST NAME='hadoop-master' IP='hadoop-master.IP.address' REPORTED='1345642831' TN='14' TMAX='20' DMAX='0' LOCATION='unspecified' GMOND_STARTED='1345632023'>
<CLUSTER NAME='hadoop-slaves' LOCALTIME='1345642835' OWNER='ICM' LATLONG='unspecified' URL='http://ceon.pl'>
<HOST NAME='hadoop-slave4' IP='...' REPORTED='1345642829' TN='16' TMAX='20' DMAX='0' LOCATION='unspecified' GMOND_STARTED='1345478489'>
<HOST NAME='hadoop-slave2' IP='...' REPORTED='1345642828' TN='16' TMAX='20' DMAX='0' LOCATION='unspecified' GMOND_STARTED='1345581519'>
<HOST NAME='hadoop-slave3' IP='...' REPORTED='1345642829' TN='15' TMAX='20' DMAX='0' LOCATION='unspecified' GMOND_STARTED='1345478489'>
<HOST NAME='hadoop-slave1' IP='...' REPORTED='1345642833' TN='11' TMAX='20' DMAX='0' LOCATION='unspecified' GMOND_STARTED='1345572002'>

备择方案

由于监视群集是非常广泛的主题,因此有许多工具可以帮助您完成此任务。 对于Hadoop集群,除了Ganglia之外,您还可以找到许多其他有趣的替代方案。 我只想简短地提到其中的几个。

Cloudera Manager 4(企业版)

除了大大简化Hadoop集群的安装和配置过程之外,Cloudera Manager还提供了一些有用的功能来监视和可视化Hadoop的数十种服务性能指标以及与主机相关的信息,包括CPU,内存,磁盘使用率和网络I / O。 此外,它会在您接近关键阈值时向您发出警报(Ganglia本身不提供警报,但可以与Nagios和Hyperic等警报系统集成)。 您可以在此处了解有关Cloudera Manager关键功能的更多信息。

仙人掌,Zabbix,Nagios,Hyperic

请访问仙人掌网站以了解有关此工具的更多信息。 这也是有关使用Cacti进行Hadoop Graphing的非常有趣的博客文章。 Zabbix , Nagios和Hyperic是您可能还需要研究的工具。

致谢

我要非常感谢我的同事Pawel Tecza和Artur Czeczko,他们帮助我在集群上配置和调试了Ganglia。

参考: 一个小型Hadoop集群的Ganglia配置以及 Hakuna MapData的 JCG合作伙伴 Adam Kawa的一些故障排除 方法! 博客。

翻译自: https://www.javacodegeeks.com/2013/04/ganglia-configuration-for-a-small-hadoop-cluster-and-some-troubleshooting.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

margin赋值为负值的几种效果(负值像素,负值百分数)

1、margin-top为负值像素 margin-top为负值像素&#xff0c;偏移值相对于自身&#xff0c;其后元素受影响&#xff0c;见如下代码&#xff1a; 1 <!DOCTYPE html>2 <html lang"zh">3 <head>4 <meta charset"UTF-8" />5 &…

File如何转换成MultipartFile

MutipartFile是spring里面定义的接口&#xff0c;它封装了用户在上传图片时所包含的所有信息&#xff0c;但是有些时候我们要将file转换成MutipartFile&#xff0c;才能在保持原有代码逻辑的情况下方便代码的调整&#xff0c;但是file不能直接转换成MutipartFile&#xff0c;现…

Vue 进阶教程之:详解 v-model

分享 Vue 官网教程上关于 v-model 的讲解不是十分的详细&#xff0c;写这篇文章的目的就是详细的剖析一下&#xff0c; 并介绍 Vue 2.2 v-model改进的地方&#xff0c;然后穿插的再说点 Vue 的小知识。在 Vue 中&#xff0c;有许多方法和 Angular 相似&#xff0c;这主要是因…

linux 无密码登录另一台服务器,ECS Linux服务器ssh免密码登录另外一台服务器的具体设置...

若有多台linux服务器&#xff0c;为方便起见&#xff0c;服务器之前可设置免密码ssh登录&#xff0c;具体操作参考如下所示&#xff1a;1 、登录其中一个服务器&#xff0c;执行ssh-keygen -t rsa&#xff0c;按3次回车&#xff0c;将会生成公钥和私钥文件id_rsa和id_rsa.pub&a…

Spring 3.2 @ControllerAdvice批注的异常处理

不久前&#xff0c;我写了一个博客&#xff0c;概述了如何将Spring示例代码升级到3.2版&#xff0c;并演示了其中的一些小“陷阱”。 从那以后&#xff0c;我一直在仔细阅读Spring 3.2的新功能列表&#xff0c;尽管它不包含任何革命性的新更改&#xff0c;但我怀疑Spring的家伙…

DOM元素属性值如果设置为对象

结论&#xff1a;内部会调用toString方法&#xff0c;将设置的对象转换为字符串添加给相应的属性&#xff1b; 这个问题呢&#xff0c;是通过jQuery的each方法中&#xff0c;回调函数的this指向问题而来&#xff1b; 我们知道&#xff0c;回调函数中的this如果指向的是基本数据…

纯CSS3美化单选按钮radio

这种纯CSS3美化单选按钮radio的方法适用于以下情况&#xff1a; 1、可兼容IE9以上&#xff0c;需要兼容IE8的要写IE的hack把样式去掉 2、只支持单选按钮radio&#xff0c;因为单选按钮选中样式的圆圈可以用CSS做出来&#xff0c;但是复选按钮checkbox的选中效果对勾就需要图片…

【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士&#xff0c;他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后&#xff0c;他决定逃回自己的家乡奥格瑞玛 题目背景【题目描述&#xff1a;】 在艾泽拉斯&#xff0c;有n个城市。编号为1…

训练残骸模式– Java 8中的改进实现

Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容&#xff0c;如下所示&#xff1a; >someObject.method1().method2().method3().finalResult()很少有人会将此与构建器模式相关联&#xff0c;但事实并非如此。 无论如何&#xff0c;让…

px、em、pt之间的区别与互相转换

关于px、pt和em的区别&#xff0c;自己有时候也会纠结到底该用什么单位&#xff0c;今天特意查了一些文章&#xff0c;下面这篇虽然很久远了&#xff0c;但解释的比较全面&#xff0c;转载收藏之。点击查看原文&#xff08;原网址已失效&#xff0c;这是其他站点&#xff09; …

3.Apache ZooKeeper数据模型

1. ZooKeeper自下向上的服务视图 Apache ZooKeeper是分布式应用程序的协调服务。 它旨在解决分布式应用程序中与组件协调相关的棘手问题。 它通过暴露一个简单而强大的接口来实现这一点。 应用程序可以设计在通过ZooKeeper API实现的这些接口上&#xff0c;以解决分布式同步&am…

STS插件_ springsource-tool-suite插件各个历史版本

目前spring官网(http://spring.io/tools/sts/all)上可下载的spring插件只有&#xff1a;springsource-tool-suite-3.8.4(sts-3.8.4)。但这只针对指定的eclipse版本适用。 原贴更精彩&#xff1a;http://blog.csdn.net/u010203767/article/details/69211072 sts-3.8.3的下载地址…

idea运行项目时报Error:java无效的源发行版:1.8

如果你安装的是JDK1.7&#xff0c;而在file->project structure中设置的是language level是8的话&#xff0c;就会出现这个错误提示&#xff1a;无效的源发行版&#xff1a;8。 解决办法&#xff1a;将语言级别改为7&#xff0c;或6。即语言级别不能高于你安装的版本。 另外…

JUnit:在参数化测试中命名单个测试用例

几年前&#xff0c;我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例&#xff0c;因此&#xff0c;如果它们失败&#xff0c;您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&#xff1a; 但是&#…

如何在 React Native 中写一个自定义模块

前言 在 React Native 项目中可以看到 node_modules 文件夹&#xff0c;这是存放 node 模块的地方&#xff0c;Node.js 的包管理器 npm 是全球最大的开源库生态系统。提到npm&#xff0c;一般指两层含义&#xff1a;一是 Node.js 开放式模块登记和管理系统&#xff0c;另一种是…

gulp webpack整合

为什么需要前端工程化&#xff1f; 前端工程化的意义在于让前端这个行业由野蛮时代进化为正规军时代&#xff0c;近年来很多相关的工具和概念诞生。好奇心日报在进行前端工程化的过程中&#xff0c;主要的挑战在于解决如下问题&#xff1a;✦ 如何管理多个项目的前端代码&…

SpringBoot 入门第一章

一、前言 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 本系列以快速入门为主&#xff0c;可当作工具小手册阅…

【转】 VC++6.0 在Win7 64位下调试,Shift+F5无法退出

Win7 64位VC6.0调试代码无法关闭窗口解决方法  VC6.0 在64位Windows7下调试的时候&#xff0c;再结束调试&#xff0c;程序无法退出&#xff0c;只能关闭VC6.0 IDE环境。  问题描述&#xff1a;当我击F5开始一个项目的调试时&#xff0c;程序在我设置的断点处停止&#xff…

使用Infinispan创建自己的Drools和jBPM持久性

我 在这里发表的原始文章&#xff1a; 您好&#xff0c;欢迎来到我打算向您展示如何创建自己的Drools和jBPM持久性实现的帖子。 我已经为流口水对象开发了基于infinispan的持久性方案&#xff0c;并且在此过程中学到了很多东西。 如果您想做某种事情&#xff0c;我打算给您一些…

Html5 填表 表单(二) input type 各种输入, 各种用户选择,上传等等泛输入用户交互

<input> 无限制输入 type 限制输入 type 如下类型 type 后还可以跟一些属性: 如<input typetext maxlength 10> 限制文本的长度为10字节 list 可以用的时候再来查, list就是当一个建议值不够的时候添加到几个. <form> <input typ…