HDFS编程实践(Hadoop3.1.3)
⽬录
HDFS编程实践(Hadoop3.1.3)
1,在学习HDFS编程实践前,我们需要启动Hadoop(版本是Hadoop3.1.3)。执⾏如下命令:
cd /usr/local/hadoop    #切换到hadoop的安装⽬录
./sbin/start-dfs.sh    #启动hadoop
⼀、利⽤Shell命令与HDFS进⾏交互
Hadoop⽀持很多Shell命令,其中fs是HDFS最常⽤的命令,利⽤fs可以查看HDFS⽂件系统的⽬录结构、上传和下载数据、创建⽂件等。
① 查看fs总共⽀持了哪些命令:    ./bin/hadoop fs
② 查看具体某个命令的作⽤: (例如:我们查看put命令如何使⽤):    ./bin/hadoop fs -help put
1.⽬录操作:
(前提切换到hadoop的安装⽬录下)
hadoop fs -ls <path>:  显⽰<path>指定的⽂件的详细信息(查看⽂件夹列表)
hadoop fs -mkdir <path>:  创建<path>指定的⽂件夹 (创建⽂件夹)
hadoop fs -cat <path>:将<path>指定的⽂件的内容输出到标准输出(stdout)(查看⽂件内容)
hadoop fs -copyFromLocal <localsrc> <dst>:将本地源⽂件<localsrc>复制到路径<dst>指定的⽂件或⽂件夹中(复制⽂件)
● 通过Web界⾯的”Utilities”菜单下⾯的“Browse the filesystem”查看⽂件
cd /usr/local/hadoop
./bin/hdfs dfs -mkdir -p /user/hadoop
■ 该命令中表⽰在HDFS中创建⼀个“/user/hadoop”⽬录,“–mkdir”是创建⽬录的操作,“-p”表⽰如果是多级⽬录,则⽗⽬录和⼦⽬录⼀起创建,
这⾥“/user/hadoop”就是⼀个多级⽬录,因此必须使⽤参数“-p”,否则会出错。
② 查看⽬录下的内容:
./bin/hdfs dfs -ls .
■ 该命令中 . 表⽰HDFS中的当前⽤户⽬录, 即 “/user/hadoop”⽬录
■ 列出HDFS上的所有⽬录命令:./bin/hdfs dfs -ls
③ 创建⼀个input⽬录:
./bin/hdfs dfs -mkdir input
■  在HDFS的根⽬录下创建⼀个名称为input的⽬录:
./bin/hdfs dfs -mkdir /input
④ rm命令删除⼀个⽬录或⽂件(删除 input ⽬录):
./bin/hdfs dfs -rm -r /input
2.⽂件操作:
■  在本地Linux⽂件系统的“/home/hadoop/”⽬录下创建⼀个⽂件,⾥⾯可以随意输⼊⼀些内容,Linux创建⽂件命令: touch filename
① 上传:上传本地⽂件()到HDFS:(上传到HDFS的“/user/hadoop/input/”⽬录下:)
./bin/hdfs dfs -put /home/ input
■ ■ ■ 向HDFS中上传任意⽂本⽂件,如果指定的⽂件在HDFS中已经存在,由⽤户指定是追加到原有⽂件末尾还是覆盖原有的⽂件:✿bug:Comman ‘hdfs’ not found,did you mean: command ‘hfs’ from deb hfsutils-tcltk…
■原因是没有在bin⽬录下设置PATH,因此相关hadoop或者hdfs的命令都⽆法正常使⽤。
解决:
① sudo vi /etc/profile
②然后在最下⾯加⼊⼀⾏配置PATH:(i 键进⼊编辑状态,Esc 退出编辑键,ZZ(两个⼤写的ZZ)保存并退出vim)export PATH=/usr/local/hadoop/bin:$PAT
1③ 使配置⽴即⽣效:source /etc/profile
1# ■ 向HDFS 中上传任意⽂本⽂件,如果指定的⽂件在HDFS 中已经存在,由⽤户指定是追加到原有⽂件末尾还是覆盖原有的⽂件:
(这⾥的hello 是hadoop 上的⽂件(/user/ ), 是Linux 本地⽂件)
1
2
3
4if  $(hdfs dfs -test -);                #检查hadoop 系统上是否存在hello ⽂件了then $(hdfs dfs - );    #存在,将本地⽂件 中的内容追加到 中else  $(hdfs dfs -copyFromLocal - ); #不存在,将本地⽂件 覆盖替换到 hadoop 系统中fi
( 是Hadoop 系统中的⼀个⽂件, ~/下载/ 是本地⽂件)
② ■ ■ ■ 从 HDFS 中下载指定⽂件,如果本地⽂件与要下载的⽂件名称相同,则⾃动对下载的⽂件重命名;
(file:///下载/ 是本地⽂件)if $(hdfs dfs -test -e file:///下载/)  # hadoop 系统上是否存在⽂件名(与本地系统中的
<)相同?
③ ■ ■ ■
将 HDFS 中指定⽂件的内容输出到终端中;    -cat 命令啦  ./bin/hdfs dfs -cat myHadoopFile
④ ■ ■ ■
显⽰ HDFS 中指定的⽂件的读写权限、⼤⼩、创建时间、路径等信息; -ls 命令啦  ./bin/hdfs dfs -ls myHadoopFile ⑤ ■ ■ ■ 给定 HDFS 中某⼀个⽬录,输出该⽬录下的所有⽂件的读写权限、⼤⼩、创建时间、路径等信息,
如果该⽂件是⽬录,则递归输出该⽬录下所有⽂件相关信息; (-ls 命令 的递归选项啦 -R) ./bin/hdfs dfs -ls -R myHadoopDir
⑥  ■ ■ ■ 提供⼀个 HDFS 内的⽂件的路径,对该⽂件进⾏创建和删除操作;-rm 命令啦  ./bin/hdfs dfs -rm myHadoopFile (如果⽂件所在⽬录不存在,则⾃动创建⽬录)
linux命令查看文件夹大小
⑦ 供⼀个 HDFS 的⽬录的路径,对该⽬录进⾏创建和删除操作。创建⽬录时,如果⽬录⽂件所在⽬录不存在,则⾃动创建相应⽬录;删除⽬录时,由⽤户指定当该⽬录不为空时是否还删除该⽬录; -rmr 命令
例如:hadoop fs -rmr myHadoopDir
⑧ 向 HDFS 中指定的⽂件追加内容,由⽤户指定内容追加到原有⽂件的开头或结尾;
./bin/hdfs dfs - ./
(注意:appendToFile 是将当地⽂件内容追加的到 hadoop 上的⽂件(不能hadoop上的⽂件1 追加给 hadoop上的⽂件2))
⑨ 删除 HDFS 中指定的⽂件; -rm 命令即可
⑩ 在HDFS中,将⽂件从源路径移动到⽬的路径; -mv 命令<src> <dest>
例如:hadoop fs -mv /usr/local/ /usr/local/hadoop/hadoop_
●  使⽤ls命令查看⼀下⽂件是否成功上传到HDFS中:  ./bin/hdfs dfs -ls input
●  使⽤-cat 命令查看HDFS中的 的内容:  ./bin/hdfs dfs -cat
●  上传:上传本地⽂件()到HDFS:(上传到HDFS的“/user/hadoop/input/”⽬录下:)./bin/hdfs dfs -put /home/ input
● 下载:从HDFS 下载⽂件到本地:(把HDFS中的⽂件下载到本地⽂件系统中的“/home/hadoop/下
载/”): ./bin/hdfs dfs -get /home/hadoop/下载
●  拷贝:把⽂件从HDFS中的⼀个⽬录拷贝到HDFS中的另外⼀个⽬录
(⽐如,如果要把HDFS的“/user/hadoop/”⽂件,拷贝到HDFS的另外⼀个⽬录“/input”中):
./bin/hdfs dfs -cp /input
● 追加内容:向HDFS中指定的⽂件追加内容,由⽤户指定内容追加到原有⽂件的开头或结尾: ./bin/hdfs dfs - ./
(注意:appendToFile 是将当地⽂件内容追加的到 hadoop 上的⽂件(不能hadoop上的⽂件1 追加给 hadoop上的⽂件2))
⼆、利⽤Web界⾯管理HDFS
三、编程实现以下指定功能,和使⽤ Hadopp 提供的 Shell 命令完成相同的任务。
1. 向HDFS中上传任意⽂本⽂件,如果指定的⽂件在 HDFS 中已经存在,由⽤户指定是追加到原有⽂件末尾还是覆盖原有的⽂件。
hadoop fs -put /User/Binguner/ /test
hadoop fs -appendToFile /User/Binguner/ /
hadoop fs -copyFromLocal -f /User/Binguner/ /
/**
* @param fileSystem
* @param srcPath 本地⽂件地址
* @param desPath ⽬标⽂件地址
*/
private static void test1(FileSystem fileSystem,Path srcPath, Path desPath){
try {
if (ists(new Path("/"))){
System.out.println("Do you want to overwrite the existed file? ( y / n )");
if (new Scanner(System.in).next().equals("y")){
}else {
FileInputStream inputStream = new String());
FSDataOutputStream outputStream  = fileSystem.append(new Path("/"));
byte[] bytes = new byte[1024];
int read = -1;
while ((read = ad(bytes)) > 0){
outputStream.write(bytes,0,read);
}
inputStream.close();
outputStream.close();
}
}else {
}
} catch (IOException e) {
e.printStackTrace();
}
}
2. 从HDFS中下载指定⽂件,如果本地⽂件与要下载的⽂件名称相同,则⾃动对下载的⽂件重命名。hadoop fs -copyToLocal / /User/binguner/
/**
* @param fileSystem
* @param remotePath HDFS 中⽂件的地址
* @param localPath 本地要保存的⽂件的地址
*/
private static void test2(FileSystem fileSystem,Path remotePath, Path localPath){
try {
if (ists(remotePath)){
}else {
System.out.println("Can't find this file in HDFS!");
}
} catch (FileAlreadyExistsException e){
try {
System.out.String());
} catch (IOException e1) {
e1.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
3. 将HDFS中指定⽂件的内容输出到终端中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。