
1.hdfs文件写流程:1.Client调用FileSystem.create(filePath)方法,去与Namenode进行rpc通信,check该路径的文件是否存在以及有没有权限创建该文件,假如ok,就创建一个新文件,但是并不关联任何block,返回一个FSDataOutputStream对象;(假如not ok,就返回错误信息,所以写代码要try-catch)。 如果出现权限问题俩种解决办法: [root@hadoop01 hadoop]#hdfs dfs -put slaves / put: Permission denied: user=root, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x 因为你在root用户上没有开启hdfs,而是在hadoop用户上开启的,你现在在root用户执行hdfs命令他就会报权限错误。 有俩种解决办法。
(1)su - hadoop -c "hdfs命令"[root@hadoop000 ~]# su - hadoop -c "hdfs dfs -put /tmp/test.log /" 在root用户之下直接执行在Hadoop用户上的命令。这条命令表示 将root用户下的/tmp/test.log上传到hdfs上 总的来说你执行这条命令在其他用户之上,你得有切到hadoop的权限 [root@hadoop000 ~]# su - hadoop -c "hdfs dfs -ls /" Found 6 items -rw-r--r-- 1 hadoop supergroup 18 2018-05-19 20:47 /rz.log -rw-r--r-- 2 hadoop supergroup 18 2018-05-19 21:20 /rz.log1 -rw-r--r-- 1 hadoop supergroup 18 2018-05-20 20:04 /rz.log123 -rw-r--r-- 1 hadoop supergroup 0 2018-05-20 20:10 /test.log drwx------ - hadoop supergroup 0 2018-05-16 22:49 /tmp drwxr-xr-x - hadoop supergroup 0 2018-05-16 22:49 /user [root@hadoop000 ~]#
(2)针对一个业务的内容就放在这个文件中,在给这个文件改个权限[hadoop@hadoop000 ~]$ hdfs dfs -mkdir /root 表示在HDFS中下创建一个root目录 [hadoop@hadoop000 ~]$ hdfs dfs -chown -R root:root /root 表示为这个文件夹添加root用户和root用户组
2.Client调用FSDataOutputStream对象的write()方法,会将第一个块写入第一个Datanode,第一个Datanode写完传给第二个节点,第二个写完传给第三节点,当第三个节点写完返回一个ack packet给第二个节点,第二个返回一个ack packet给第一个节点,第一个节点返回ack packet给FSDataOutputStream对象,意思标识第一个块写完,副本数为3;然后剩余的块依次这样写;(当然写操作对于Client端也是透明的) 3.当向文件写入数据完成后,Client调用FSDataOutputStream.close()方法,关闭输出流,flush缓存区的数据包。 4.再调用FileSystem.complete()方法,告诉Namenode节点写入成功。 2.pid:(1)什么是pid?PID全称是Process identification,它是进程的代号,没个进程都有唯一的PID编号。它是进程运行时系统随即分配的,并不代表专门的进程。在运行时PID时不回改变标识符的,但是你终止程序后再运行PID标识符就会被系统回收,就可能会被继续分配给新运行的程序。 (2)PID存储在那?有关hdfs的pid都存储在/tmp目录之下 
(3)pid有什么作用呢?它的作用在于当你用shell脚本想杀死一个进程的时候,你能准确的杀死你想杀死的进程。 如果按照正确的流程走,ps -ef|grep xxx 这就容易出现一个问题,你搜索出来的不止一个,有可能有很多相似的,而导致你杀错程序。但是若通多查看pid就能避免这种错误的诞生。 下面这个就是shell脚本使用pid杀死进程的一个例子 
(4)如果删除了pid,进程回挂吗?还能提供正常服务吗?答案是进程不会挂,能正常服务,但是你stophdfs的时候就会出现找不到文件的问题。 
从上面这第一个箭头的英文大概意思就是如果你不设置pid的存储路径,那么就默认在/tmp目录之下。而下面那段英文则表示的是应该给他设置为内容写入的目录,将运行hadoop守护进程的用户,否则有可能回出现符号连接攻击。 (5)在生产中:pid是绝对不能放到tmp目录之下的,为什么呢? 因为一个月后它回自动删除,正确的流程应该是如下 mkdir /data/hadoop/tmp :创建一个tmp目录这一般是你的数据写入的目录 chmod -R 777 /data/hadoop/tmp :为它增加权限 vi hadoop-env.sh :编辑hadoop-env.sh配置文件
export HADOOP_PID_DIR=/data/hadoop/tmp :设置环境变量目录 (6)如何修改/tmp目录不是30天自动删除呢?进入cd /etc/cron.daily 这里有个tmpwatch:删除临时文件 

具体步骤可看这个博客https://blog.csdn.net/zhidetian/article/details/51906335
3.hadoop命令(1)hadoop:查看关于它的命令帮助 
得明白这些这英文的大概意思:fs 哪一行表示:运行一个通用文件系统客户端。 (2)hadoop dfsadmin -report:查看集群的使用状况,remaining剩余,used使用,cache存储硬盘 Configured Capacity:配置容量 Present Capacity:剩余的现在容量
Under replicated blocks:在复制的块
Blocks with corrupt replicas:块和坏掉的副本
Missing blocks:失踪的块
with replication factor 1:复制因子1
Pending deletion blocks:待删除的块

这个命令可以对hdfs的使用做一个预警。但是在后期就是使用cdh不用他了。 hdfs dfsadmin -safemode enter|leave:进入或退出安全模式 
(3)hdfs fsck:查看关于块的信息 比如删除坏的块,查看的位置信息,打印块报告等等。 
4、hdfs垃圾回收箱:作用:在于不小心删除文件时,可以用来回复文件。 vi core-site.xml :在里面怕【配置上这一段 <property> <!--多长时间创建CheckPoint NameNode截点上运行的CheckPointer 从Current文件夹创建CheckPoint;默认:0 由fs.trash.interval项指定 --> <name>fs.trash.checkpoint.interval</name> <value>0</value> </property> <property> <!--多少分钟.Trash下的CheckPoint目录会被删除,该配置服务器设置优先级大于客户端,默认:0 不删除 --> <name>fs.trash.interval</name> interval:这个单词的意思是间隔时间。 <value>1440</value> 设置文件在垃圾回收箱多久被删除,如果是0表示默认不开启垃圾回收箱。
</property> 如果你确认这个文件不需要了,不想他进入垃圾回收箱,可以直接删除 
hdfs dfs -rm -skipTrash xxx文件:这就是跳过垃圾回收箱。 |