Hadoop IO 以及 HDFS manipulation 简介 有用的命令行
HDFS的默认目录在 /user/username
HDFS的开放端口在core-site.xml这个配置文件中指定, 一般为9000或8020, data node 的数据存放本地目录也在该文件中, hadoop.tmp.dir配置项中
当你执行命令时不指定目录时, 一般命令都会在这个目录下执行
所以在HDFS里没有 cd 和 pwd 这样的命令.
Hadoop fs命令:
hadoop fs -copyFromLocal
hadoop fs -copyToLocal
hadoop fs -mkdir
hadoop fs -ls
hadoop fs -getmerge /folder ~/folder/mergered_file
getmerge这是一个很有用的命令可以把一个文件夹下多个reducer产生的结果part,合并为一个文件, 输出到本机的目录
Hadoop Filesystems 有多种虚拟的文件系统, HDFS只是其中之一
hadoop fs -ls file:///
hadoop fs -ls hdfs:///
第一条命令会显示node所在服务器的本地文件信息
第二条命令则显示分布式文件系统的信息
对于HDFS的一些复杂操作可以自己来写java然后打包成jar文件, 通过命令行来执行
为了方便期间, 可以先定义好HADOOP_CLASSPATH这个环境变量:
export HADOOP_CLASSPATH=/usr/local/hadoop-2.7.0/share/myjar/*
注意最后一定要指定好jar的名字或者通配符*
然后我们只要把编写好的jar文件放到这个目录里去就能够用bin目录下的hadoop来执行了
比如:
./hadoop URLCat hdfs:localhost:9000/user/root/input/sample.txt
URLCat类的代码如下
// cc URLCat Displays files from a Hadoop filesystem on standard output using a URLStreamHandler
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
// vv URLCat
public class URLCat {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws Exception {
InputStream in = null;
try {
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
// ^^ URLCat
HDFS存在一个Coherency Model, 在文件从client写入datanode的时候, 有三个函数对应三种情况:
flush: 写入的数据不一定可见
hflush: 写入的数据可见, 但是可能只是写入了datanode的内存中 (close默认调用hflush)
sync: 写入的数据可见, 而且是写到了磁盘中去.
这其中有个trade-off, sync能确保数据写入磁盘, 但会阻塞程序较久, flush不会阻塞, 但数据可能还没有准备好被读取.
hadoop还有一个并行文件传输命令:
hadoop distcp dir1 dir2
可以直接对拷目录:
hadoop fs -checksum filename #获取文件CRC
显示某个文件属性:
hadoop fs -stat "%o %r" /somefile.csv
%b:打印文件大小(目录为0)
%n:打印文件名
%o:打印block size (我们要的值)
%r:打印备份数
%y:打印UTC日期 yyyy-MM-dd HH:mm:ss
%Y:打印自1970年1月1日以来的UTC微秒数
%F:目录打印directory, 文件打印regular file
当使用-stat选项但不指定format时候,只打印文件创建日期,相当于%y:
hdfs 命令:
hdfs getconf -confKey dfs.blocksize //获取配置参数
hdfs fsck /somefile.csv //列出文件详细信息
hdfs groups username
hdfs dfs -chown newownername:newgroup /dir