[http://hadoop.apache.org/releases.html ](http://hadoop.apache.org/releases.html)
上传:上传到master机器节点的目录~/bigdata下(可以用FileZilla等ftp工具上传)
需要预先在master节点中的hadoop-jrq用户下的主目录下创建bigdata目录:
即执行mkdir bigdata
cd ~/bigdata
解压hadoop-2.7.5 tar: tar -zxvf ~/bigdata/hadoop-2.7.5.tar.gz
修改配置文件(在~/bigdata/hadoop-2.7.5/etc/hadoop下):
cd ~/bigdata/hadoop-2.7.5/etc/hadoop
fs.defaultFS
hdfs://master:9999
表示HDFS的基本路径
dfs.replication
2
表示数据块的备份数量,不能大于DataNode的数量
dfs.namenode.name.dir
/home/hadoop-jrq/bigdata/dfs/name
表示NameNode需要存储数据的地方
dfs.datanode.data.dir
/home/hadoop-jrq/bigdata/dfs/data
DataNode存放数据的地方
mkdir -p ~/bigdata/dfs/name
mkdir -p ~/bigdata/dfs/data
在hadoop-env.sh中添加JAVA_HOME:
export JAVA_HOME=你的java路径
slave1
slave2
在slave1和slave2节点中的hadoop-jrq用户下的主目录下创建bigdata目录:
即执行mkdir bigdata
scp -r ~/bigdata/dfs hadoop-jrq@slave1:~/bigdata
scp -r ~/bigdata/dfs hadoop-jrq@slave2:~/bigdata
scp -r ~/bigdata/hadoop-2.7.5 hadoop-jrq@slave1:~/bigdata
scp -r ~/bigdata/hadoop-2.7.5 hadoop-jrq@slave2:~/bigdata
export HADOOP_HOME=~/bigdata/hadoop-2.7.5
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source ~/.bash_profile
which hdfs看看输出是否是:~/bigdata/hadoop-2.7.5/bin/hdfs
如果不是可能需要退出xshell,重新登录
运行hdfs
格式化: hdfs namenode -format
启动hdfs: 运行start-dfs.sh
http://master:50070看下是否部署成功
停止hdfs: 运行stop-dfs.sh
$HADOOP_HOME/bin/hadoop fs == $HADOOP_HOME/bin/hdfs dfs
hadoop fs -mkdir [-p] hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -put [-f -d] [localFile1...localFile2] hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -put - hdfs://master:9999/user/hadoop-jrq/cmd/out.txt => 从标准流中上传数据
hadoop fs -copyFromLocal [-f -d] localFile hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -cat hdfs://master:9999/user/hadoop-jrq/cmd/word.txt
hadoop fs -ls [-d -h -r] hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -chmod [-R] 777 hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -touchz hdfs://master:9999/user/hadoop-jrq/cmd/flag.txt
hadoop fs -du [-s -h] hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -df [-h] hdfs://master:9999/
hadoop fs -mv hdfs://master:9999/user/hadoop-jrq/cmd/file hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -get [-f] hdfs://master:9999/user/hadoop-jrq/cmd
hadoop fs -rm [-r -skipTrash] hdfs://master:9999/user/hadoop-jrq/cmd/word.txt
默认文件删除就恢复不出来了
如果想恢复出来的话,需要配置Trash机制,在core-site.xml中配置:
fs.trash.interval
3
3表示3分钟内可以恢复
scp core-site.xml hadoop-jrq@slave1:~/bigdata/hadoop-2.7.5/etc/hadoop/
scp core-site.xml hadoop-jrq@slave2:~/bigdata/hadoop-2.7.5/etc/hadoop/
重启Hadoop集群
hadoop fs -rm -r /user/hadoop-jrq/cmd-20180326
hadoop fs -cp hdfs://master:9999/user/hadoop-jrq/.Trash/180326230000/user/hadoop-jrq/* /user/hadoop-jrq => 从Trash中恢复出来
hadoop fs -rm -r -skipTrash /user/hadoop-jrq/cmd-20180326 => 删除的文件不放在Trash中
dfs.webhdfs.enabled
true
使得可以使用http的方式访问HDFS
使用http访问:
http://master:50070/webhdfs/v1/user/hadoop-jrq/cmd/error.txt?op=LISTSTATUS
支持的op见:
[http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/WebHDFS.html](http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/WebHDFS.html)
数据块的默认大小为: 128M
设置数据块的大小为: 256M * 1024 * 1024
在${HADOOP_HOME}/etc/hadoop/hdfs-site.xml中加上配置:
```
dfs.block.size
268435456
```
数据块的默认备份数是3
单独设置数据块的备份数
hadoop fs -setrep 2 /users/hadoop-jrq/cmd/word.txt 备份两份
数据块都是存储在每一个DataNode所在的机器本地磁盘文件中
1、register : 将自身的一些信息(hostname, version等)告诉name node,name node经过check后使其成为集群中的一员
2、block report :将block的信息汇报给name node,使得name node可以维护数据块和数据节点之间的映射关系
3、定期的send heartbeat :
3.1 :告诉name node我还活着,我的存储空间还有多少等信息
3.2 :执行name node通过heartbeat传过来的指令,比如删除数据块
名字节点中维护了两层关系:
1、HDFS文件系统的文件目录树,以及文件数据块的索引,即每一个文件对应的数据块列表
2、数据块与数据节点的关系,即某一数据块保存在哪些数据节点中
1、/user/hadoop-jrq/cmd/word.txt => b1,b2,b3
2、/user/hadoop-jrq/cmd/temp.txt => b4,b5
为了使得客户端访问的速度最快,那么这些数据放在内存中
但是,如果NameNode进程崩溃或者所在机器断电,那么上述的数据全部丢失,系统无法恢复
所以,上述的数据必须保存在磁盘中(也就说内存保存一份,磁盘保存一份)
编辑日志(EditsLog):保存着所有对元数据的改动日志
命名空间镜像(FSImage):负责将内存中的数据按照合理的格式定期的保存在磁盘中
保存着某一时刻的目录信息
FSImage是某一时刻的内存元数据的真实组织情况,
而EditsLog则是记录了该时刻后所有元数据的改动
从而保证NameNode中的数据不会丢掉,可以从磁盘中恢复出来
用于给NameNode
来合并Edits日志和FsImage的
1、NameSpace用于存储树状文件目录等、还支持创建、删除以及查询文件目录等操作
2、Block Storage包括了数据块的管理、数据块的存储等
3.Block Pool: 一个NameSpace的数据块池,每一个Block Pool是独立管理的,互不影响
dfs.nameservices
ns1,ns2
dfs.namenode.rpc-address.ns1
master:9999
dfs.namenode.http-address.ns1
master:50070
dfs.namenode.secondary.http-address.ns1
master:9001
dfs.namenode.rpc-address.ns2
slave1:9999
dfs.namenode.http-address.ns2
slave1:50070
dfs.namenode.secondary.http-address.ns2
slave1:9001
scp hdfs-site.xml hadoop-jrq@slave1:~/bigdata/hadoop-2.7.5/etc/hadoop/
scp hdfs-site.xml hadoop-jrq@slave2:~/bigdata/hadoop-2.7.5/etc/hadoop/
fs.defaultFS
hdfs://slave1:9999
表示HDFS的基本路径
bin/hdfs namenode -format -clusterId CID-1cd5229f-4586-457a-8b09-487e879cf1ad
clusterId :一个集群的ID是一样的
上述操作虽然增加了一个namenode但是slave1却成为了一个单独的namenode,上传到master的目录,slave1是查看不到的,slave1的namenodemaster也是看不到的,这不是我们希望的
配置core-site.xml:
将之前的:注释掉
```
fs.defaultFS
hdfs://master:9999
表示HDFS的基本路径
```
换成如下:
```
fs.default.name
viewfs://my-cluster // 这个名字是自己起的
```
增加mountTable.xml:
```
fs.viewfs.mounttable.my-cluster.link./user
hdfs://master:9999/user // user是目录名,配置后两者共享 有多少个目录,就配置多少
fs.viewfs.mounttable.my-cluster.link./tmp
hdfs://master:9999/tmp
fs.viewfs.mounttable.my-cluster.link./projects/foo
hdfs://slave1:9999/projects/foo
fs.viewfs.mounttable.my-cluster.link./projects/bar
hdfs://slave1:9999/projects/bar
```
scp core-site.xml mountTable.xml hadoop-jrq@slave1:~/bigdata/hadoop-2.7.5/etc/hadoop/
scp core-site.xml mountTable.xml hadoop-jrq@slave2:~/bigdata/hadoop-2.7.5/etc/hadoop/
重启hdfs集群
现在在哪里执行hadoop fs -ls / 都是一样的
hdfs dfsadmin -allowSnapshot /user/hadoop-jrq/cmd => 允许这个文件路径可以创建snapshots
hdfs dfs -createSnapshot /user/hadoop-jrq/cmd cmd-20180326-snapshot => 创建snapshots
hdfs dfs -ls /user/hadoop-jrq/cmd/.snapshot/cmd-20180326-snapshot => 查看snapshots
hdfs dfs -touchz /user/hadoop-jrq/cmd/test1.txt => 不小心往文件中写入了一个错误数据文件
hdfs dfs -touchz /user/hadoop-jrq/cmd/test2.txt => 不小心往文件中写入了一个错误数据文件
hdfs dfs -createSnapshot /user/hadoop-jrq/cmd cmd-20180327-snapshot => 创建snapshots
hdfs snapshotDiff /user/hadoop-jrq/cmd cmd-20180326-snapshot cmd-20180327-snapshot
hdfs dfs -cp -ptopax /user/hadoop-jrq/cmd/.snapshot/cmd-20180326-snapshot /user/hadoop-jrq/ => 恢复文件
hdfs dfs -deleteSnapshot /user/hadoop-jrq/cmd cmd-20180327-snapshot => 删除snapshots
hdfs dfs -renameSnapshot /user/hadoop-jrq/cmd cmd-20180327-snapshot new_snapshot => 重命名snapshots
hdfs lsSnapshottableDir => 查看所有的snapshots
hdfs dfsadmin -disallowSnapshot => 不允许这个path创建snapshots
hdfs balancer
[-threshold => 默认是10,表示每一个datanode的存储使用率和整个集群存储的使用率的差值]
[-policy => 默认是datanode表示对datanode的存储进行平衡,还有一个值为blockpool,表示每一个datanode中的 blockpool平衡就行]
[-exclude [-f | ]]
[-include [-f | ]]
[-idleiterations => 默认是5,表示退出之前几次空的迭代]
当集群处于Safemode状态的时候,我们是不能对集群的数据进行更改的(删除和增加)
hdfs dfsadmin -safemode get => 查询safemode的状态
hdfs dfsadmin -safemode enter => 进入到savemode状态
hdfs dfs -mkdir /user/hadoop-jrq/savemode => 在savemode状态下不能修改集群的数据
hdfs dfsadmin -safemode leave => 离开savemode状态
集群刚启动的时候会是SaveMode状态
我们对集群进行维护的时候,不想客户端更改集群任何数据的时候