拓荒者

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

进入了属于我的master

前置准备工作

CDH环境说明

集群目前是以应用用途来划分hdfs用户,因此没有各位同学专属的目录。为此需要各位同学自行设置环境变量指明当前的hdfs用户,建议使用hdfs作为用户。具体做法为在远程终端登录之后(XSHELL 登录成功之后 ) 中执行如下命令。

1
export HADOOP_USER_NAME=hdfs

或者可以将上述命令添加到自己使用的shell环境变量配置文件,以避免每次都需要重新执行上述命令,默认情况下用户配置文件是指是~/.bashrc。

可以通过 vim 文本处理命令添加。也可以通过下面的命令直接完成。

1
2
echo "export HADOOP_USER_NAME=hdfs" >> ~/.bashrc
source ~./bashrc

在我们指明了当前的用户之后,分布式文件系统的相对目录会对应在分布式文件系统的/user/hdfs 目录下。

准备工作

为了避免各位同学的数据之间有混淆,建议建立一个自己的文件夹,这里以bigdata9为例。请注意自己运行时以自己的账号为文件夹名称,或其他可以与其它同学区别开的文件夹名称。

1
hadoop fs -mkdir bigdata9

之后我们可以使用该目录作为我们使用的目录。
以实验一为例子。

实验一(SHELL版 )

生成实验所需要的数据文件。

1
mkdir input 
1
2
3
4
for i in {1..5};
do
echo $i$i$i >> input/$i.txt;
done
1
mv 3.txt 3.abc

通过这样我们把实验所需的数据生成在了input目录下。
我们可以看到input目录下的文件为

1
2
3
4
5
1.txt
2.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版

创建好的文件

HDFS

合并后

二、JavaAPI版:

代码如下:

1
2
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;

/**
* Author:WangChenXI
* HuYaNING
* YinGuanNAN
* Date:2021/10/20 16:55
*/
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);
}
}

实验效果:

web端查看hadoop

合并后的效果

实验七

实验环境:

(1)IDE:idea

(2)Hadoop版本:3.1.0

(3)辅助工具:big data tools

实验生成测试数据代码:

1
2
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()

实验指导:

创建了文件夹:

practice07创建成功

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

上传文件时出错

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