拓荒者
我们身为HNUST第一批数据科学与大数据技术专业的本科生,非常激动能够使用学院提供的服务器集群,并在这里留下属于我们的痕迹。

前置准备工作
CDH环境说明
集群目前是以应用用途来划分hdfs用户,因此没有各位同学专属的目录。为此需要各位同学自行设置环境变量指明当前的hdfs用户,建议使用hdfs作为用户。具体做法为在远程终端登录之后(XSHELL 登录成功之后 ) 中执行如下命令。
| 1
 | export HADOOP_USER_NAME=hdfs
 | 
或者可以将上述命令添加到自己使用的shell环境变量配置文件,以避免每次都需要重新执行上述命令,默认情况下用户配置文件是指是~/.bashrc。
可以通过 vim  文本处理命令添加。也可以通过下面的命令直接完成。
| 12
 
 | echo "export HADOOP_USER_NAME=hdfs" >> ~/.bashrcsource ~./bashrc
 
 | 
在我们指明了当前的用户之后,分布式文件系统的相对目录会对应在分布式文件系统的/user/hdfs 目录下。
准备工作
为了避免各位同学的数据之间有混淆,建议建立一个自己的文件夹,这里以bigdata9为例。请注意自己运行时以自己的账号为文件夹名称,或其他可以与其它同学区别开的文件夹名称。
| 1
 | hadoop fs -mkdir bigdata9
 | 
之后我们可以使用该目录作为我们使用的目录。
 以实验一为例子。
实验一(SHELL版 )
生成实验所需要的数据文件。
| 12
 3
 4
 
 | for i in {1..5};do
 echo $i$i$i >> input/$i.txt;
 done
 
 | 
通过这样我们把实验所需的数据生成在了input目录下。
 我们可以看到input目录下的文件为
| 12
 3
 4
 5
 
 | 1.txt2.txt
 3.abc
 4.txt
 5.txt
 
 | 
把input目录上传到我们先前准备的文件目录
| 1
 | hadoop fs -put input bigdata9
 | 
运行如下命令可以查看我们的在 HDFS下的文件 
| 1
 | hadoop fs -ls bigdata9/input
 | 
对于实验一我们可以通过如下一行命令完成
| 1
 | hadoop fs -ls bigdata9/input | awk '{print $8}'| sed -e '1d'|grep -v ".abc$"|xargs hadoop fs -cat  
 | 
可以看到输出中没有以abc为后缀名的文件内容 (333),如果需要将输出内容全部保存,则可以通过使用输出重定向完成。也就是在上述命令的末尾添加 >> merge.txt 完成输出的保存。需要注意的是这样文件会被保存在当前本地目录下。
实验一
实验环境:
(1)IDE:idea
(2)Hadoop版本:3.1.0
(3)辅助工具:big data tools
(本次实验为分布式环境下HDFS编程实例)
任务描述:
假设在HDFS下有几个文件,分别是file1.txt、file2.txt、file3.txt、file4.abc、file5.abc,这里需要从目录中过滤出所有后缀不为.abc的文件,对过滤之后的文件进行读取,并将这些文件的内容合并到文件merge.txt中。
实验步骤:
一、Shell版



二、JavaAPI版:
代码如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 
 | package com.van;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.IOUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
 
 
 
 
 
 
 
 public class Hadoop_practice01 {
 
 private FileSystem fs;
 Path workDir;
 Path resultFile;
 Configuration conf ;
 @Before
 public void Init() throws URISyntaxException, IOException, InterruptedException {
 URI uri = new URI("hdfs://125.221.232.243:8020");
 String user = "hdfs";
 conf = new Configuration();
 fs = FileSystem.get(uri, conf,user);
 }
 
 @After
 public void close() throws IOException {
 fs.close();
 }
 @Test
 public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
 fs.mkdirs(new Path("bigdata82/Practice01"));
 }
 
 @Test
 public void testMerge() throws IOException {
 workDir = new Path("bigdata82/Practice01");
 resultFile = new Path(workDir, "merge.txt");
 Path[] paths = Arrays.stream(fs.listStatus(workDir, path -> !path.toString().matches("[\\s\\S]*?\\.abc")) ).map(FileStatus::getPath).toArray(Path[]::new);
 fs.createNewFile(resultFile);
 fs.concat(resultFile, paths);
 InputStream resultFile= fs.open(this.resultFile);
 System.out.println("合并后的 merge.txt 内容");
 IOUtils.copyBytes(resultFile, System.out, conf);
 }
 }
 
 | 
 实验效果:


实验七
实验环境:
(1)IDE:idea
(2)Hadoop版本:3.1.0
(3)辅助工具:big data tools
实验生成测试数据代码:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | import random
 """
 Author: HuYaNING
 Date: 2021.10.23 18:41
 """
 
 txtName = "Generate_data04.txt"
 txtLine = 188
 pid = ["01","02","03","04","05","06","07","08","09","10"]
 i = 1;
 f = open(txtName,'w',encoding="utf-8")
 while(i<=txtLine):
 f.write(str(1000+i)+"  "+pid[random.randint(0,9)]+"  "+str(i)+"\n")
 i = i+1
 f.close()
 
 | 
实验指导:
创建了文件夹:

在从终端上传文件到远端时出错:

原因:windows下没有hadoop的环境变量,需要安装Hadoop解决。