原文链接: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)
org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool ID needed, but service not yet registere
@菜鸟进阶记@
hadoop hadoop
启动hadoop集群,发现datanode没有启动,查看日志报错,如图://日志文件2020-03-2416:40:55,608WARNorg.apache.hadoop.hdfs.server.common.Storage:Failedtoaddstoragedirectory[DISK]file:/opt/module/hadoop-2.8.4/data/tmp/dfs/data/java.i
Hadoop之HDFS的使用
想要变瘦的小码头
hadoop hdfs 大数据
HDFS是什么:HDFS是一个分布式的文件系统,是个网盘,HDFS是一种适合大文件存储的分布式文件系统HDFS的Shell操作1、查看hdfs根目录下的内容-lshdfsdfs-lshdfs://hadoop01:9000/url在使用时默认是可以省略的,因为hdfs在执行的时候会根据HDOOP_HOME自动识别配置文件中的fs.defaultFS属性可以写成:hdfsdfs-ls/还有一版旧版写
RHEL 安装 Hadoop 服务器
XhClojure
hadoop 服务器 大数据
在这篇文章中,我们将探讨如何在RedHatEnterpriseLinux(RHEL)上安装和配置Hadoop服务器。Hadoop是一个开源的分布式数据处理框架,用于处理大规模数据集。以下是在RHEL上安装Hadoop的详细步骤。步骤1:安装Java在安装Hadoop之前,我们需要确保系统上安装了JavaDevelopmentKit(JDK)。执行以下命令安装JDK:sudoyuminstallja
如何安装Hadoop
薇晶晶
hadoop 大数据 分布式
Hadoop入门(一)——CentOS7下载+VM上安装(手动分区)Hadoop入门(二)——VMware虚拟网络设置+Windows10的IP地址配置+CentOS静态IP设置Hadoop入门(三)——XSHELL7远程访问工具+XFTP7文件传输Hadoop入门(四)——模板虚拟机环境准备Hadoop入门(五)——Hadoop集群搭建-克隆三台虚拟机Hadoop入门(六)——JDK安装Hado
Hadoop01-入门&集群环境搭建--非原创(test)
xl.liu
大数据 Test
Hadoop01-入门&集群环境搭建今日内容Hadoop的介绍集群环境搭建准备工作Linux命令和Shell脚本增强集群环境搭建来来来大数据概述大数据:就是对海量数据进行分析处理,得到一些有价值的信息,然后帮助企业做出判断和决策.处理流程:1:获取数据2:处理数据3:展示结果1:Hadoop介绍Hadoop是一个分布式系基础框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理.它主
Hadoop管理工具dfsadmin和fsck的使用
脚本无敌
Hadoop hadoop npm 大数据
Hadoop提供了多个管理工具,其中dfsadmin和fsck是用于管理HDFS(Hadoop分布式文件系统)的重要工具。以下是它们的使用方法和常见命令。1.dfsadmin工具dfsadmin是用于管理HDFS集群的命令行工具,主要用于监控和管理HDFS的状态。常用命令查看HDFS状态hdfsdfsadmin-report显示HDFS集群的总体状态,包括数据节点(DataNode)的状态、存储容
(一)大数据---Hadoop整体介绍(架构层)----(组件(3)
2401_84166965
程序员 大数据 hadoop 架构
复杂性:体现在数据的管理和操作上。如何抽取,转换,加载,连接,关联以把握数据内蕴的有用信息已经变得越来越有挑战性二、大数据技术有哪些(重点)===================================================================================基础的技术包含数据的采集、数据预处理、分布式存储、NoSQL数据库、数据仓库、机器学习、并行计
hive全量迁移脚本
我要用代码向我喜欢的女孩表白
数据迁移 bigdata-大数据专栏 hive hadoop 数据仓库
#!/bin/bash#场景:数据在同一库下,并且hive是内部表(前缀的hdfs地址是相同的)#1.读取一个文件,获取表名#echo"时间$dt_jian_2-------------------------">>/home/hadoop/qianyi_zengliang/rs.txt#跟客户宽带有关,万兆(1.2g),然后咨询业务后,看监控高峰,大概可以用一般600mb/spinjie="ha
笔记:DataSphere Studio安装部署流程
右边com
Java 大数据
一、标准版部署标准版:有一定的安装难度,体现在Hadoop、Hive和Spark版本不同时,可能需要重新编译,可能会出现包冲突问题。适合于试用和生产使用,2~3小时即可部署起来。支持的功能有:数据开发IDE-Scriptis工作流实时执行信号功能和邮件功能数据可视化-Visualis数据质量-Qualitis(单机版)工作流定时调度-Azkaban(单机版)Linkis管理台二、基础环境准备2.1
hive-site.xml 配置总结
hxsln11
hive xml hadoop
在Hive安装后,hive主要的配置文件为conf中hive-site.xml那该文件中那么多的配置选项都是什么含义呢。下面这篇文章带你解密这些配置请跟随以下这些问题来看以下配置:1.hive输出格式的配置项是哪个?2.hive被各种语言调用如何配置?3.hive提交作业是在hive中还是hadoop中?4.一个查询的最后一个map/reduce任务输出是否被压缩的标志,通过哪个配置项?5.当用户
常见Linux命令
程序员 小柴
后端工程化 linux 服务器 运维
第八章常见Linux命令学习目标1熟练文件目录类命令2熟悉用户管理命令3熟悉组管理命令4熟练文件权限命令5熟悉搜索查找类命令6熟练压缩和解压缩命令7熟练进程线程类命令8了解磁盘分区类命令第一节文件目录类命令(1)pwd打印当前目录的绝对路径(printworkingdirectory)基本语法pwd(功能描述:显示当前工作目录的绝对路径)案例实操显示当前工作目录的绝对路径[root@hadoop1
Fink与Hadoop的简介以及联系
Bugkillers
hadoop 大数据 分布式
Fink和Hadoop是两个常用于大数据处理的开源工具,它们可以搭配使用以构建高效的数据处理系统。一、Fink和Hadoop的关系Fink:1、Fink是一个分布式流处理框架,专注于实时数据处理。它支持高吞吐、低延迟的流处理,适用于实时分析、事件驱动应用等场景。2、Fink提供精确一次(exactly-once)语义,确保数据处理的准确性。Hadoop:1、Hadoop是一个分布式存储和批处理框架
Hbase深入浅出
天才之上
数据存储 Hbase 大数据存储
目录HBase在大数据生态圈中的位置HBase与传统关系数据库的区别HBase相关的模块以及HBase表格的特性HBase的使用建议Phoenix的使用总结HBase在大数据生态圈中的位置提到大数据的存储,大多数人首先联想到的是Hadoop和Hadoop中的HDFS模块。大家熟知的Spark、以及Hadoop的MapReduce,可以理解为一种计算框架。而HDFS,我们可以认为是为计算框架服务的存
HBase简介:高效分布式数据存储和处理
代码指四方
分布式 hbase 数据库 大数据
HBase简介:高效分布式数据存储和处理HBase是一个高效的、可扩展的分布式数据库,它是构建在ApacheHadoop之上的开源项目。HBase的设计目标是为大规模数据存储和处理提供高吞吐量和低延迟的解决方案。它可以在成百上千台服务器上运行,并能够处理海量的结构化和半结构化数据。HBase的核心特点包括:分布式存储:HBase使用Hadoop分布式文件系统(HDFS)作为底层存储,数据被分布在集
在Hadoop集群中实现数据安全:技术与策略并行
Echo_Wish
实战高阶大数据 hadoop 大数据 分布式
在Hadoop集群中实现数据安全:技术与策略并行随着大数据技术的广泛应用,Hadoop已经成为处理和存储海量数据的首选平台。然而,随着数据规模的扩大,如何确保Hadoop集群中的数据安全也成为了亟待解决的难题。毕竟,数据安全不仅关系到企业的隐私保护,也直接影响到数据的可信度与可用性。本文将探讨如何在Hadoop集群中实现数据安全,分析数据加密、访问控制、审计日志等方面的技术与策略,并通过一些具体的
python编写mapreduce job教程
weixin_49526058
python mapreduce hadoop
在Python中实现MapReduce作业,通常可以使用mrjob库,这是一个用于编写和执行MapReduce作业的Python库。它可以运行在本地模式或Hadoop集群上。以下是一个简单的MapReduce示例,它计算文本文件中每个单词的出现次数。安装mrjob首先,你需要安装mrjob库。可以通过pip安装:pipinstallmrjobMapReduce示例:计算单词频率1.创建一个MapR
Knox原理与代码实例讲解
AI天才研究院
计算 DeepSeek R1 & 大数据AI人工智能大模型 计算科学 神经计算 深度学习 神经网络 大数据 人工智能 大型语言模型 AI AGI LLM Java Python 架构设计 Agent RPA
Knox原理与代码实例讲解1.背景介绍在现代分布式系统中,安全性和隔离性是非常重要的需求。ApacheKnox是一个反向代理服务器,旨在为ApacheHadoop集群提供单一入口点,增强安全性和集中化管理。它位于Hadoop集群与客户端应用程序之间,充当网关和负载均衡器的角色。Knox的主要目标是:提供集中式身份验证和授权,减轻客户端应用程序的负担。实现多租户支持,允许不同的组织或部门安全地共享同
Apache ZooKeeper 分布式协调服务
slovess
分布式 apache zookeeper
1.ZooKeeper概述1.1定义与定位核心定位:分布式系统的协调服务,提供强一致性的配置管理、命名服务、分布式锁和集群管理能力核心模型:基于树形节点(ZNode)的键值存储,支持Watcher监听机制生态地位:Hadoop/Kafka等生态核心依赖,分布式系统基础设施级组件1.2设计目标强一致性:所有节点数据最终一致(基于ZAB协议)高可用性:集群半数以上节点存活即可提供服务顺序性:全局唯一递
Hadoop常用端口号
海洋 之心
Hadoop问题解决 hadoop hbase 大数据
Hadoop是一个由多个组件构成的分布式系统,每个组件都会使用一些特定的端口号来进行通信和交互。以下是Hadoop2.x常用的端口号列表:HDFS端口号:NameNode:50070SecondaryNameNode:50090DataNode:50010DataNode(数据传输):50020YARN端口号:ResourceManager:8088NodeManager:8042MapReduc
Hadoop综合项目——二手房统计分析(可视化篇)
WHYBIGDATA
大数据项目 hadoop 大数据
Hadoop综合项目——二手房统计分析(可视化篇)文章目录Hadoop综合项目——二手房统计分析(可视化篇)0、写在前面1、数据可视化1.1二手房四大一线城市总价Top51.2统计各个楼龄段的二手房比例1.3统计各个城市二手房标签的各类比例1.4统计各个城市各个楼层的平均价格1.5统计各个城市二手房优势的各类比例1.6统计各个城市二手房数量和关注人数的关系1.7统计各个城市二手房规格的各类比例1.
spark任务运行
冰火同学
Spark spark 大数据 分布式
运行环境在这里插入代码片[root@hadoop000conf]#java-versionjavaversion"1.8.0_144"Java(TM)SERuntimeEnvironment(build1.8.0_144-b01)[root@hadoop000conf]#echo$JAVA_HOME/home/hadoop/app/jdk1.8.0_144[root@hadoop000conf]#
Hadoop 的分布式缓存机制是如何实现的?如何在大规模集群中优化缓存性能?
晚夜微雨问海棠呀
分布式 hadoop 缓存
Hadoop的分布式缓存机制是一种用于在MapReduce任务中高效分发和访问文件的机制。通过分布式缓存,用户可以将小文件(如配置文件、字典文件等)分发到各个计算节点,从而提高任务的执行效率。分布式缓存的工作原理文件上传:用户将需要缓存的文件上传到HDFS(HadoopDistributedFileSystem)。文件路径可以在作业配置中指定。作业提交:在提交MapReduce作业时,用户可以通过
集群与分片:深入理解及应用实践
一休哥助手
架构 系统架构
目录引言什么是集群?集群的定义集群的类型什么是分片?分片的定义分片的类型集群与分片的关系集群的应用场景负载均衡高可用性分片的应用场景大数据处理数据库分片集群与分片的架构设计系统架构设计数据存储设计案例分析Hadoop集群Elasticsearch分片性能优化策略集群性能优化分片性能优化挑战和解决方案总结参考资料引言在现代计算系统中,处理大规模数据和提高系统的可靠性已经成为了基础需求。集群和分片是两
hive spark读取hive hbase外表报错分析和解决
spring208208
hive hive spark hbase
问题现象使用Sparkshell操作hive关联Hbase的外表导致报错;hive使用tez引擎操作关联Hbase的外表时报错。问题1:使用tez或spark引擎,在hive查询时只要关联hbase的hive表就会有问题其他表正常。“org.apache.hadoop.hbase.client.RetriesExhaustedException:Can’tgetthelocations”问题2:s
Ubuntu下配置安装Hadoop 2.2
weixin_30501857
大数据 java 运维
---恢复内容开始---这两天玩Hadoop,之前在我的Mac上配置了好长时间都没成功的Hadoop环境,今天想在win7虚拟机下的Ubuntu12.0464位机下配置,然后再建一个组群看一看。参考资料:1.InstallingsinglenodeHadoop2.2.0onUbuntu:http://bigdatahandler.com/hadoop-hdfs/installing-single-
2014 6月,比较老了
金金2019
AwesomeBigDataAcuratedlistofawesomebigdataframeworks,resourcesandotherawesomeness.Inspiredbyawesome-php,awesome-python,awesome-ruby,hadoopecosystemtable&big-data.Yourcontributionsarealwayswelcome!Awes
Hive服务启动 之 metastore配置 和 hiveserver2
龍浮影
hive
Hive服务启动之metastore服务配置和hiveserver2 配置hive的时候都需要配置hive-site.xml,配置过程中可以选择hive直连或者使用metastore服务间接连接,那么他们之间有什么区别呢? 首先贴直连配置代码:javax.jdo.option.ConnectionURLjdbc:mysql://hadoop102:3306/metastore?useSSL=fal
5. clickhouse 单节点多实例部署
Toroidals
大数据组件安装部署教程 clickhouse 单节点 多实例 伪分布 安装部署
环境说明:主机名:cmc01为例操作系统:centos7安装部署软件版本部署方式centos7zookeeperzookeeper-3.4.10伪分布式hadoophadoop-3.1.3伪分布式hivehive-3.1.3-bin伪分布式clickhouse21.11.10.1-2单节点多实例dolphinscheduler3.0.0单节点kettlepdi-ce-9.3.0.0单节点sqoop
蓝易云 - HBase基础知识
蓝易云
hbase 数据库 大数据 php python 人工智能
HBase是一个分布式、可伸缩、列式存储的NoSQL数据库,它建立在Hadoop的HDFS之上,提供高可靠性、高性能的数据存储和访问。以下是HBase的基础知识:数据模型:HBase以表的形式存储数据,每个表由行和列组成,可以动态添加列族。每行由唯一的行键标识,列族和列限定符(Qualifier)用于唯一标识列。架构:HBase采用分布式架构,数据被分散存储在多个RegionServer上,每个R
腾讯云大数据套件TBDS与阿里云大数据能力产品对比
奋力向前123
数据库 java 人工智能 腾讯云 大数据 阿里云
前言博主在接触大数据方向研究的时候是在2016年,那时候正是大数据概念非常火热的一个时间段,最著名的Google的3篇论文。GoogleFS、MapReduce、BigTable,奠定了大数据框架产品的基础。Google文件系统,计算框架和存储框架。往后所有的大数据产品和过程域无一不是在三个模块的基础上进行搭建,迭代,完善。我们最开始使用的都是开源的产品,比如hadoop,HDSF,MAPRedu
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