@xtccc
2018-03-16T16:16:30.000000Z
字数 5370
阅读 3177
Linux
CDH安装好后,会存在hdfs
、mapred
、hbase
等账户。
由于在为CDH添加了Kerberos的支持后,如果某个账户的user id 小于1000,则该账户无法提交job。因此,在停止了集群的Hadoop服务后,我将hdfs
账户的user id由原来的『496』更改成了『1100』:
usermod -u 1100 hdfs
以上命令在集群的所有节点上执行。
然后,我重新启动HDFS服务时,启动失败了。去查看有关的日志目录,如下:
[root@hadoop5 ~]# ll /data/var/log/hadoop-hdfs/
total 140
drwx------ 2 496 hdfs 4096 Jun 5 08:39 audit
-rw------- 1 root root 132052 Sep 19 23:35 jsvc.err
-rw------- 1 root root 0 Sep 18 16:36 jsvc.out
drwxr-xr-x 2 496 hdfs 4096 Mar 31 14:23 stacks
可见,这里的问题是:在我修改hdfs
账户的user id之前,/data/var/log/hadoop-hdfs/audit 目录的owner显示为『hdfs』;在我通过usermod -u 1100 hdfs
将hdfs
账户的user id改为『1100』后,这个目录的owner就显示为『496』(这是hdfs
账户原来的user id),而不是『hdfs』了。为什么?
先来看看关于 usermod -u
的说明:
-u, --uid UID
The new numerical value of the user´s ID.This value must be unique, unless the -o option is used. The value must be non-negative. Values between 0 and 999 are typically reserved for system accounts. The user´s mailbox, and any files which the user owns and which are located in the user´s home directory will have the file user ID changed automatically. The ownership of files outside of the user´s home directory must be fixed manually.
现在原因就很清楚了:在用usermod -u 1100 hdfs
改变了用户『hdfs』的user id之后,只有其家目录下的文件的owner能够保持『hdfs』,其他的文件/目录的owner都会保持之前owner的user id (这里就是496)。
对于家目录之外的文件,只好去一一手动地修改他们的owner了。
参考
[root@hadoop4 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 7.5G 12G 40% /
tmpfs 16G 0 16G 0% /dev/shm
/dev/xvdb 1008G 813G 144G 85% /data
cm_processes 16G 91M 16G 1% /var/run/cloudera-scm-agent/process
[root@hadoop4 ~]# ll /data/
total 32
drwxr-xr-x 5 root root 4096 Apr 14 2015 data
drwx------ 2 root root 16384 Mar 10 2015 lost+found
drwxr-xr-x 3 root root 4096 Mar 19 2015 soft
drwxrwxrwt 2 hdfs hdfs 4096 Mar 31 2015 tmp
drwxr-xr-x 5 root root 4096 Jul 2 14:39 var
[root@hadoop4 ~]# du -sh /data/data/
51G /data/data/
[root@hadoop4 ~]# du -sh /data/lost+found/
16K /data/lost+found/
[root@hadoop4 ~]# du -sh /data/soft/
421M /data/soft/
[root@hadoop4 ~]# du -sh /data/tmp/
4.0K /data/tmp/
[root@hadoop4 ~]# du -sh /data/var
8.3G /data/var
用命令df -h
可以看出: 目录 /data使用了813GB的磁盘空间,但是/data下的每一个子目录所占据的磁盘空间只和却只有60GB左右。两者为什么相差这么大?
这是因为:有些文件被一些进程打开了,我直接删除了这些文件,但是没有关闭进程,导致这些文件依然是打开的状态。
通过命令 lsof | grep deleted
可以看出这些被打开的文件。
解决方法:关闭这些进程。
参考 List Folder and File Size and Sort By Size on Linux
如果我想看看/data/opt/cloudera
下的所有一级子目录占用的磁盘空间大小,并且按照逆序排列,则可以使用命令:
du -shBM /data/opt/cloudera/ | sort -nr
输出如下:
# du -shBM /data/opt/cloudera/* | sort -nr
2917M /data/opt/cloudera/parcel-repo
2029M /data/opt/cloudera/parcels
1487M /data/opt/cloudera/parcel-cache
1M /data/opt/cloudera/csd
参考:
5.1 问题与需求
我们的AWS Spot Instance,在创建好了之后只能通过如下的方式进行SSH:
$ ssh -i <path-to-key.pem> ec2-user@<instance-ip>
现在我们希望能够在机器A上以root身份直接无秘钥登录进机器B,但是如果我们执行命令:
$ sudo su
$ ssh -i ~/.ssh/<key.pem> root@<IP_A>
Please login as the user "ec2-user" rather than the user "root".
Connection to <IP_A> closed.
机器B不允许我们以root身份进行SSH登录,即使我们有正确的key.pem文件(里面的内容是RSA Private Key)。
5.2 修改authorized_keys文件
我们看看机器B的/root/.ssh目录下有什么文件?
$ ls /root/.ssh
total 4
-rw------- 1 root root 550 Nov 15 07:46 authorized_keys
$ cat /root/.ssh/authorized_keys
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"ec2-user\" rather than the user \"root\".';echo;sleep 10" ssh-rsa xxx<这里是private key>xxx akka_oregon
可以看出,/root/.ssh/authorized_keys里面包含了public key(A机器上的key.pem文件内容是对应的private key,akka_oregon是我们在AWS上创建spot instance时指定的key name,它对应着key.pem),但是从他的内容中我们又能看到“Please login as the user \"ec2-user\" rather than the user \"root\"”,即它不允许我们以root身份登录。
所以,将它修改为:
ssh-rsa xxx<这里是private key>xxx
5.3 修改sshd_config文件
再看看B机器的/etc/ssh/sshd_config文件内容,会发现如下几行内容:
#PermitRootLogin yes
# Only allow root to run commands over ssh, no shell
PermitRootLogin forced-commands-only
#RSAAuthentication yes
#PubkeyAuthentication yes
需要将其进行如下修改:
PermitRootLogin yes
# Only allow root to run commands over ssh, no shell
# PermitRootLogin forced-commands-only
RSAAuthentication yes
PubkeyAuthentication yes
5.4 重启sshd服务
B机器(被登录host)上的文件已经修改好了,现在需要重启上面的sshd服务:
$ service sshd restart
5.5 添加id_rsa文件
B机器已经好了,现在在A机器上添加一个private key,将其放入A机器的文件/root/.ssh/id_rsa
中。其中的内容就是我们在创建spot instance时指定的key.pem文件的内容,这实际上是私钥。
同时,还要将该文件的权限设置为600。
5.6 测试
现在,在A机器上以root身份键入命令:
$ ssh root@<ip_B>
Last login: Tue Nov 15 12:39:52 2016
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/
4 package(s) needed for security, out of 6 available
Run "sudo yum update" to apply all updates.
[root@ip_B ~]$
成功。
防止文件/etc/logrotate.d/tape,文件的内容形式如下:
/path/to/my.log {
#指定转储周期为每天
daily
missingok
#指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
rotate 5
compress
delaycompress
#如果是空文件的话,不转储
notifempty
}
其中,第一行 /path/to/my.log
是将被Roll的目标文件,也可以用*来匹配文件类型,如 /path/to/*.log
。
默认的比较小,是4096,对于很多service而言是太小了。
下面介绍怎样单独修改某个serveice的最大打开文件数的限制。注意,只对某个service生效。
这里介绍在centos7(支持systemd),以rabbitmq-server为例说明怎样修改配置。
在安装好rabbitmq-server之后,可以查看它的当前配置:
rabbitmqctl status
它可以输出rabbitmq-server的当前配置:
...
{file_descriptors,
[{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]},
...
也可以通过这个命令来看这个进程的配置:
$ cat /proc/19520/limits
cat /proc/19520/limits
Limit Soft Limit Hard Limit Units
...
...
Max open files 1024 4096 files
...
...
修改/etc/security/limits.d/20-nproc.conf文件
取消非root用户的nproc限制
* soft nproc unlimited
root soft nproc unlimited
修改/usr/lib/systemd/system/rabbitmq-server.service文件
增加:
LimitCORE=infinity
LimitNOFILE=95536
LimitNPROC=100000
运行以下命令让其生效:
systemctl daemon-reload
systemctl restart rabbitmq-server