原文链接:https://github.com/zouhc/MyHadoop/blob/master/doc/Hadoop%E7%9A%84kerberos%E7%9A%84%E5%AE%9E%E8%B7%B5%E9%83%A8%E7%BD%B2.md
本文重点描述实际操作和实践部分。理论部分和介绍将一笔带过。测试结果:在CM下的kerberos,遇到严重的bug不能顺畅跑通。在自己的Hadoop下,能够顺利跑通。
Hadoop的认证机制
详细介绍请参考Hadoop安全机制研究
hadoop-kerberos介绍
简单来说,没有做kerberos认证的Hadoop,只要有client端就能够连接上。而且,通过一个有root的权限的内网机器,通过创建对应的linux用户,就能够得到Hadoop集群上对应的权限。
而实行Kerberos后,任意机器的任意用户都必须现在Kerberos的KDC中有记录,才允许和集群中其它的模块进行通信。
Java的安全机制
详细介绍请参考JAAS:灵活的Java安全机制
简单来说,用户首先使用LoginContext的接口进行登录验证。LoginContext可以配置使用不同的验证协议。验证通过后,用户得到一个subject,里面包含凭证,公私钥等。之后,在涉及到需要进行权限认证的地方(例如,资源访问,外部链接校验,协议访问等),使用doAs函数()代替直接执行。
这样,java的权限认证就和用户的业务逻辑分离了。
//一段典型的代码如下
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
Kerberos认证协议
Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。
简单介绍
使用Kerberos时,一个客户端需要经过三个步骤来获取服务:
认证:客户端向认证服务器发送一条报文,并获取一个含时间戳的Ticket-Granting Ticket(TGT)。
授权:客户端使用TGT向Ticket-Granting Server(TGS)请求一个服务Ticket。
服务请求:客户端向服务器出示服务Ticket,以证实自己的合法性。该服务器提供客户端所需服务,在Hadoop应用中,服务器可以是namenode或jobtracker。
为此,Kerberos需要The Key Distribution Centers(KDC)来进行认证。KDC只有一个Master,可以带多个slaves机器。slaves机器仅进行普通验证。Mater上做的修改需要自动同步到slaves。
另外,KDC需要一个admin,来进行日常的管理操作。这个admin可以通过远程或者本地方式登录。
搭建Kerberos
环境:假设我们有5个机器,分别是hadoop1~hadoop5。选择hadoop1,hadoop2,hadoop3组成分布式的KDC。hadoop1作为Master机器。
1.安装:通过yum安装即可,组成KDC。
yum install -y krb5-server krb5-lib krb5-workstation
2.配置:Kerberos的配置文件只有两个。在Hadoop1中创建以下两个文件,并同步/etc/krb5.conf到所有机器。
/var/kerberos/krb5kdc/kdc.conf:包括KDC的配置信息。默认放在 /usr/local/var/krb5kdc。或者通过覆盖KRB5_KDC_PROFILE环境变量修改配置文件位置。
配置示例:
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = {
master_key_type = aes128-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_renewable_life = 7d
supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
说明:
HADOOP.COM:是设定的realms。名字随意。Kerberos可以支持多个realms,会增加复杂度。本文不探讨。大小写敏感,一般为了识别使用全部大写。这个realms跟机器的host没有大关系。
max_renewable_life = 7d 涉及到是否能进行ticket的renwe必须配置。
master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包。推荐不使用。
acl_file:标注了admin的用户权限,需要用户自己创建。文件格式是
Kerberos_principal permissions [target_principal] [restrictions]
支持通配符等。最简单的写法是
*/[email protected] *
代表名称匹配*/[email protected] 都认为是admin,权限是 *。代表全部权限。
admin_keytab:KDC进行校验的keytab。后文会提及如何创建。
supported_enctypes:支持的校验方式。注意把aes256-cts去掉。
/etc/krb5.conf:包含Kerberos的配置信息。例如,KDC的位置,Kerberos的admin的realms 等。需要所有使用的Kerberos的机器上的配置文件都同步。这里仅列举需要的基本配置。详细介绍参考:krb5conf
配置示例:
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = HADOOP.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
max_life = 12h 0m 0s
forwardable = true
udp_preference_limit = 1
[realms]
HADOOP.COM = {
kdc = hadoop1:88
admin_server = hadoop1:749
default_domain = HADOOP.COM
}
[appdefaults]
说明:
[logging]:表示server端的日志的打印位置
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
default_realm = HADOOP.COM 默认的realm,必须跟要配置的realm的名称一致。
udp_preference_limit = 1 禁止使用udp可以防止一个Hadoop中的错误
[realms]:列举使用的realm。
kdc:代表要kdc的位置。格式是 机器:端口
admin_server:代表admin的位置。格式是 机器:端口
default_domain:代表默认的域名
[appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。
初始化并启动:完成上面两个配置文件后,就可以进行初始化并启动了。
A.初始化数据库:在hadoop1上运行命令。其中-r指定对应realm。
kdb5_util create -r HADOOP.COM -s
如果遇到数据库已经存在的提示,可以把/var/kerberos/krb5kdc/目录下的principal的相关文件都删除掉。默认的数据库名字都是principal。可以使用-d指定数据库名字。(尚未测试多数据库的情况)。
B.启动kerberos。如果想开机自启动,需要stash文件。
/usr/local/sbin/krb5kdc
/usr/local/sbin/kadmind
至此kerberos,搭建完毕。
搭建Slave KDCs
为了在生产环境中获得高可用的KDC。还需要搭建Slave KDCs。 TODO 经过各种努力还是不能成功同步,先放下。
测试kerberos,搭建完毕后,进行以下步骤测试Kerberos是否可用。
A. 进入kadmin在kadmin上添加一个超级管理员账户,需要输入passwd
kadmin.local
addprinc admin/admin
B. 在其它机器尝试通过kadmin连接,需要输入密码
kinit admin/admin
kadmin
如果能成功进入,则搭建成功。
kerberos日常操作
管理员操作
登录到管理员账户: 如果在本机上,可以通过kadmin.local直接登录。其它机器的,先使用kinit进行验证。
kadmin.local
kinit admin/admin
kadmin
增删改查账户:在管理员的状态下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令。
kamdin:addprinc -randkey hdfs/hadoop1
kamdin:delprinc hdfs/hadoop1
kamdin:listprincs命令
生成keytab:使用xst命令或者ktadd命令
kadmin:xst -k /xxx/xxx/kerberos.keytab hdfs/hadoop1
用户操作
查看当前的认证用户:klist
认证用户:kinit -kt /xx/xx/kerberos.keytab hdfs/hadoop1
删除当前的认证的缓存: kdestroy
在CM上使用Kerberos认证
在CM上使用Kerberos认证,它会帮我们创建所有的需要的Kerberos账户,并且在启动的时候自动生成keytab存放到对应的启动目录,在配置文件中添加对应的keytab文件配置和用户名。
所以,只需要给CM创建一个拥有管理员权限的账户。CM就能够完成大部分的初始化工作。
初始化部署
为CM添加一个账户,并生成keytab文件
kadmin kadmin:addprinc -randkey cloudera-scm/[email protected] kadmin:xst -k cmf.keytab cloudera-scm/[email protected]
将上文产生的keytab文件移到cloudera-scm的配置目录,添加cmf.principal文件并写入账户的名称,最后修改文件权限。
mv cmf.keytab /etc/cloudera-scm-server/
echo "cloudera-scm/[email protected] " >> /etc/cloudera-scm-server/cmf.principal
chown cloudera-scm:cloudera-scm cmf.keytab
chmod 600 cmf.keytab
chown cloudera-scm:cloudera-scm cmf.principal
chmod 600 cmf.principal
默认配置目录在/etc/cloudera-scm-server/,但是我们修改为/home/cloudera-manager/cm-4.6.3/etc/cloudera-scm-server/
设置CM的default Realm :在界面上顶部的Administrator-setting-security-Kerberos Security Realm 填入 HADOOP.COM
针对所有服务开启security选项
Zookeeper:
勾选 Zookeeper Service > Configuration > Enable Zookeeper Security
HDFS:
勾选 HDFS Service > Configuration > Authentication
勾选 HDFS Service > Configuration > Authorization
修改Datanode Transceiver Port 到1004
修改Datanode HTTP Web UI Port 到1006
HBASE:
勾选HBase Service > Configuration > Authentication
- 勾选HBase Service > Configuration > Authorization
启动即可
重大的bug: 当我在测试机上成功跑通之后,重新删除了kerberos的数据库后。关闭掉所有服务的安全选项。重新启动后,Generate Credentials不能成功创建账户。而且也连接不到已经存在的账户的内容。第二天回来,发现创建了少量的账户YARN和mapred的账户。但是其它的账户都没有。猜测:可能是因为增加了两个账户分别是 krbtgt/[email protected] krbtgt/[email protected] 根据数据库的结构分析,怀疑cloudera manager把keytab都保存了。所以,不再重新产生keytab。 keytab不能重新生成是一个大问题。
非CM下的keytab配置
检查:如果JAVA的版本在1.6.21或以前的,会遇到客户端需要renew ticket,才能通过认证。而renwe ticket必须保证kdc的配置文件包含max_renewable_life = 7d项。
创建账户
创建所有账户,生成keytab(我们使用hadoop账户启动所有的服务,所以,只生成hadoop和HTTP账户就足够了)
kadmin:addprinc -randkey hadoop/[email protected]
...
kadmin:addprinc -randkey hadoop/[email protected]
kadmin:addprinc -randkey HTTP/[email protected]
...
kadmin:addprinc -randkey HTTP/[email protected]
kadmin:xst -k /xxx/hadoop.keytab hadoop/hadoop1 HTTP/hadoop1
...
kadmin:xst -k /xxx/hadoop.keytab hadoop/hadoop5 HTTP/hadoop5
说明:一共添加了10个账户分别是hadoop的hadoop1到hadoop5的账户和HTTP的hadoop1到hadoop5的账户。导出账户的时候,把hadoop1机器的hadoop账户和HTTP账户导入到同一个keytab文件中。
在标准的情况中,依据不同服务的启动者的不同,会创建不同的账户,导出不同的keytab文件。由于我们使用的是hadoop用户启动所有服务的状况,所以一个hadoop.keytab就足够使用了。如果像ClouderaManager那样的一个用户启动一种服务,就要创建不同的用户,导出不同的keytab。例如:hadoop1的zookeeper配置文件中需要zookeeper.keytab,当中含有zookeeper/hadoop1这个账户
下文提到的配置文件中添加keytab文件,都要求不同机器含有对应的机器名和启动用户的keytab文件。要测试这个机器的keytab文件是否可用,可使用以下命令进行测试:
kinit -kt /xx/xx/hadoop.keytab hadoop/hadoop1
klist
为ZK添加认证
修改zoo.cfg添加配置
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
在配置目录中添加对应账户的keytab文件且创建jaas.conf配置文件,内容如下:
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/XX/XX/hadoop.keytab"
storeKey=true
useTicketCache=true
principal="hadoop/[email protected] ";
};
其中keytab填写真实的keytab的绝对路径,principal填写对应的认证的用户和机器名称。
在配置目录中添加java.env的配置文件,内容如下:
export JVMFLAGS="-Djava.security.auth.login.config=/xx/xx/jaas.conf"
每个zookeeper的机器都进行以上的修改
启动方式和平常无异,如成功使用安全方式启动,日志中看到如下日志:
2013-11-18 10:23:30,067 ... - successfully logged in.
为HDFS添加认证
增加基本配置包括各种的princal和keytab文件的配置(生成的hdfs的keytab和HTTP的keytab最好放一起,容易配置。下面的配置中keytab文件使用绝对路径,principal使用_HOST,Hadoop会自动替换为对应的域名。)。
启动:设置了Security后,NameNode,QJM,ZKFC可以通过start-dfs.sh启动。DataNode需要使用root权限启动。设置了HADOOP_SECURE_DN_USER的环境变量后,start-dfs.sh的启动脚本将会自动跳过DATANODE的启动。所以,整个启动过程分为以下两步:
启动NameNode,QJM,ZKFC
start-dfs.sh
说明:查看QJM的日志和ZKFC的日志。检查有无exception。QJM的报错不会有明显的提示。如果启动不成功检查以下几点是否做好:
QJM和NameNode对应的keytab文件是否包含hadoop账户和HTTP账户对应该机器的kerberos账户。
keytab使用绝对路径,可以避免一些问题。
疑惑:ZKFC中有日志,但是工作正常,大胆预测连接zookeeper不需要强制通过jaas验证。TODO:验证此猜想。
INFO org.apache.zookeeper.ClientCnxn: Opening socket connection to server hadoop3/10.1.74.46:59181. Will not attempt to authenticate using SASL (无法定位登录配置)
启动DataNode:
配置JSVC:DataNode需要JSVC启动。首先安装JSVC,然后配置的hadoop-env.sh的JSVC_HOME变量。JSVC运行还需要一个commons-daemon-xxx.jar包。从commons/daemon下载一个最新版本的jar包。当前,JSVC启动的时候遇到一个奇怪的bug,就是JSVC的classpath不支持*匹配。详细修改如下:
#添加commons-daemon的jar包,并替换路径为绝对路径
export CLASSPATH=$CLASSPATH:/xxx/commons-daemon-1.0.15.jar
temp=${CLASSPATH//':'/' '}
t=`echo $temp`
export CLASSPATH=${t//' '/':'}
mv问题:由于权限问题,在移动日志文件启动的时候,会询问是否覆盖只读的日志文件。这个会导致使用start-secure-dns.sh启动的时候不顺畅。推荐修改hadoop-daemon.sh的74行:
mv "$log" "$log.$num"; -->修改为--> mv -f "$log" "$log.$num";
启动:
切换到root用户,需要配置这个root用户免密码登陆到其它的机器。
#自动登陆并启动datanode
sh /home/xx/hadoop/sbin/start-secure-dns.sh
否则,需要单独登陆到所有机器启动datanode。
#如果单独登陆启动datanode
sh /home/xx/hadoop/sbin/hadoop-daemon.sh datanode start
测试:使用任意用户通过keytab文件进行认证,运行hdfs相关命令。
kinit -kt /xx/xx/qiujw/keytab qiujw/hadoopN
#对于java1.6_26以下版本的需要renew ticket
kinit -R
klist
hdfs dfs -ls /tmp
为YARN添加认证配置
添加配置
yarn.xml:
yarn.resourcemanager.keytab:/xx/xx/hadoop.keytab
yarn.resourcemanager.principal:hadoop/[email protected]
yarn.nodemanager.keytab:/xx/xx/hadoop.keytab
yarn.nodemanager.principal:hadoop/[email protected]
yarn.nodemanager.container-executor.class:org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor
yarn.nodemanager.linux-container-executor.group:hadoop
mapred.xml:
mapreduce.jobhistory.keytab:/xx/xx/hadoop.keytab
>mapreduce.jobhistory.principal:hadoop/[email protected]
修改container-executor.conf.dir,重新编译container-executor:
cp ~/hadoop/src
mvn package -Pdist,native -DskipTests -Dtar -Dcontainer-executor.conf.dir=/etc
cp ./hadoop-yarn-project/target/hadoop-yarn-project-2.0.0-cdh4.2.1/bin/container-executor ~/hadoop/bin
#以下命令查看编译是否成功
strings ~/hadoop/bin/container-executor|grep etc
#修改权限
sudo chown root:hadoop /xx/hadoop/bin/container-executor
sudo chmod 4750 /xx/hadoop/bin/container-executor
说明:为什么要编译container-executor?
答:因为container-executor要求container-executor.cfg这个文件及其所有父目录都属于root用户,且权限小于755。配置文件container-executor.cfg默认的路径在../etc/hadoop/container-executor.cfg。如果,按照默认的路径修改所有父目录都属于root,显然不现实。于是,把路径编译到/etc/container-executor.cfg中。
创建/etc/container-executor.cfg文件,文件内容如下:
#运行container的用户
yarn.nodemanager.linux-container-executor.group=hadoop
#这个是允许运行应用的用户列表,默认是全部可以运行
#banned.users=
#这个是允许提交job的最小的userid的值。centos中一般用户的id在500以上。
min.user.id=500
修改/etc/container-executor.cfg的权限
sudo chown root:root /etc/container-executor.cfg
sudo chmod 600 /etc/container-executor.cfg
启动,使用hadoop用户直接启动即可
start-yarn.sh
检查Nodemanager和Resourcemanager的日志是否有异常。
一般异常都是因为container-executor.cfg的权限和container-executor的权限问题。请仔细核对:
[hadoop@hadoop2 hadoop]$ ls ~/hadoop/bin/container-executor -l
-rwsr-x--- 1 root hadoop 89206 Nov 18 16:18 /home/hadoop/hadoop/bin/container-executor [hadoop@hadoop2 hadoop]$ ls /etc/container-executor.cfg -l -rw------- 1 root root 240 Nov 18 16:31 /etc/container-executor.cfg
测试:使用任意用户通过keytab文件进行认证,运行yarn相关命令。
kinit -kt /xx/xx/qiujw/keytab qiujw/hadoopN
#对于java1.6_26以下版本的需要renew ticket
kinit -R
klist
yarn jar /xx/xx/hadoop-mapreduce-examples-xx.jar pi 10 100
为hbase添加认证
添加配置:
hbase-site.xml:以下添加到client和server端
hbase.security.authentication:kerberos
hbase.rpc.engine: org.apache.hadoop.hbase.ipc.SecureRpcEngine
hbase-site.xml:以下添加到server端
hbase.regionserver.kerberos.principal:hadoop/[email protected]
hbase.regionserver.keytab.file: /xx/xx/hadoop.keytab
hbase.master.kerberos.principal: hadoop/[email protected]
hbase.master.keytab.file: /xx/xx/hadoop.keytab
添加hbase连接secure的zookeeper:
创建zk-jaas.conf配置文件,内容如下:
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=false
keyTab="/xx/hadoop.keytab"
principal="hadoop/[email protected] ";
};
修改hbase-env.sh:
export HBASE_OPTS="$HBASE_OPTS -Djava.security.auth.login.config=/xx/zk-jaas.conf"
export HBASE_MANAGES_ZK=false
确保以下配置项是正确的:
hbase-site.xml:
hbase.zookeeper.quorum: hadoopN,...,hadoopN
hbase.cluster.distributed: true
添加以下项目到zoo.cfg中:
kerberos.removeHostFromPrincipal: true
kerberos.removeRealmFromPrincipal: true
启动:如往常启动即可
start-hbase.sh
TroubleShooting
笔者在启动hbase后,在zookeeper的日志中大量发现这种信息:
Client failed to SASL authenticate: javax.security.sas l.SaslException: GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level (Mechanism level: Specified version of key is not available (44 ))]
在多次调整无果后,怀疑是因为我的一些老旧的账户的renewmax属性还是0.于是,把所有相关账户都删除,生成后,再次启动。这个错误就消失了。
Hbase的权限控制
启动hbase的用户是超级用户拥有所有的权限。
hbase支持4个权限
R :读权限 Get, Scan, or Exists calls
W :写权限 Put, Delete, LockRow, UnlockRow, IncrementColumnValue, CheckAndDelete, CheckAndPut, Flush, or Compact
C :创建权限 Create, Alter, or Drop
A :管理员权限 Enable, Disable, MajorCompact, Grant, Revoke, and Shutdown.
权限控制语句:
grant [ [ [ ] ] ]
revoke [ [ [ ]]]
alter {OWNER => } # sets the table owner
user_permission # displays existing permissions
创建表的用户拥有该表的所有权限
如果赋予权限的时候没有针对某个表或者CF进行赋予,就会对全局获得权限。请小心。
Hive的权限
Hive的客户端的权限和普通的客户端的一致就可以了。
客户端配置
使用者要和实行了kerberos的集群进行通信。要kerberos的管理员创建对应的账户。并且生成keytab返回给使用者,使用者通过kinit命令认证后,就跟平常使用Hadoop的方式一致地使用即可。以下是一个例子:
kadmin:addprinc qiujw/hadoop1
kadmin:xst -k qiujw.keytab qiujw/hadoop1
#将qiujw.keytab交给用户
#在hadoop1机器上
kinit -kt qiujw.keytab qiujw/hadoop1
klist
Ticket cache: FILE:/tmp/krb5cc_512
Default principal: qiujw/[email protected]
Valid starting Expires Service principal
11/19/13 10:53:54 11/20/13 10:53:54 krbtgt/[email protected]
renew until 11/26/13 10:44:10
说明:Expires下面的是这个认证的过期的日志。renew until后面的是续约期。
意思是,如果这个缓存过了认证的过期时间,就会失效。在续约期期间通过使用kinit -R可以续约这个认证。但是,过了续约期。必须要使用keytab重新认证。
Hadoop等的服务中,都会使用keytab自动做续约不会存在过期的情况。如果客户端需要长久运行不过期,需要在程序中使用keytab做认证。
协议控制
Hadoop的框架中支持针对不同的协议开启权限控制。不再本次探究范围内。服务协议控制
你可能感兴趣的:(cloudera,mamager,hadoop)
浅谈MapReduce
Android路上的人
Hadoop 分布式计算 mapreduce 分布式 框架 hadoop
从今天开始,本人将会开始对另一项技术的学习,就是当下炙手可热的Hadoop分布式就算技术。目前国内外的诸多公司因为业务发展的需要,都纷纷用了此平台。国内的比如BAT啦,国外的在这方面走的更加的前面,就不一一列举了。但是Hadoop作为Apache的一个开源项目,在下面有非常多的子项目,比如HDFS,HBase,Hive,Pig,等等,要先彻底学习整个Hadoop,仅仅凭借一个的力量,是远远不够的。
Hadoop
傲雪凌霜,松柏长青
后端 大数据 hadoop 大数据 分布式
ApacheHadoop是一个开源的分布式计算框架,主要用于处理海量数据集。它具有高度的可扩展性、容错性和高效的分布式存储与计算能力。Hadoop核心由四个主要模块组成,分别是HDFS(分布式文件系统)、MapReduce(分布式计算框架)、YARN(资源管理)和HadoopCommon(公共工具和库)。1.HDFS(HadoopDistributedFileSystem)HDFS是Hadoop生
Hadoop架构
henan程序媛
hadoop 大数据 分布式
一、案列分析1.1案例概述现在已经进入了大数据(BigData)时代,数以万计用户的互联网服务时时刻刻都在产生大量的交互,要处理的数据量实在是太大了,以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS顺应时代出现,在解决大数据存储和计算方面有很多的优势。1.2案列前置知识点1.什么是大数据大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的大量数据集合,
分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)
计算机源码社
Python项目 大数据 大数据 python hadoop 计算机毕业设计选题 计算机毕业设计源码 数据分析 spark毕设
作者:计算机源码社个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!学习资料、程序开发、技术解答、文档报告如需要源码,可以扫取文章下方二维码联系咨询Java项目微信小程序项目Android项目Python项目PHP项目ASP.NET项目Node.js项目选题推荐项目实战|p
hbase介绍
CrazyL-
云计算+大数据 hbase
hbase是一个分布式的、多版本的、面向列的开源数据库hbase利用hadoophdfs作为其文件存储系统,提供高可靠性、高性能、列存储、可伸缩、实时读写、适用于非结构化数据存储的数据库系统hbase利用hadoopmapreduce来处理hbase、中的海量数据hbase利用zookeeper作为分布式系统服务特点:数据量大:一个表可以有上亿行,上百万列(列多时,插入变慢)面向列:面向列(族)的
大数据毕业设计hadoop+spark+hive知识图谱租房数据分析可视化大屏 租房推荐系统 58同城租房爬虫 房源推荐系统 房价预测系统 计算机毕业设计 机器学习 深度学习 人工智能
2401_84572577
程序员 大数据 hadoop 人工智能
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。(1)Python所有方向的学习路线(
Spark集群的三种模式
MelodyYN
# Spark spark hadoop big data
文章目录1、Spark的由来1.1Hadoop的发展1.2MapReduce与Spark对比2、Spark内置模块3、Spark运行模式3.1Standalone模式部署配置历史服务器配置高可用运行模式3.2Yarn模式安装部署配置历史服务器运行模式4、WordCount案例1、Spark的由来定义:Hadoop主要解决,海量数据的存储和海量数据的分析计算。Spark是一种基于内存的快速、通用、可
月度总结 | 2022年03月 | 考研与就业的抉择 | 确定未来走大数据开发路线
「已注销」
个人总结 hadoop
一、时间线梳理3月3日,寻找到同专业的就业伙伴3月5日,着手准备Java八股文,决定先走Java后端路线3月8月,申请到了校图书馆的考研专座,决定暂时放弃就业,先准备考研,买了数学和408的资料书3月9日-3月13日,因疫情原因,宿舍区暂封,这段时间在准备考研,发现内容特别多3月13日-3月19日,大部分时间在刷Hadoop、Zookeeper、Kafka的视频,同时在准备实习的项目3月20日,退
HBase介绍
mingyu1016
数据库
概述HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是GoogleBigtable的开源实现,它利用HadoopHDFS作为其文件存储系统,利用HadoopMapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。HBase的表结构HBase以表的形式存储数据。表有行和列组成。列划分为
Java中的大数据处理框架对比分析
省赚客app开发者
java 开发语言
Java中的大数据处理框架对比分析大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入探讨Java中常用的大数据处理框架,并对它们进行对比分析。大数据处理框架是现代数据驱动应用的核心,它们帮助企业处理和分析海量数据,以提取有价值的信息。本文将重点介绍ApacheHadoop、ApacheSpark、ApacheFlink和ApacheStorm这四种流行的
Hadoop windows intelij 跑 MR WordCount
piziyang12138
一、软件环境我使用的软件版本如下:IntellijIdea2017.1Maven3.3.9Hadoop分布式环境二、创建maven工程打开Idea,file->new->Project,左侧面板选择maven工程。(如果只跑MapReduce创建java工程即可,不用勾选Creatfromarchetype,如果想创建web工程或者使用骨架可以勾选)image.png设置GroupId和Artif
Hadoop学习第三课(HDFS架构--读、写流程)
小小程序员呀~
数据库 hadoop 架构 big data
1.块概念举例1:一桶水1000ml,瓶子的规格100ml=>需要10个瓶子装完一桶水1010ml,瓶子的规格100ml=>需要11个瓶子装完一桶水1010ml,瓶子的规格200ml=>需要6个瓶子装完块的大小规格,只要是需要存储,哪怕一点点,也是要占用一个块的块大小的参数:dfs.blocksize官方默认的大小为128M官网:https://hadoop.apache.org/docs/r3.
hadoop启动HDFS命令
m0_67401228
java 搜索引擎 linux 后端
启动命令:/hadoop/sbin/start-dfs.sh停止命令:/hadoop/sbin/stop-dfs.sh
【计算机毕设-大数据方向】基于Hadoop的电商交易数据分析可视化系统的设计与实现
程序员-石头山
大数据实战案例 大数据 hadoop 毕业设计 毕设
博主介绍:✌全平台粉丝5W+,高级大厂开发程序员,博客之星、掘金/知乎/华为云/阿里云等平台优质作者。【源码获取】关注并且私信我【联系方式】最下边感兴趣的可以先收藏起来,同学门有不懂的毕设选题,项目以及论文编写等相关问题都可以和学长沟通,希望帮助更多同学解决问题前言随着电子商务行业的迅猛发展,电商平台积累了海量的数据资源,这些数据不仅包括用户的基本信息、购物记录,还包括用户的浏览行为、评价反馈等多
分布式离线计算—Spark—基础介绍
测试开发abbey
人工智能—大数据
原文作者:饥渴的小苹果原文地址:【Spark】Spark基础教程目录Spark特点Spark相对于Hadoop的优势Spark生态系统Spark基本概念Spark结构设计Spark各种概念之间的关系Executor的优点Spark运行基本流程Spark运行架构的特点Spark的部署模式Spark三种部署方式Hadoop和Spark的统一部署摘要:Spark是基于内存计算的大数据并行计算框架Spar
spark常用命令
我是浣熊的微笑
spark
查看报错日志:yarnlogsapplicationIDspark2-submit--masteryarn--classcom.hik.ReadHdfstest-1.0-SNAPSHOT.jar进入$SPARK_HOME目录,输入bin/spark-submit--help可以得到该命令的使用帮助。hadoop@wyy:/app/hadoop/spark100$bin/spark-submit--
spark启动命令
学不会又听不懂
spark 大数据 分布式
hadoop启动:cd/root/toolssstart-dfs.sh,只需在hadoop01上启动stop-dfs.sh日志查看:cat/root/toolss/hadoop/logs/hadoop-root-datanode-hadoop03.outzookeeper启动:cd/root/toolss/zookeeperbin/zkServer.shstart,三台都要启动bin/zkServ
编程常用命令总结
Yellow0523
Linux BigData 大数据
编程命令大全1.软件环境变量的配置JavaScalaSparkHadoopHive2.大数据软件常用命令Spark基本命令Spark-SQL命令Hive命令HDFS命令YARN命令Zookeeper命令kafka命令Hibench命令MySQL命令3.Linux常用命令Git命令conda命令pip命令查看Linux系统的详细信息查看Linux系统架构(X86还是ARM,两种方法都可)端口号命令L
Hadoop常见面试题整理及解答
叶青舟
Linux hdfs 大数据 hadoop linux
Hadoop常见面试题整理及解答一、基础知识篇:1.把数据仓库从传统关系型数据库转到hadoop有什么优势?答:(1)关系型数据库成本高,且存储空间有限。而Hadoop使用较为廉价的机器存储数据,且Hadoop可以将大量机器构建成一个集群,并在集群中使用HDFS文件系统统一管理数据,极大的提高了数据的存储及处理能力。(2)关系型数据库仅支持标准结构化数据格式,Hadoop不仅支持标准结构化数据格式
2025毕业设计指南:如何用Hadoop构建超市进货推荐系统?大数据分析助力精准采购
计算机编程指导师
Java实战集 Python实战集 大数据实战集 课程设计 hadoop 数据分析 spring boot java 进货 python
✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程序/安卓实战项目大数据实战项目⚡⚡文末获取源码文章目录⚡⚡文末获取源码基于hadoop的超市进货推荐系
Hadoop Common 之序列化机制小解
猫君之上
# Apache Hadoop
1.JavaSerializable序列化该序列化通过ObjectInputStream的readObject实现序列化,ObjectOutputStream的writeObject实现反序列化。这不过此种序列化虽然跨病态兼容性强,但是因为存储过多的信息,但是传输效率比较低,所以hadoop弃用它。(序列化信息包括这个对象的类,类签名,类的所有静态,费静态成员的值,以及他们父类都要被写入)publ
深入理解hadoop(一)----Common的实现----Configuration
maoxiao_jsd
深入理解----hadoop
属本人个人原创,转载请注明,希望对大家有帮助!!一,hadoop的配置管理a,hadoop通过独有的Configuration处理配置信息Configurationconf=newConfiguration();conf.addResource("core-default.xml");conf.addResource("core-site.xml");后者会覆盖前者中未final标记的相同配置项b
hadoop 0.22.0 部署笔记
weixin_33701564
大数据 java 运维
为什么80%的码农都做不了架构师?>>>因为需要使用hbase,所以开始对hbase进行学习。hbase是部署在hadoop平台上的NOSql数据库,因此在部署hbase之前需要先部署hadoop。环境:redhat5、hadoop-0.22.0.tar.gz、jdk-6u13-linux-i586.zipip192.168.1.128hostname:localhost.localdomain(
解决Windows环境下hadoop集群的运行_window运行hadoop,unknown hadoop01(4)
2401_84160087
大数据 面试 学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!org.apache.hadoophadoop-com
解决Windows环境下hadoop集群的运行_window运行hadoop,unknown hadoop01(3)
2401_84160087
大数据 面试 学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!xmlns:xsi="http://www.w3.or
深入解析HDFS:定义、架构、原理、应用场景及常用命令
CloudJourney
hdfs 架构 hadoop
引言Hadoop分布式文件系统(HDFS,HadoopDistributedFileSystem)是Hadoop框架的核心组件之一,它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用命令等多个方面进行详细探讨,帮助读者全面深入地了解HDFS。1.HDFS的定义1.1什么是HDFSHDFS是Hadoop生态系统中的一个分布式文件系
Hadoop的搭建流程
lzhlizihang
hadoop 大数据 分布式
文章目录一、配置IP二、配置主机名三、配置主机映射四、关闭防火墙五、配置免密六、安装jdk1、第一步:2、第二步:3、第三步:4、第四步:5、第五步:七、安装hadoop1、上传2、解压3、重命名4、开始配置环境变量5、刷新配置文件6、验证hadoop命令是否可以识别八、全分布搭建7、修改配置文件core-site.xml8、修改配置文件hdfs-site.xml9、修改配置文件hadoop-en
hive搭建 -----内嵌模式和本地模式
lzhlizihang
hive hadoop
文章目录一、内嵌模式(使用较少)1、上传、解压、重命名2、配置环境变量3、配置conf下的hive-env.sh4、修改conf下的hive-site.xml5、启动hadoop集群6、给hdfs创建文件夹7、修改hive-site.xml中的非法字符8、初始化元数据9、测试是否成功10、内嵌模式的缺点二、本地模式(最常用)1、检查mysql是否正常2、上传、解压、重命名3、配置环境变量4、修改c
Hadoop之mapreduce -- WrodCount案例以及各种概念
lzhlizihang
hadoop mapreduce 大数据
文章目录一、MapReduce的优缺点二、MapReduce案例--WordCount1、导包2、Mapper方法3、Partitioner方法(自定义分区器)4、reducer方法5、driver(main方法)6、Writable(手机流量统计案例的实体类)三、关于片和块1、什么是片,什么是块?2、mapreduce启动多少个MapTask任务?四、MapReduce的原理五、Shuffle过
IAAS: IT公司去IOE-Alibaba系统构架解读
wishchin
心理学/职业 BigDataMini Spark PaaS
从Hadoop到自主研发,技术解读阿里去IOE后的系统架构原地址:......................云计算阿里飞天摘要:从IOE时代,到Hadoop与飞天并行,再到飞天单集群5000节点的实现,阿里一直摸索在技术衍变的前沿。这里,我们将从架构、性能、运维等多个方面深入了解阿里基础设施。【导读】互联网的普及,智能终端的增加,大数据时代悄然而至。在这个数据为王的时代,数十倍、数百倍的数据给各
java类加载顺序
3213213333332132
java
package com.demo;
/**
* @Description 类加载顺序
* @author FuJianyong
* 2015-2-6上午11:21:37
*/
public class ClassLoaderSequence {
String s1 = "成员属性";
static String s2 = "
Hibernate与mybitas的比较
BlueSkator
sql Hibernate 框架 ibatis orm
第一章 Hibernate与MyBatis
Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。
MyBatis 参考资料官网:http:
php多维数组排序以及实际工作中的应用
dcj3sjt126com
PHP usort uasort
自定义排序函数返回false或负数意味着第一个参数应该排在第二个参数的前面, 正数或true反之, 0相等usort不保存键名uasort 键名会保存下来uksort 排序是对键名进行的
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8&q
DOM改变字体大小
周华华
前端
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&q
c3p0的配置
g21121
c3p0
c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0的下载地址是:http://sourceforge.net/projects/c3p0/这里可以下载到c3p0最新版本。
以在spring中配置dataSource为例:
<!-- spring加载资源文件 -->
<bean name="prope
Java获取工程路径的几种方法
510888780
java
第一种:
File f = new File(this.getClass().getResource("/").getPath());
System.out.println(f);
结果:
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin
获取当前类的所在工程路径;
如果不加“
在类Unix系统下实现SSH免密码登录服务器
Harry642
免密 ssh
1.客户机
(1)执行ssh-keygen -t rsa -C "
[email protected] "生成公钥,xxx为自定义大email地址
(2)执行scp ~/.ssh/id_rsa.pub root@xxxxxxxxx:/tmp将公钥拷贝到服务器上,xxx为服务器地址
(3)执行cat
Java新手入门的30个基本概念一
aijuans
java java 入门 新手
在我们学习Java的过程中,掌握其中的基本概念对我们的学习无论是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基础,所以有必要对其中的基本概念做以归纳,以便大家在以后的学习过程中更好的理解java的精髓,在此我总结了30条基本的概念。 Java概述: 目前Java主要应用于中间件的开发(middleware)---处理客户机于服务器之间的通信技术,早期的实践证明,Java不适合
Memcached for windows 简单介绍
antlove
java Web windows cache memcached
1. 安装memcached server
a. 下载memcached-1.2.6-win32-bin.zip
b. 解压缩,dos 窗口切换到 memcached.exe所在目录,运行memcached.exe -d install
c.启动memcached Server,直接在dos窗口键入 net start "memcached Server&quo
数据库对象的视图和索引
百合不是茶
索引 oeacle数据库 视图
视图
视图是从一个表或视图导出的表,也可以是从多个表或视图导出的表。视图是一个虚表,数据库不对视图所对应的数据进行实际存储,只存储视图的定义,对视图的数据进行操作时,只能将字段定义为视图,不能将具体的数据定义为视图
为什么oracle需要视图;
&
Mockito(一) --入门篇
bijian1013
持续集成 mockito 单元测试
Mockito是一个针对Java的mocking框架,它与EasyMock和jMock很相似,但是通过在执行后校验什么已经被调用,它消除了对期望 行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。
&nb
精通Oracle10编程SQL(5)SQL函数
bijian1013
oracle 数据库 plsql
/*
* SQL函数
*/
--数字函数
--ABS(n):返回数字n的绝对值
declare
v_abs number(6,2);
begin
v_abs:=abs(&no);
dbms_output.put_line('绝对值:'||v_abs);
end;
--ACOS(n):返回数字n的反余弦值,输入值的范围是-1~1,输出值的单位为弧度
【Log4j一】Log4j总体介绍
bit1129
log4j
Log4j组件:Logger、Appender、Layout
Log4j核心包含三个组件:logger、appender和layout。这三个组件协作提供日志功能:
日志的输出目标
日志的输出格式
日志的输出级别(是否抑制日志的输出)
logger继承特性
A logger is said to be an ancestor of anothe
Java IO笔记
白糖_
java
public static void main(String[] args) throws IOException {
//输入流
InputStream in = Test.class.getResourceAsStream("/test");
InputStreamReader isr = new InputStreamReader(in);
Bu
Docker 监控
ronin47
docker监控
目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路。 1、关于监控的内容 监控宿主机本身
监控宿主机本身还是比较简单的,同其他服务器监控类似,对cpu、network、io、disk等做通用的检查,这里不再细说。
额外的,因为是docker的
java-顺时针打印图形
bylijinnan
java
一个画图程序 要求打印出:
1.int i=5;
2.1 2 3 4 5
3.16 17 18 19 6
4.15 24 25 20 7
5.14 23 22 21 8
6.13 12 11 10 9
7.
8.int i=6
9.1 2 3 4 5 6
10.20 21 22 23 24 7
11.19
关于iReport汉化版强制使用英文的配置方法
Kai_Ge
iReport汉化 英文版
对于那些具有强迫症的工程师来说,软件汉化固然好用,但是汉化不完整却极为头疼,本方法针对iReport汉化不完整的情况,强制使用英文版,方法如下:
在 iReport 安装路径下的 etc/ireport.conf 里增加红色部分启动参数,即可变为英文版。
# ${HOME} will be replaced by user home directory accordin
[并行计算]论宇宙的可计算性
comsci
并行计算
现在我们知道,一个涡旋系统具有并行计算能力.按照自然运动理论,这个系统也同时具有存储能力,同时具备计算和存储能力的系统,在某种条件下一般都会产生意识......
那么,这种概念让我们推论出一个结论
&nb
用OpenGL实现无限循环的coverflow
dai_lm
android coverflow
网上找了很久,都是用Gallery实现的,效果不是很满意,结果发现这个用OpenGL实现的,稍微修改了一下源码,实现了无限循环功能
源码地址:
https://github.com/jackfengji/glcoverflow
public class CoverFlowOpenGL extends GLSurfaceView implements
GLSurfaceV
JAVA数据计算的几个解决方案1
datamachine
java Hibernate 计算
老大丢过来的软件跑了10天,摸到点门道,正好跟以前攒的私房有关联,整理存档。
-----------------------------华丽的分割线-------------------------------------
数据计算层是指介于数据存储和应用程序之间,负责计算数据存储层的数据,并将计算结果返回应用程序的层次。J
&nbs
简单的用户授权系统,利用给user表添加一个字段标识管理员的方式
dcj3sjt126com
yii
怎么创建一个简单的(非 RBAC)用户授权系统
通过查看论坛,我发现这是一个常见的问题,所以我决定写这篇文章。
本文只包括授权系统.假设你已经知道怎么创建身份验证系统(登录)。 数据库
首先在 user 表创建一个新的字段(integer 类型),字段名 'accessLevel',它定义了用户的访问权限 扩展 CWebUser 类
在配置文件(一般为 protecte
未选之路
dcj3sjt126com
诗
作者:罗伯特*费罗斯特
黄色的树林里分出两条路,
可惜我不能同时去涉足,
我在那路口久久伫立,
我向着一条路极目望去,
直到它消失在丛林深处.
但我却选了另外一条路,
它荒草萋萋,十分幽寂;
显得更诱人,更美丽,
虽然在这两条小路上,
都很少留下旅人的足迹.
那天清晨落叶满地,
两条路都未见脚印痕迹.
呵,留下一条路等改日再
Java处理15位身份证变18位
蕃薯耀
18位身份证变15位 15位身份证变18位 身份证转换
15位身份证变18位,18位身份证变15位
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 201
SpringMVC4零配置--应用上下文配置【AppConfig】
hanqunfeng
springmvc4
从spring3.0开始,Spring将JavaConfig整合到核心模块,普通的POJO只需要标注@Configuration注解,就可以成为spring配置类,并通过在方法上标注@Bean注解的方式注入bean。
Xml配置和Java类配置对比如下:
applicationContext-AppConfig.xml
<!-- 激活自动代理功能 参看:
Android中webview跟JAVASCRIPT中的交互
jackyrong
JavaScript html android 脚本
在android的应用程序中,可以直接调用webview中的javascript代码,而webview中的javascript代码,也可以去调用ANDROID应用程序(也就是JAVA部分的代码).下面举例说明之:
1 JAVASCRIPT脚本调用android程序
要在webview中,调用addJavascriptInterface(OBJ,int
8个最佳Web开发资源推荐
lampcy
编程 Web 程序员
Web开发对程序员来说是一项较为复杂的工作,程序员需要快速地满足用户需求。如今很多的在线资源可以给程序员提供帮助,比如指导手册、在线课程和一些参考资料,而且这些资源基本都是免费和适合初学者的。无论你是需要选择一门新的编程语言,或是了解最新的标准,还是需要从其他地方找到一些灵感,我们这里为你整理了一些很好的Web开发资源,帮助你更成功地进行Web开发。
这里列出10个最佳Web开发资源,它们都是受
架构师之面试------jdk的hashMap实现
nannan408
HashMap
1.前言。
如题。
2.详述。
(1)hashMap算法就是数组链表。数组存放的元素是键值对。jdk通过移位算法(其实也就是简单的加乘算法),如下代码来生成数组下标(生成后indexFor一下就成下标了)。
static int hash(int h)
{
h ^= (h >>> 20) ^ (h >>>
html禁止清除input文本输入缓存
Rainbow702
html 缓存 input 输入框 change
多数浏览器默认会缓存input的值,只有使用ctl+F5强制刷新的才可以清除缓存记录。
如果不想让浏览器缓存input的值,有2种方法:
方法一: 在不想使用缓存的input中添加 autocomplete="off";
<input type="text" autocomplete="off" n
POJO和JavaBean的区别和联系
tjmljw
POJO java beans
POJO 和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻译成:普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO,但是JavaBean则比 POJO复杂很多, Java Bean 是可复用的组件,对 Java Bean 并没有严格的规
java中单例的五种写法
liuxiaoling
java 单例
/**
* 单例模式的五种写法:
* 1、懒汉
* 2、恶汉
* 3、静态内部类
* 4、枚举
* 5、双重校验锁
*/
/**
* 五、 双重校验锁,在当前的内存模型中无效
*/
class LockSingleton
{
private volatile static LockSingleton singleton;
pri