1.开机启动Hadoop,输入命令:
检查相关进程的启动情况:
2.对Hadoop集群做一个测试:
可以看到新建的test1.txt和test2.txt已经成功地拷贝到节点上(伪分布式只有一个节点,如果是完全分布式,则会显示3个节点都拷贝成功)。这证明HDFS工作正常,其中,hadoop dfs –put [本地地址] [hadoop目录] 代表将本地的地址目录存放到hadoop目录下;hadoop dfs –ls [文件目录] 则表示查看指定目录下的内容。更多Hadoop的常用指令请参考:http://blog.chinaunix.net/uid-10915175-id-3258669.html。
接下来测试MapReduce:
这里运行了一个Java例子,jar代表运行java程序,wordcount表示运行jar包里面的wordcount功能,in代表原始数据地址,out代表目的地址(新的目录)。
运行 bin/hadoop dfs -ls 命令,列出根目录的所有内容;运行bin/hadoop dfs -cat .out/* 可以看到文件内容的统计。
也可以通过WEB来了解Hadoop的活动:通过浏览器和http访问jobtracker所在节点的50030端口监控jobtracker,通过浏览器和http访问namenode所在节点的50070端口监控集群。
那么在操作系统Linux的角度,文件保存到哪里了呢?
查看HADOOP_HOME下的data目录下的current目录下,会发现一大堆blk开头的文件,后缀名为.meta的是元数据,而没有此后缀的文件是写入的数据,在Linux角度看,这些数据根本打不开。
3.HDFS设计基础与目标:
(1) 硬件错误是常态,因此需要冗余。原因可能是内存不稳定,CPU过热,硬盘寿命到期,硬盘介质损坏等等。
(2) 流式数据访问,即数据批量读取而非随机读写,Hadoop擅长做的是数据分析而不是事务处理,专为大数据而生。
(3) 大规模数据集。
(4) 简单一致性模型。为了降低系统的复杂度,对文件采用一次性写多次读的逻辑设计,即如果是文件,一经写入、关闭,就再也不能修改。
(5) 程序采用"数据就近"原则分配节点执行。
4.HDFS体系结构:
包括NameNode、DataNode、事务日志、映像文件以及SecondaryNameNode。
NameNode:
(1) 管理文件系统的命名空间。
(2) 记录每个文件数据块在各个DataNode上的位置和副本信息。
(3) 协调客户端对文件的访问。
(4) 记录命名空间内的改动或空间本身属性的改动。
(5) NameNode使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等。
DataNode:
(1) 负责所在的物理节点的存储管理。
(2) 一次写入,多次读取(不修改)。
(3) 文件由数据块组成,典型的块大小是64MB。
(4) 数据块尽量散步到各个节点。
读取数据的流程:
(1) 客户端首先从NameNode获得组成这个文件的数据块位置列表。
(2) 根据列表知道存储数据块的DataNode。
(3) 访问DataNode获取数据。
由此可以看出NameNode并不参与数据实际的传输。
HDFS的可靠性:
(1) 冗余副本策略。可以在hdfs-site.xml中设置复制因子指定副本数量,所有数据块都有副本,DataNode启动时,会遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列表(blockreport)汇报给NameNode。
(2) 机架策略。集群一般放在不同的机架上,机架之间带宽要比机架内带宽要小,HDFS有"机架感知"功能,Hadoop可以通过节点之间互相传递数据包,就可以知道两个节点是不是在同一个机架上。一般在本机架存放一个副本,在其他机架在存放别的副本,这样可以防止机架失效时丢失数据,也可以提高带宽利用率。
(3) 心跳机制。NameNode周期性从DataNode接受心跳信号和块报告,NameNode根据块报告验证元数据,没有按时发送心跳的DataNode会被标记为宕机,不会再给它任何I/O请求。如果DataNode失效造成副本数量下降,并且低于预先设置的阈值,NameNode会检测出这些数据块,并在合适的时机进行重新复制。引发重新复制的原因还包括数据副本本身损坏,磁盘错误,复制因子被增大等等。
(4) 安全模式。NameNode启动时会先经过一个"安全模式"阶段,在这个阶段,不会产生数据写操作,NameNode会收集各个DataNode的报告,当数据块达到最小副本数以上时,会被认为是"安全"的。在一定比例(可设置)的数据块被确定为安全后,再过若干时间,安全模式结束,当检测到副本数不足时,该块会被复制,直到达到最小副本数。
(5) 校验和。在文件创立时,每个数据块都产生校验和,校验和会作为单独一个隐藏文件保存在命名空间下,客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏。如果正在读取的数据块损坏,则可以继续读取其他副本。
(6) 回收站。删除文件时,其实是放入回收站/trash,回收站里的文件是可以快速恢复的。可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就会被彻底删除,并且释放占用的数据块。
(7) 元数据保护。映像文件和事务日志是NameNode的核心数据,可以配置为拥有多个副本。副本会降低NameNode的处理速度,但增加安全性。NameNode依然是单节点,如果发生故障仍然要手动切换。
(8) 快照机制。0.20.2还未实现。支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态。
5.HDFS的一些操作(命令行,先进入HADOOP_HOME目录下):
(1) 列出HDFS下的文件: bin/hadoop dfs -ls [文件目录](不写则默认hadoop的根目录)
(2) 上传文件到HDFS: bin/hadoop dfs -put [本地目录] [hadoop目录]
(3) 把HDFS的文件复制到本地: bin/hadoop dfs -get [hadoop目录] [本地目录]
(4) 删除HDFS下的文档: bin/hadoop dfs -rmr [文件目录]
(5) 查看HDFS下某个文件的内容: bin/hadoop dfs -cat [文件路径]
(6) 查看HDFS基本统计信息: bin/hadoop dfsadmin -report
(7) 进入和退出安全模式: bin/hadoop dfsadmin -safemode enter
bin/hadoop dfsadmin -safemode leave
怎样增加新的节点?
(1) 在新节点安装好Hadoop,配置好环境。
(2) 把NameNode的有关配置文件复制到该节点。
(3) 修改masters和slaves文件,增加该节点。
(4) 设置ssh免密码进出该节点。
(5) 单独启动该节点上的DataNode和TaskTracker(hadoop-daemon.sh start datanode/tasktracker)。
(6) 运行start-balancer.sh进行数据负载均衡。
启动某些特定后台进程而非所有后台进程:
start-all.sh是启动所有进程。start dfs daemons是启动NameNode,start mapred daemons是启动JobTracker等等。
6.HDFS的一些操作(API):
写文件 create
读取文件 open
删除文件delete
创建目录 mkdirs
删除文件或目录 delete
列出目录的内容 listStatus
显示文件系统的目录和文件的元数据信息 getFileStatus