① HDFS操作命令
HDFS命令基本格式:hadoop fs -cmd < args >
表格:
注意:以上表格中路径包括hdfs中的路径和linux中的路径。对于容易产生歧义的地方,会特别指出“linux路径”或者“hdfs路径”。如果没有明确指出,意味着是hdfs路径。
HDFS有一个默认的工作目录/user/$USER,其中$USER是用户的登录用户名。不过目录不会自动建立,需要mkdir建立它
命令格式:hadoop fs -mkdir
注意:支持级联创建新目录,Hadoop的mkdir命令会自动创建父目录,类似于带-p的linux命令
put命令从本地文件系统中 复制单个或多个 源路径到目标文件系统,也支持从标准输入设备中读取输入并写入目标文件系统。分为本地上传和上传到HDFS中。
命令格式:hadoop fs -put filename
最后一个参数是句点,相当于放入了默认的工作目录,等价于 hadoop fs -put example.txt /user/chen
上传文件时,文件首先复制到DataNode上,只有所有的DataNode都成功接收完数据,文件上传才是成功的。
命令格式:hadoop dfs put filename newfilename
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从 标准输入 中读取输入写入目标文件系统。
采用-ls命令列出HDFS上的文件。在HDFS中未带参数的-ls命令没有返回任何值,它默认返回HDFS的home目录下
的内容。在HDFS中,没有当前工作目录这样一个概念,也没有cmd这样的命令。
命令格式:user@NameNode:hadoop$ bin/hadoop dfs -ls
如:
通过“-ls 文件夹名” 命令浏览HDFS下文件夹中的文件
命令格式:hadoop dfs -ls 文件夹名
通过该命令可以查看in文件夹中的所有文档文件
通过“-cat 文件名”命令查看HDFS下文件夹中某个文件的内容
命令格式:hadoop$ bin/hadoop dfs -cat 文件名
通过这个命令可以查看in文件夹中所有文件的内容
通过“-get 文件按1 文件2”命令将HDFS中某目录下的文件复制到本地系统的某文件中,并对该文件重新命名。
命令格式:hadoop dfs -get 文件名 新文件名
-get 命令与-put命令一样,既可以操作目录,也可以操作文件
通过“-rmr 文件”命令删除HDFS下的文件
命令格式:hadoop$ bin/hadoop dfs -rmr 文件
-rmr 删除文档命令相当于delete的递归版本。
通过-format命令实现HDFS格式化
命令格式:user@NameNode:hadoop$ bin/hadoop NameNode -format
通过运行start-dfs.sh,就可以启动HDFS了
命令格式:user@NameNode:hadoop$ bin/ start-dfs.sh
当需要退出HDFS时,通过stop-dfs.sh 就可以关闭HDFS
命令格式:user@NameNode:hadoop$ bin/ stop-dfs.sh
HDFS的命令远不止这些,对于其他操作,可以通过-help commandName 命令列出清单。下面列举一些命令进行说明。
(1)chgrp改变文件所属的组命令
chgrp命令的用途是:更改文件或目录的组所有权。
语法格式:hadoop fs -charg [-R] GROUP URL .....
使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。
(2)chmod改变文件的权限
chmod用于改变文件或目录的访问权限,这个Linux系统管理员最常用的命令之一。
使用方法:hadoop fs -chmod [-R] ...
使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者是超级用户
(3)chown改变文件的拥有者
chown命令改变文件的拥有者。
使用方法:hadoop fs -chown [-R]....
使用-R将使改变在目录结构下递归进行。命令的使用者必须是超级用户。
(4)FromLocal命令
除了限定 源路径 是只能是一个 本地文件 外,其他方面和put命令相似。
使用方法:hadoop fs -FromLocal <localsrc> URI
(5)ToLocal命令
除了限定 目标路径 是一个 本地文件 外,其他方面和get命令类似。
使用方法:hadoop fs -ToLocal {-ignorecrc} {-crc} URI <localdst>
(6)cp命令
cp命令是将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。
使用方法:hadoop fs -cp URI [URI....] <dest>
返回值:成功返回0 ,失败返回-1
(7)命令
命令显示目录中 所有文件的大小 ,或者当只指定一个文件时,显示此文件的大小
使用方法:hadoop fs - URI [URI........]
返回值
成功返回0,失败返回-1
(8)s命令
s是显示 文件大小 的命令。
使用方法:hadoop fs -s <args>
(9)expunge命令
expunge是清空回收站的命令
使用方法:hadoop fs -expunge
(10)get命令
get是复制文件到本地文件系统的命令
使用方法:hadoop fs -get [-ignorecrc] [-crc] <localdst>
可用-ignorecrc选项复制CRC校验失败的文件:使用-CRC选项复制文件以及CRC信息。
返回值
成功返回0,失败返回-1
(11)getmerge命令
getmerge命令用于接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件合并成本地目标文件。
使用方法:hadoop fs -getmerge <src> <localdst> [addnl]
参数说明:addl是可选的,用于指定在每个文件结尾添加一个换行符;
假设在你的hdfs集群上有一个/user/hadoop/output目录
里面有作业执行的结果(多个文件组成)part-000000,part-000001,part-000002
然后就可以在本地使用vi local_file查看内容了
(12)ls命令
ls命令查看当前目录下的信息
使用方法:hadoop fs -ls <args>
如果是 文件 ,则按照如下格式返回文件信息:
文件名 <副本数>文件大小 修改日期 修改时间 权限 用户ID 组ID
如果是 目录 ,则返回它直接子文件的一个列表,就像在UNIX中一样。目录返回i额表的信息如下:
目录名<dir>修改日期 修改时间 权限 用户ID 组ID
返回值
成功返回0,失败返回-1
(13)lsr命令
lsr命令是-ls命令的递归版,类似于UNIX中的ls-r。
使用方法:hadoop fs -lsr <args>
(14)movefromLocal命令
复制一份本地文件到hdfs,当成功后,删除本地文件
使用方法:dfs -moveFromLocal <src> <dst>
(14.5)moveToLocal命令
类似于-get,但是当复制完成后,会删除hdfs上的文件
使用方法:moveToLocal <src> <localDest>
(15)mv命令
将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录
使用方法:hadoop fs -mv URI [URI.....] <dest>
备注:不允许在不同的文件系统间移动文件。
返回值
成功返回0,失败返回-1
(16)put 命令
put命令从本地文件系统中复制单个或多个源路径到目标文件系统,也支持从标准输入中读取输入写入目标文件系统
使用方法:hadoop fs -put <localsrc> .... <dst>
(17)rm命令
rm命令删除指定的文件,只删除非空目录和文件。
使用方法:hadoop fs -rm URI [URI......]
请参考rmr命令了解递归删除。
(18)rmr命令
rmr命令是delete命令的递归版本
使用方法:hadoop fs -rmr URI [URI.......]
返回值
成功返回0,失败返回-1
(19)setrep命令
setrep命令可以改变一个文件的副本系数。
使用方法:hadoop fs -setrep [-R] <path>
参数说明:-R 选项用于递归改变目录下所有文件的副本系数
返回值
成功返回0,失败返回-1
(20)stat命令
stat命令用于返回指定路径的统计信息
使用方法:hadoop fs -stat URI [URI......]
返回值
成功返回0,失败返回-1
(21)tail命令
tail命令将文件尾部1KB的内容输出到stdout。支持-f选项,行为和UNIX中一致
使用方法:hadoop fs -tail [-f] URI
返回值
成功返回0,失败返回-1
(22)test命令
test命令是检查命令,可以检查文件是否存在、文件的大小等。
使用方法:hadoop fs -test -[ezd] URI
(23)text命令
text命令用于将源文件输出问文本格式
使用方法:hadoop fs -text <src>
允许的格式是zip和TextRecordInputStream。
(24)touchz 命令
touchz命令用于创建一个0字节的空文件。
使用方法: hadoop fs -touchz URI [URI....]
返回值
成功返回0,失败返回-1
② Hadoop系列之HDFS架构
本篇文章翻译了Hadoop系列下的 HDFS Architecture ,原文最初经过笔者翻译后大概有6000字,之后笔者对内容进行了精简化压缩,从而使笔者自己和其他读者们阅读本文时能够更加高效快速的完成对Hadoop的学习或复习。本文主要介绍了Hadoop的整体架构,包括但不限于节点概念、命名空间、数据容错机制、数据管理方式、简单的脚本命令和垃圾回收概念。
PS:笔者新手一枚,如果看出哪里存在问题,欢迎下方留言!
Hadoop Distributed File System(HDFS)是高容错、高吞吐量、用于处理海量数据的分布式文件系统。
HDFS一般由成百上千的机器组成,每个机器存储整个数据集的一部分数据,机器故障的快速发现与恢复是HDFS的核心目标。
HDFS对接口的核心目标是高吞吐量而非低延迟。
HDFS支持海量数据集合,一个集群一般能够支持千万以上数量级的文件。
HDFS应用需要对文件写一次读多次的接口模型,文件变更只支持尾部添加和截断。
HDFS的海量数据与一致性接口特点,使得迁移计算以适应文件内容要比迁移数据从而支持计算更加高效。
HDFS支持跨平台使用。
HDFS使用主从架构。一个HDFS集群由一个NameNode、一个主服务器(用于管理系统命名空间和控制客户端文件接口)、大量的DataNode(一般一个节点一个,用于管理该节点数据存储)。HDFS对外暴露了文件系统命名空间并允许在文件中存储用户数据。一个文件被分成一个或多个块,这些块存储在一组DataNode中。NameNode执行文件系统命名空间的打开关闭重命名等命令并记录着块和DataNode之间的映射。DataNode用于处理客户端的读写请求和块的相关操作。NameNode和DataNode一般运行在GNU/Linux操作系统上,HDFS使用java语言开发的,因此NameNode和DataNode可以运行在任何支持Java的机器上,再加上Java语言的高度可移植性,使得HDFS可以发布在各种各样的机器上。一个HDFS集群中运行一个NameNode,其他机器每个运行一个(也可以多个,非常少见)DataNode。NameNode简化了系统的架构,只用于存储所有HDFS元数据,用户数据不会进入该节点。下图为HDFS架构图:
HDFS支持传统的分层文件管理,用户或者应用能够在目录下创建目录或者文件。文件系统命名空间和其他文件系统是相似的,支持创建、删除、移动和重命名文件。HDFS支持用户数量限制和访问权限控制,不支持软硬链接,用户可以自己实现软硬链接。NameNode控制该命名空间,命名空间任何变动几乎都要记录到NameNode中。应用可以在HDFS中对文件声明复制次数,这个次数叫做复制系数,会被记录到NameNode中。
HDFS将每个文件存储为一个或多个块,并为文件设置了块的大小和复制系数从而支持文件容错。一个文件所有的块(除了最后一个块)大小相同,后来支持了可变长度的块。复制系数在创建文件时赋值,后续可以更改。文件在任何时候只能有一个writer。NameNode负责块复制,它周期性收到每个数据节点的心跳和块报告,心跳表示数据节点的正常运作,块报告包含了这个DataNode的所有块。
副本存储方案对于HDFS的稳定性和性能至关重要。为了提升数据可靠性、灵活性和充分利用网络带宽,HDFS引入了机架感知的副本存储策略,该策略只是副本存储策略的第一步,为后续优化打下基础。大型HDFS集群一般运行于横跨许多支架的计算机集群中,一般情况下同一支架中两个节点数据传输快于不同支架。一种简单的方法是将副本存放在单独的机架上,从而防止丢失数据并提高带宽,但是增加了数据写入的负担。一般情况下,复制系数是3,HDFS存储策略是将第一份副本存储到本地机器或者同一机架下一个随机DataNode,另外两份副本存储到同一个远程机架的不同DataNode。NameNode不允许同一DataNode存储相同副本多次。在机架感知的策略基础上,后续支持了 存储类型和机架感知相结合的策略 ,简单来说就是在机架感知基础上判断DataNode是否支持该类型的文件,不支持则寻找下一个。
HDFS读取数据使用就近原则,首先寻找相同机架上是否存在副本,其次本地数据中心,最后远程数据中心。
启动时,NameNode进入安全模式,该模式下不会发生数据块复制,NameNode接收来自DataNode的心跳和块报告,每个块都有一个最小副本数量n,数据块在NameNode接受到该块n次后,认为这个数据块完成安全复制。当完成安全复制的数据块比例达到一个可配的百分比值并再过30s后,NameNode退出安全模式,最后判断是否仍然存在未达到最小复制次数的数据块,并对这些块进行复制操作。
NameNode使用名为EditLog的事务日志持续记录文件系统元数据的每一次改动(如创建文件、改变复制系数),使用名为FsImage的文件存储全部的文件系统命名空间(包括块到文件的映射关系和文件系统的相关属性),EditLog和FsImage都存储在NameNode本地文件系统中。NameNode在内存中保存着元数据和块映射的快照,当NameNode启动后或者某个配置项达到阈值时,会从磁盘中读取EditLog和FsImage,通过EditLog新的记录更新内存中的FsImage,再讲新版本的FsImage刷新到磁盘中,然后截断EditLog中已经处理的记录,这个过程就是一个检查点。检查点的目的是确保文件系统通过在内存中使用元数据的快照从而持续的观察元数据的变更并将快照信息存储到磁盘FsImage中。检查点通过下面两个配置参数出发,时间周期(dfs.namenode.checkpoint.period)和文件系统事务数量(dfs.namenode.checkpoint.txns),二者同时配置时,满足任意一个条件就会触发检查点。
所有的HDFS网络协议都是基于TCP/IP的,客户端建立一个到NameNode机器的可配置的TCP端口,用于二者之间的交互。DataNode使用DataNode协议和NameNode交互,RPC包装了客户端协议和DataNode协议,通过设计,NameNode不会发起RPC,只负责响应来自客户端或者DataNode的RPC请求。
HDFS的核心目标是即使在失败或者错误情况下依然能够保证数据可靠性,三种常见失败情况包括NameNode故障、DataNode故障和network partitions。
网络分区可能会导致部分DataNode市区和NameNode的连接,NameNode通过心跳包判断并将失去连接的DataNode标记为挂掉状态,于是所有注册到挂掉DataNode的数据都不可用了,可能会导致部分数据块的复制数量低于了原本配置的复制系数。NameNode不断地追踪哪些需要复制的块并在必要时候进行复制,触发条件包含多种情况:DataNode不可用、复制乱码、硬件磁盘故障或者认为增大负值系数。为了避免DataNode的状态不稳定导致的复制风暴,标记DataNode挂掉的超时时间设置比较长(默认10min),用户可以设置更短的时间间隔来标记DataNode为陈旧状态从而避免在对读写性能要求高的请求上使用这些陈旧节点。
HDFS架构兼容数据各种重新平衡方案,一种方案可以在某个DataNode的空闲空间小于某个阈值时将数据移动到另一个DataNode上;在某个特殊文件突然有高的读取需求时,一种方式是积极创建额外副本并且平衡集群中的其他数据。这些类型的平衡方案暂时还未实现(不太清楚现有方案是什么...)。
存储设备、网络或者软件的问题都可能导致从DataNode获取的数据发生乱码,HDFS客户端实现了对文件内容的校验,客户端在创建文件时,会计算文件中每个块的校验值并存储到命名空间,当客户端取回数据后会使用校验值对每个块进行校验,如果存在问题,客户端就会去另一个DataNode获取这个块的副本。
FsImage和EditLog是HDFS的核心数据结构,他们的错误会导致整个HDFS挂掉,因此,NameNode应该支持时刻维持FsImage和EditLog的多分复制文件,它们的任何改变所有文件应该同步更新。另一个选择是使用 shared storage on NFS 或者 distributed edit log 支持多个NameNode,官方推荐 distributed edit log 。
快照能够存储某一特殊时刻的数据副本,从而支持HDFS在发生错误时会滚到上一个稳定版本。
HDFS的应用场景是大的数据集下,且数据只需要写一次但是要读取一到多次并且支持流速读取数据。一般情况下一个块大小为128MB,因此一个文件被切割成128MB的大块,且每个快可能分布在不同的DataNode。
当客户端在复制系数是3的条件下写数据时,NameNode通过目标选择算法收到副本要写入的DataNode的集合,第1个DataNode开始一部分一部分的获取数据,把每个部分存储到本地并转发给第2个DataNode,第2个DataNode同样的把每个部分存储到本地并转发给第3个DataNode,第3个DataNode将数据存储到本地,这就是管道复制。
HDFS提供了多种访问方式,比如 FileSystem Java API 、 C language wrapper for this Java API 和 REST API ,而且还支持浏览器直接浏览。通过使用 NFS gateway ,客户端可以在本地文件系统上安装HDFS。
HDFS使用目录和文件的方式管理数据,并提供了叫做 FS shell 的命令行接口,下面有一些简单的命令:
DFSAdmin命令集合用于管理HDFS集群,这些命令只有集群管理员可以使用,下面有一些简单的命令:
正常的HDFS安装都会配置一个web服务,通过可配的TCP端口对外暴露命名空间,从而使得用户可以通过web浏览器查看文件内容。
如果垃圾回收配置打开,通过FS shell移除的文件不会立刻删除,而是会移动到一个垃圾文件专用的目录(/user/<username>/.Trash),类似回收站,只要文件还存在于那个目录下,则随时可以被回复。绝大多数最近删除的文件都被移动到了垃圾目录(/user/<username>/.Trash/Current),并且HDFS每个一段时间在这个目录下创建一个检查点用于删除已经过期的旧的检查点,详情见 expunge command of FS shell 。在垃圾目录中的文件过期后,NameNode会删除这个文件,文件删除会引起这个文件的所有块的空间空闲,需要注意的是在文件被删除之后和HDFS的可用空间变多之间会有一些时间延迟(个人认为是垃圾回收机制占用的时间)。下面是一些简单的理解删除文件的例子:
当文件复制系数减小时,NameNode会选择多余的需要删除的副本,在收到心跳包时将删除信息发送给DataNode。和上面一样,这个删除操作也是需要一些时间后,才能在集群上展现空闲空间的增加。
HDFS Architecture
③ spark、hive、impala、hdfs的常用命令
对spark、hive、impala、hdfs的常用命令作了如下总结,欢迎大家补充!
1. Spark的使用:
以通过SecureCRT访问IP地址:10.10.234.198 为例进行说明:
先输入:ll //查询集群是否装有spark
>su - mr
>/home/mr/spark/bin/beeline -u "jdbc:hive2:/bigdata198:18000/" -n mr -p ""
>show databases; //显示其中数据库,例如
>use bigmax; //使用数据库bigmax
>show tables; //查询目录中所有的表
>desc formatted TableName; //显示表的详细信息,包括分区、字段、地址等信息
>desc TableName; //显示表中的字段和分区信息
>select count(*) from TableName; //显示表中数据数量,可以用来判断表是否为空
>drop table TableName; //删除表的信息
>drop bigmax //删除数据库bigmax
>describe database zxvmax //查询数据库zxvmax信息
创建一个表
第一步:
>create external table if not exists lte_Amaze //创建一个叫lte_Amaze的表
( //括号中每一行为表中的各个字段的名称和其所属的数据类型,并用空格隔开
DateTime String,
MilliSec int,
Network int,
eNodeBID int,
CID int,
IMSI String,
DataType int,
AoA int,
ServerRsrp int,
ServerRsrq int,
TA int,
Cqi0 Tinyint,
Cqi1 Tinyint //注意,最后一个字段结束后,没有逗号
)
partitioned by (p_date string, p_hour INT) //以p_date和p_hour作为分区
row format delimited fields terminated by ',' /*/*表中行结构是以逗号作为分隔符,与上边的表中字段以逗号结尾相一致*/
stored as textfile; //以文本格式进行保存
第二步:添加分区,指定分区的位置
>alter table lte_Amaze add partition (p_date='2015-01-27',p_hour=0) location'/lte/nds/mr/lte_nds_cdt_uedetail/p_date=2015-01-27/p_hour=0';
//添加lte_Amaze表中分区信息,进行赋值。
//并制定分区对应目录/lte/nds/mr下表lte_nds_cdt_uedetail中对应分区信息
第三步:察看添加的结果
>show partitions lte_Amaze; //显示表的分区信息
2. hdfs使用:
#su - hdfs //切换到hdfs用户下 、
#hadoop fs –ls ///查看进程
# cd /hdfs/bin //进入hdfs安装bin目录
>hadoop fs -ls /umtsd/cdt/ //查询/umtsd/cdt/文件目录
>hadoop fs -mkdir /umtsd/test //在/umtsd目录下创建test目录
>hadoop fs -put /home/data/u1002.csv /impala/data/u5002 //将home/data/u1002.csv这个文件put到hdfs文件目录上。put到hdfs上的数据文件以逗号“,”分隔符文件(csv),数据不论类型,直接是数据,没有双引号和单引号
>hadoop fs -rm /umtsd/test/test.txt //删除umtsd/test目录下的test.txt文件
>hadoop fs -cat /umtsd/test/test.txt //查看umtsd/test目录下的test.txt文件内容
3hive操作使用:
#su - mr //切换到mr用户下
#hive //进入hive查询操作界面
hive>show tables; //查询当前创建的所有表
hive>show databases; //查询当前创建的数据库
hive>describe table_name; {或者desc table_name}//查看表的字段的定义和分区信息,有明确区分(impala下该命令把分区信息以字段的形式显示出来,不怎么好区分)
hive> show partitions table_name; //查看表对应数据现有的分区信息,impala下没有该命令
hive> quit;//退出hive操作界面
hive>desc formatted table_name; 查看表结构,分隔符等信息
hive> alter table ceshi change id id int; 修改表的列数据类型 //将id数据类型修改为int 注意是两个id
hive> SHOW TABLES '.*s'; 按正条件(正则表达式)显示表,
[mr@aico ~]$ exit; 退出mr用户操作界面,到[root@aico]界面
impala操作使用:
#su - mr //切换到mr用户下
#cd impala/bin //进入impala安装bin目录
#/impala/bin> impala-shell.sh -i 10.10.234.166/localhost //进入impala查询操作界面
[10.10.234.166:21000] >show databases; //查询当前创建的数据库
[10.10.234.166:21000] >use database_name; //选择使用数据库,默认情况下是使用default数据库
[10.10.234.166:21000] > show tables; //查询当前数据库下创建的所有表
[10.10.234.166:21000] >describe table_name; //查看表的字段的定义,包括分区信息,没有明确区分
[10.10.234.166:21000] > describe formatted table_name; //查看表对应格式化信息,包括分区,所属数据库,创建用户,创建时间等详细信息。
[10.10.234.166:21000] >refresh table_name; //刷新一下,保证元数据是最新的
[10.10.234.166:21000] > alter TABLE U107 ADD PARTITION(reportDate="2013-09-27",rncid=487)LOCATION '/umts/cdt/
MREMITABLE/20130927/rncid=487' //添加分区信息,具体的表和数据的对应关系
[10.10.234.166:21000] > alter TABLE U100 drop PARTITION(reportDate="2013-09-25",rncid=487); //删除现有的分区,数据与表的关联
[10.10.234.166:21000] >quit; //退出impala操作界面
[mr@aicod bin]$ impala-shell; 得到welcome impala的信息,进入impala 查询操作界面
[aicod:21000] > 按两次tab键,查看可以用的命令
alter describe help profile shell values
connect drop history quit show version
create exit insert select unset with
desc explain load set use
④ 在Hadoop中,使用put命令,在test中生成文件myfile,可以直接创建吗命令是什么呢
1. 创建本地的示例数据文件:
依次进入【Home】-【hadoop】-【hadoop-1.2.1】创建一个文件夹file用来存储本地原始数据。
并在这个目录下创建2个文件分别命名为【myTest1.txt】和【myTest2.txt】或者你想要的任何文件名。
分别在这2个文件中输入下列示例语句:
2. 在HDFS上创建输入文件夹
呼出终端,输入下面指令:
bin/hadoop fs -mkdir hdfsInput
执行这个命令时可能会提示类似安全的问题,如果提示了,请使用
bin/hadoop dfsadmin -safemode leave
来退出安全模式。
当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结 束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入 安全模式。
意思是在HDFS远程创建一个输入目录,我们以后的文件需要上载到这个目录里面才能执行。
3. 上传本地file中文件到集群的hdfsInput目录下
在终端依次输入下面指令:
cd hadoop-1.2.1
bin/hadoop fs -put file/myTest*.txt hdfsInput
4. 运行例子:
在终端输入下面指令:
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount hdfsInput hdfsOutput
注意,这里的示例程序是1.2.1版本的,可能每个机器有所不一致,那么请用*通配符代替版本号
bin/hadoop jar hadoop-examples-*.jar wordcount hdfsInput hdfsOutput
应该出现下面结果:
Hadoop命令会启动一个JVM来运行这个MapRece程序,并自动获得Hadoop的配置,同时把类的路径(及其依赖关系)加入到Hadoop的库中。以上就是Hadoop Job的运行记录,从这里可以看到,这个Job被赋予了一个ID号:job_201202292213_0002,而且得知输入文件有两个(Total input paths to process : 2),同时还可以了解map的输入输出记录(record数及字节数)
⑤ 大数据:Hadoop入门
什么是大数据:
(1.)大数据是指在一定时间内无法用常规软件对其内容进行抓取,管理和处理的数据集合,简而言之就是数据量非常大,大到无法用常规工具进行处理,如关系型数据库,数据仓库等。这里“大”是一个什么量级呢?如在阿里巴巴每天处理数据达到20PB(即20971520GB).
2.大数据的特点:
(1.)体量巨大。按目前的发展趋势来看,大数据的体量已经到达PB级甚至EB级。
(2.)大数据的数据类型多样,以非结构化数据为主,如网络杂志,音频,视屏,图片,地理位置信息,交易数据,社交数据等。
(3.)价值密度低。有价值的数据仅占到总数据的一小部分。比如一段视屏中,仅有几秒的信息是有价值的。
(4.)产生和要求处理速度快。这是大数据区与传统数据挖掘最显着的特征。
3.除此之外还有其他处理系统可以处理大数据。
Hadoop (开源)
Spark(开源)
Storm(开源)
MongoDB(开源)
IBM PureDate(商用)
Oracle Exadata(商用)
SAP Hana(商用)
Teradata AsterData(商用)
EMC GreenPlum(商用)
HP Vertica(商用)
注:这里我们只介绍Hadoop。
二:Hadoop体系结构
Hadoop来源:
Hadoop源于Google在2003到2004年公布的关于GFS(Google File System),MapRece和BigTable的三篇论文,创始人Doug Cutting。Hadoop现在是Apache基金会顶级项目,“
Hadoop”一个虚构的名字。由Doug Cutting的孩子为其黄色玩具大象所命名。
Hadoop的核心:
(1.)HDFS和MapRece是Hadoop的两大核心。通过HDFS来实现对分布式储存的底层支持,达到高速并行读写与大容量的储存扩展。
(2.)通过MapRece实现对分布式任务进行处理程序支持,保证高速分区处理数据。
3.Hadoop子项目:
(1.)HDFS:分布式文件系统,整个Hadoop体系的基石。
(2.)MapRece/YARN:并行编程模型。YARN是第二代的MapRece框架,从Hadoop 0.23.01版本后,MapRece被重构,通常也称为MapRece V2,老MapRece也称为 MapRece V1。
(3.)Hive:建立在Hadoop上的数据仓库,提供类似SQL语音的查询方式,查询Hadoop中的数据,
(5.)HBase:全称Hadoop Database,Hadoop的分布式的,面向列的数据库,来源于Google的关于BigTable的论文,主要用于随机访问,实时读写的大数据。
(6.)ZooKeeper:是一个为分布式应用所设计的协调服务,主要为用户提供同步,配置管理,分组和命名等服务,减轻分布式应用程序所承担的协调任务。
还有其它特别多其它项目这里不做一一解释了。
三:安装Hadoop运行环境
用户创建:
(1.)创建Hadoop用户组,输入命令:
groupadd hadoop
(2.)创建hser用户,输入命令:
useradd –p hadoop hser
(3.)设置hser的密码,输入命令:
passwd hser
按提示输入两次密码
(4.)为hser用户添加权限,输入命令:
#修改权限
chmod 777 /etc/sudoers
#编辑sudoers
Gedit /etc/sudoers
#还原默认权限
chmod 440 /etc/sudoers
先修改sudoers 文件权限,并在文本编辑窗口中查找到行“root ALL=(ALL)”,紧跟后面更新加行“hser ALL=(ALL) ALL”,将hser添加到sudoers。添加完成后切记还原默认权限,否则系统将不允许使用sudo命令。
(5.)设置好后重启虚拟机,输入命令:
Sudo reboot
重启后切换到hser用户登录
安装JDK
(1.)下载jdk-7u67-linux-x64.rpm,并进入下载目录。
(2.)运行安装命令:
Sudo rpm –ivh jdk-7u67-linux-x64.rpm
完成后查看安装路径,输入命令:
Rpm –qa jdk –l
记住该路径,
(3.)配置环境变量,输入命令:
Sudo gedit /etc/profile
打开profile文件在文件最下面加入如下内容
export JAVA_HOME=/usr/java/jdk.7.0.67
export CLASSPATH=$ JAVA_HOME/lib:$ CLASSPATH
export PATH=$ JAVA_HOME/bin:$PATH
保存后关闭文件,然后输入命令使环境变量生效:
Source /etc/profile
(4.)验证JDK,输入命令:
Java –version
若出现正确的版本则安装成功。
配置本机SSH免密码登录:
(1.)使用ssh-keygen 生成私钥与公钥文件,输入命令:
ssh-keygen –t rsa
(2.)私钥留在本机,公钥发给其它主机(现在是localhost)。输入命令:
ssh--id localhost
(3.)使用公钥来登录输入命令:
ssh localhost
配置其它主机SSH免密登录
(1.)克隆两次。在VMware左侧栏中选中虚拟机右击,在弹出的快捷键菜单中选中管理---克隆命令。在克隆类型时选中“创建完整克隆”,单击“下一步”,按钮直到完成。
(2.)分别启动并进入三台虚拟机,使用ifconfig查询个主机IP地址。
(3.)修改每台主机的hostname及hosts文件。
步骤1:修改hostname,分别在各主机中输入命令。
Sudo gedit /etc/sysconfig/network
步骤2:修改hosts文件:
sudo gedit /etc/hosts
步骤3:修改三台虚拟机的IP
第一台对应node1虚拟机的IP:192.168.1.130
第二台对应node2虚拟机的IP:192.168.1.131
第三台对应node3虚拟机的IP:192.168.1.132
(4.)由于已经在node1上生成过密钥对,所有现在只要在node1上输入命令:
ssh--id node2
ssh--id node3
这样就可以将node1的公钥发布到node2,node3。
(5.)测试SSH,在node1上输入命令:
ssh node2
#退出登录
exit
ssh node3
exit
四:Hadoop完全分布式安装
1. Hadoop有三种运行方式:
(1.)单机模式:无须配置,Hadoop被视为一个非分布式模式运行的独立Java进程
(2.)伪分布式:只有一个节点的集群,这个节点即是Master(主节点,主服务器)也是Slave(从节点,从服务器),可在此单节点上以不同的java进程模拟分布式中的各类节点
(3.)完全分布式:对于Hadoop,不同的系统会有不同的节点划分方式。
2.安装Hadoop
(1.)获取Hadoop压缩包hadoop-2.6.0.tar.gz,下载后可以使用VMWare Tools通过共享文件夹,或者使用Xftp工具传到node1。进入node1 将压缩包解压到/home/hser目录下,输入命令:
#进入HOME目录即:“/home/hser”
cd ~
tar –zxvf hadoop-2.6.0.tar.gz
(2.)重命名hadoop输入命令:
mv hadoop-2.6.0 hadoop
(3.)配置Hadoop环境变量,输入命令:
Sudo gedit /etc/profile
将以下脚本加到profile内:
#hadoop
export HADOOP_HOME=/home/hser/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
保存关闭,最后输入命令使配置生效
source /etc/profile
注:node2,和node3都要按照以上配置进行配置。
3.配置Hadoop
(1.)hadoop-env.sh文件用于指定JDK路径。输入命令:
[hser@node1 ~]$ cd ~/hadoop/etc/hadoop
[hser@node1 hadoop]$ gedit hadoop-env.sh
然后增加如下内容指定jDK路径。
export JAVA_HOME=/usr/java/jdk1.7.0_67
(2.)打开指定JDK路径,输入命令:
export JAVA_HOME=/usr/java/jdk1.7.0_67
(4.)core-site.xml:该文件是Hadoop全局配置,打开并在
⑥ hadoop基本操作
启动HDFS
通过可视化界面查看HDFS的运行情况
使用方法:
如果是文件,则按照如下格式返回文件信息:
文件名 <副本数> 文件大小 修改日期 修改时间 权限 用户ID 组ID
如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下:
目录名 <dir> 修改日期 修改时间 权限 用户ID 组ID
示例:
返回值:
成功返回0,失败返回-1
使用方法:
将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。
示例:
返回值:
成功返回0,失败返回-1。
使用方法:
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。
返回值:
成功返回0,失败返回-1。
使用方法:
删除指定的文件。只删除非空目录和文件。请参考rmr命令了解递归删除。
示例:
返回值:
成功返回0,失败返回-1。
分布式文件系统的设计思路:
添加环境变量
保存退出后, 让.bash_profile立即生效
进入到解压后的hadoop目录 修改配置文件
集群
⑦ hadoop中命令经常含有-fs,-dfs,fs和dfs有什么区别作用是什么
You can see definitions of the two commands (hadoop fs & hadoop dfs) in
可以看一下hadoop的源代码
$HADOOP_HOME/bin/hadoop
...elif [ "$COMMAND" = "datanode" ] ; then CLASS='org.apache.hadoop.hdfs.server.datanode.DataNode' HADOOP_OPTS="$HADOOP_OPTS $HADOOP_DATANODE_OPTS"elif [ "$COMMAND" = "fs" ] ; then CLASS=org.apache.hadoop.fs.FsShell HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"elif [ "$COMMAND" = "dfs" ] ; then CLASS=org.apache.hadoop.fs.FsShell HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"elif [ "$COMMAND" = "dfsadmin" ] ; then CLASS=org.apache.hadoop.hdfs.tools.DFSAdmin HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"...
So, they are exactly the same.
所以,发现两者是完全一样的功能。
谢谢
⑧ hadoop面试题之HDFS
1、简单介绍下hadoop吧?
广义上hadoop是指与hadoop相关的大数据生态圈。包含hive、spark、hbase等。
狭义上hadoop指的是apache的开源框架。有三个核心组件:
----hdfs:分布式文件存储系统
----yarn:分布式资源管理调度平台
----mr:分布式计算引擎
2、介绍下hdfs?
全称为Hadoop Distributed File System。有三个核心组件:
namenode:有三个作用,第一是负责保存集群的元数据信息,第二是负责维护整个集群节点的正常运行。
第三是负责处理客户端的请求。
datanode:负责实际保存数据。实际执行数据块的读写操作。
secondarynamenode:辅助namenode进行元数据的管理。不是namenode的备份。
3、namenode的工作机制?
namenode在内存中保存着整个内存系统的名称空间和文件数据块的地址映射。整个hdfs可存储的文件数受限于namenode的内存大小。所以hdfs不适合大量小文件的存储。
---namenode有三种元数据存储方式来管理元数据:
》内存元数据:内存中保存了完整的元数据
》保存在磁盘上的元数据镜像文件(fsimage):该文件时hdfs存在磁盘中的元数据检查点,里面保存的是最后一次检查点之前的hdfs文件系统中所有目录和文件的序列化信息。
》数据操作日志文件(edits):用于衔接内存meta data和持久化元数据镜像fsimage之间的操作日志文件。保存了自最后一次检查点之后所有针对hdfs文件系统的操作。如对文件的增删改查。
4、如何查看元数据信息?
因为edits和fsimage文件是经过序列化的,所以不能直接查看。hadoop2.0以上提供了查看两种文件的工具。
----命令:hdfs oiv 可以将fsimage文件转换成其他格式,如xml和文本文件。-i 表示输入fsimage文件。-o 输出文件路径,-p 指定输出文件
hdfs oev可以查看edits文件。同理需要指定相关参数。
详情查看: https://www.imooc.com/article/79705
4、datanode的工作机制?
1)以数据块的形式存储hdfs文件
2)datanode响应客户端的读写请求
3)周期性的向namenode汇报心跳信息、数据块信息、缓存数据块信息
5、secondary namenode工作机制?
当发生checkpoint机制时会触发second namenode进行工作。checkpoint:
新的edists文件不会立即和fsimage文件合并,是在edits文件大小超过(默认)64m,或者时间超过(默认)1小时,会触发checkpoint操作。当checkpoint时,namenode会新建一个edits.new的文件,此时second namenode将文件fsimage文件和edits文件(http get)到本地,然后加载到内存中进行合并,完成的文件名称为fsimage.ckpt。最后 second namenode将该文件(http post)到namenode,然后edits.new和fsimage.ckpt文件转换为fsimage和edits。
6、hdfs的文件副本机制?
所有的文件都是以块的形式保存到hdfs中。块的大小默认为128m。在hdfs-site文件中进行指定。
动态副本创建策略:默认副本数是3,可以在上传文件时,显式设定replication。也可以通过指令修改文件的副本数 hadoop fs -setrep -R 1
7、为实现高可用,hdfs采用了哪些策略?
副本机制、机架感知、心跳机制、安全模式、校验和、回收站、元数据保护、快照机制(具体介绍导航- https://www.jianshu.com/writer#/notebooks/44567747/notes/66453316 )
8、hdfs的存储过程?
①client向hdfs发起写请求,通过RPC与namenode建立通讯。namenode检查文件是否存在等信息,返回是否可以存储。
②client将文件切割为一个个block块,client申请存储第一块block。namenode返回可以存储这个block块的datanode的地址,假设为ABC。
③A到B到C逐级构建pipeline。client向A上传第一个packet,默认为64k。A收到一个packet后会将packet传给B,再传给C。pipeline反方向返回ack信息。最终由第一个节点A将pipelineack发送给client
④一个block完成之后,再进行下一个block的存储过程。
9、hdfs的读过程?
10、hdfs的垃圾桶机制?
hdfs的垃圾桶机制默认是关闭的,需要手动开启。hdfs删除的文件不会立刻就删除,而是在设定的时间后进行删除。
11、hdfs的扩容和缩容
【
12、
⑨ hadoop常用shell命令怎么用
一、常用的hadoop命令
1、hadoop的fs命令
#查看hadoop所有的fs命令
1
hadoop fs
#上传文件(put与FromLocal都是上传命令)
1
2
hadoop fs -put jdk-7u55-linux-i586.tar.gz hdfs://hucc01:9000/jdk
hadoop fs -FromLocal jdk-7u55-linux-i586.tar.gz hdfs://hucc01:9000/jdk
#下载命令(get与ToLocal都是下载命令)
1
2
hadoop fs -get hdfs://hucc01:9000/jdk jdk1.7
hadoop fs -ToLocal hdfs://hucc01:9000/jdk jdk1.7
#将本地一个或者多个文件追加到hdfs文件中(appendToFile)
1
hadoop fs -appendToFile install.log /words
#查询hdfs的所有文件(ls)
1
hadoop fs -ls /
#帮助命令(help)
1
hadoop fs -help fs
#查看hdfs文件的内容(cat和text)
1
2
hadoop fs -cat /words
hadoop fs -text /words
#删除hdfs文件(rm)
1
hadoop fs -rm -r /words
#统计hdfs文件和文件夹的数量(count)
1
hadoop fs -count -r /
#合并hdfs某个文件夹的文件,并且下载到本地(getmerge)
1
hadoop fs -getmerge / merge
#将本地文件剪切到hdfs,相当于对本地文件上传后再删除(moveFormLocal)
1
hadoop fs -moveFromLocal words /
#查看当前文件系统的使用状态(df)
1
hadoop fs -df
二、常用的hdfs命令(这个用的比较多)
用法跟hadoop命令一样,推荐2.0之后使用hdfs命令
1
hdfs dfs
⑩ 把hadoop/bin添加到path下 以后随便什么地方都可以直接执行start-all,sh具体
设置临时环境变量(只在单个终端 内起作用)
1、首先设置HADOOPHOME环境变量,执行命令:export HADOOPHOME=/../hadoop/hadoop-2.5.2/bin (后面参数为Hadoop安装位置下的bin目录)---删除环境变量的命令为 unset HADOOPHOME
2、把HADOOPHOME添加到PATH变量中,执行命令:PATH=$PATH:$HADOOPHOME(当然可以省略第一步,直接把路径添加到PATH中也可以)至此可以在任何位置操作Hadoop的命令了
设置永久环境变量
通过修改 /etc/profile 文件来修改环境变量
修改位置如下:
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin after
pathmunge /home/hadoop/hadoop-2.5.2/bin
fi
其中 pathmunge /home/hadoop/hadoop-2.5.2/bin为要添加的,
然后执行命令:source /etc/profile 使其生效
执行命令:echo $PATH 查看就会多出/home/hadoop/hadoop-2.5.2/bin这个路径,就可以在任意地址下执行Hadoop的命令了