文件传入hdfs
文件存放目录:是在集群中的datanode对应的机器中,目录的根目录是在core-site.xml中配置的hadoop.tmp.dir
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-3.2.0/tmp</value>
全路径为(在finalized文件夹下):/home/hadoop/hadoop-3.2.0/tmp/dfs/data/current/BP-297062598-192.168.0.104-1554531135625/current/finalized/
查看hdfs根目录:
真正命令为 hadoop fs -ls hdfs://hadoop00:9000/
因为启动的是hdfs的客户端,所以系统会通过hadoop配置文件进行补全,所以只需要 hadoop fs -ls /即可,效果一样的。
而ls /查看的是linux的根目录下的文件
- 上传文件
通过echo sdhuwnf > lhf.txt
创建文件。
通过hadoop fs -put lhf.txt /
将文件上传到hdfs中
通过hadoop fs -ls /
查看文件
其中图片中1:表示权限;2:上传用户;3:用户在哪个组;4:上传时间;5:文件名
在虚拟中打开网页中查看:http://hadoop00:9870下的Utilites下的Browse the file system
可以看到在根目录下存储相同的一个文件
点击文件可以进行下载和查询文件信息
可以通过cat命令来对文件进行访问
真正文件在hadoop集群中存在的位置
放在就近的集群机器上的路径 hadoop-3.2.0/tmp/dfs/data/current/BP-297062598-192.168.0.104-1554531135625/current/finalized/subdir0/subdir0/下重命名后,加上一个ID和描述信息(meta)
在另一台虚拟机上192.168.0.104上也存在相应文件,但是在192.168.0.102上不纯在文件,这就符合我们双备份的原理。以下为192.168.0.102上无此文件夹。
通过在另一台的备份地址通过cat查看内容得到之前的一致。
大文件切割存储
当文件大于128M的文件会进行切割。现上传一个329.61M的hadoop安装包文件。通过网页或者命令查看的文件都为329.61M大小,而安装包在真正存储的地方被分开成三个部分。
可以看到hadoop00上有26、27、28三个部分;hadoop01上只有26;bigdata02上有27、28
PS:如果在一台机器上存储所有的文件块,通过手动拼接三个文件,这个文件和原文件一样,可以进行解压
datanode通过一定的偏移量进行拆分。正常情况下,我们要手动进行拼接,直接通过hadoop进行下载即可,datanode会直接拼接好。
文件下载
通过hadoop fs -get /hadoop-3.2.0.tar.gz
进行下载,重新获取这个完整的文件。
框架是在客户端拼接的,hdfs是通过一块一块进行传递,将一块传递完成后再传另一块,当全部传递完成即使完整的文件了
MapReduce使用
有示范,我们使用架包中的示范(wordcount)
- 创建一些数据
同vi创建两个文件:a.tst;b.txt;内容随意。并将两个文件放到hdfs的指定文件夹中。hadoop fs -mkdir -p /workcount/input
创建文件夹hadoop fs -put a.tst b.txt /workcount/input
上传文件
web中D开头的表示文件夹;点击进入后发现上传的两个文件夹 - 调用方法
cd apps/hadoop-3.2.0/share/hadoop/mapreduce/
通过以上命令进入架包目录
通过命令调用架包执行wordcount方法(hadoop jar hadoop-mapreduce-examples-3.2.0.jar wordcount /wordcount/input/ /wordcount/output
),将结果存储到output目录中(注:输出文件夹需要为不存在,不然会报错)
问题
hadoop伪分布式wordcount报错Container exited with a non-zero exit code 1. Error file: prelaunch.err
原因:
解决方法:
在mapred-site.xml
文件中添加mapreduce所需要用到的classpath。
$HADOOP_MAPRED_HOME
要写安装hadoop的绝对路径,我的是/home/hadoop/apps/hadoop-3.2.0/
,所以最后就是
问题解决转载:https://blog.sunriseydy.top/technology/big-data/hadoop/cannotfind-mrappmaster/
- 结果查看
在指定的目录下生成了两个文件,其中_SUCCESS表示运行结果,而part-r-00000为运行后的内容
通过hadoop fs -cat /workcount/output/part-r-00000
查看内容
HDFS常用命令
通过 hadoop fs
可以查看
其中需要注意的:
-help
功能:输出这个命令参数手册
-ls
功能:显示目录信息
示例: hadoop fs -ls hdfs://hadoop-server01:9000/
备注:这些参数中,所有的hdfs路径都可以简写
–>hadoop fs -ls / 等同于上一条命令的效果
-mkdir
功能:在hdfs上创建目录
示例:hadoop fs -mkdir -p /aaa/bbb/cc/dd
-moveFromLocal
功能:从本地剪切粘贴到hdfs
示例:hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd
-moveToLocal
功能:从hdfs剪切粘贴到本地
示例:hadoop fs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt
-appendToFile
功能:追加一个文件到已经存在的文件末尾
示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt
可以简写为:
Hadoop fs -appendToFile ./hello.txt /hello.txt
-cat
功能:显示文件内容
示例:hadoop fs -cat /hello.txt
-tail
功能:显示一个文件的末尾
示例:hadoop fs -tail /weblog/access_log.1
-text
功能:以字符形式打印一个文件的内容
示例:hadoop fs -text /weblog/access_log.1
-chgrp
-chmod
-chown
功能:linux文件系统中的用法一样,对文件所属权限
示例:
hadoop fs -chmod 666 /hello.txt
hadoop fs -chown someuser:somegrp /hello.txt
-copyFromLocal
功能:从本地文件系统中拷贝文件到hdfs路径去
示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
-copyToLocal
功能:从hdfs拷贝到本地
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
-cp
功能:从hdfs的一个路径拷贝hdfs的另一个路径
示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-mv
功能:在hdfs目录中移动文件
示例: hadoop fs -mv /aaa/jdk.tar.gz /
-get
功能:等同于copyToLocal,就是从hdfs下载文件到本地
示例:hadoop fs -get /aaa/jdk.tar.gz
-getmerge
功能:合并下载多个文件
示例:比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,…
hadoop fs -getmerge /aaa/log.* ./log.sum
-put
功能:等同于copyFromLocal
示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-rm
功能:删除文件或文件夹
示例:hadoop fs -rm -r /aaa/bbb/
-rmdir
功能:删除空目录
示例:hadoop fs -rmdir /aaa/bbb/ccc
-df
功能:统计文件系统的可用空间信息
示例:hadoop fs -df -h /
-du
功能:统计文件夹的大小信息
示例:
hadoop fs -du -s -h /aaa/*
-count
功能:统计一个指定目录下的文件节点数量
示例:hadoop fs -count /aaa/
-setrep
功能:设置hdfs中文件的副本数量
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
<这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量>
例如设置了10个副本,但是实际上只用3台机器,真是副本数为3,但增加一台机器后,会将文件同步过去,副本变为4