第1关:利用shell把电商数据上传到HDFS
任务描述
原始电商数据都是存储在关系型数据库或 NoSQL 数据库上的,是面向OLTP(联机事务处理过程)的;数据都是面向业务的,而不是面向分析。因此数据比较复杂,表很多关联的数据是分散的,不利于统计分析;因此需要把数据从多个表里导出来、联合起来,找出分析所需要的数据项,然后把这些数据存入到 HDFS 中。
另一方面,因为数据量很大,可能上百 GB 甚至 TB,这些数据超过了单台服务器的内存容量甚至硬盘容量,而且如果都存到一台服务器上,那么读写起来花费时间也是很长的,如果把数据分摊到多个服务器上,那么原本的读写时间就能减倍,HDFS 就能做到这一点。
HDFS 是 Hadoop 中的分布式文件系统,可以高效的利用多台(数百、数千都可以)服务器的存储能力,因此把电商数据存储到 HDFS 中,可以借助强大的 Hadoop 来管理、分析海量的电商数据,以挖掘最大的潜在商业价值。
本关任务:使用 HDFS shell 命令把电商数据从本地上传到 HDFS 中。
相关知识
为了完成本关任务,你需要掌握:HDFS shell常见命令:
HDFS shell常见命令
如果你熟悉 linux 命令,你会发现 HDFS shell 命令类似 linux 的shell命令,在终端直接输入命令行来管理HDFS中的文件、文件夹。常用的HDFS命令如下:
hdfs dfs -ls / 查看目录/下的文件和文件夹;
hdfs dfs -mkdir /images 创建新文件夹/images;
hdfs dfs -rmdir /images 删除文件夹/images;
hdfs dfs -rm /citys.csv 删除文件citys.csv;
hdfs dfs -put data02.csv /dataset 上传本地文件data02.csv到HDFS的文件夹/dataset内;
hdfs dfs -copyFromLocal data02.csv /dataset 上传本地文件data02.csv到HDFS的文件夹/dataset内; hdfs dfs -get /dataset/data02.csv data02_v2.csv 拷贝HDFS的/dataset/data02.csv到本地文件data02_v2.csv;
hdfs dfs -copyToLocal /dataset/data02.csv data02_v2.csv 拷贝HDFS的/dataset/data02.csv到本地文件data02_v2.csv;
hdfs dfs -cp /user/userinfo.txt /data/userinfo.txt 拷贝HDFS的数据文件/user/userinfo.txt到/data/userinfo.txt;
hdfs dfs -mv /user/userinfo.txt /data/userinfo.txt 移动HDFS的数据文件/user/userinfo.txt到/data/userinfo.txt;
hdfs dfs -text /itemsinfo.csv 以文本格式输出/itemsinfo.csv文件;
hdfs dfs -tail /itemsinfo.csv 以文本格式输出/itemsinfo.csv文件,但是只显示末尾1KB大小的数据。
编程要求
本关不需要编写 Java 代码,直接在命令行完成关卡。根据任务提示,启动 hadoop, 把数据文件上传到 HDFS 中。
- 使用
start-all.sh
或start-dfs.sh
启动 hadoop 或 hdfs; - 把
/data/workspace/···/dataset/user_behavior.csv
文件拷贝到/root
目录内(...
里面的都是单文件夹,可以用tab
建自动补全); - 在HDFS中创建一个新文件夹
/dataset
; - 把
user_behavior.csv
文件上传到刚创建的文件夹中; - 打印文件内容,以检测文件是否上传成功。(文件比较大,可使用
hdfs dfs -cat /yourpath | tail -10
只显示末尾10行数据,减少输出量)
代码实现
在命令行输入(一步一回车):
start-all.sh //启动hadoop
cp /data/workspace/myshixun/dataset/user_behavior.csv /root/
hdfs dfs -mkdir /dataset
hdfs dfs -put user_behavior.csv /dataset
当然代码文件不能为空(可以随便敲点东西)
(ps:建议立马开始第二关,因为需要在第一关的基础上。)
第2关:利用Java API把电商数据上传到HDFS
任务描述
目的与第一关一致,部分任务描述可参考第一关。有时候,我们并不想直接用 HDFS 命令来上传输入,比如当上传的文件很多、文件名很长的时候,一次又一次的打 HDFS 命令很慢也可能会出错,这时候可以使用 Java API 的方式,HDFS Java API 是 HDFS 提供的可供 Java 程序调用的接口,类似 JDBC。本关卡将通过 Java 编程的方式来向 HDFS 上传数据文件。
本关任务:使用 HDFS Java API 命令把电商数据user_behavior.csv
从本地上传到 HDFS 中。
相关知识
为了完成本关任务,你需要掌握:常用 HDFS Java接口的使用。
常用 HDFS Java接口的使用
-
获得 HDFS 的
FileSystem
实例,该实例是操作 HDFS 的主要入口;Configuration configuration = new Configuration(); fileSystem fs = FileSystem.get(configuration);
-
FileSystem
对象的常用方法
- 用法举例,使用
FileSystem
对象的mkdir(Path filePath)
方法创建一个新 HDFS 文件目录代码如下:// 创建新目录 "/newPath" Path newPath = new Path("/newPath"); fs.mkdir(newPath);
- 其他方法用法相似,常用方法介绍:
void mkdir(Path filePath) 创建一个新目录; boolean exists(Path filePath) 判断文件是否存在; FSDataInputStream open(Path filePath) 读取文件; boolean rename(Path oldPath, Path newPath) 重命名文件; boolean delete(Path filePath, boolean isRecursion) 删除一个目录或文件,第二个参数如果为 true 则递归删除一个目录所有内容; void copyFromLocalFile(Path src, Path dst) 把本地路径的文件拷贝到HDFS指定路径中; void copyToLocalFile(Path src, Path dst) 把 HDFS 上的文件拷贝到 本地路径中。
编程要求
根据提示,在右侧编辑器补充代码,把本地数据文件上传到 HDFS 中。
- 所使用的本地数据文件路径为
/root/user_behavior.csv
; - 上传至 HDFS 的目录路径为
/dataset
。
代码实现
在代码文件中输入:
package educoder;
import java.io.IOException;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutFile {
public static void main(String[] args) throws IOException, URISyntaxException {
/********** Begin **********/
// 使用本机默认hadoop配置
Configuration config = new Configuration();
// 获得默认HDFS文件系统
FileSystem fs = FileSystem.get(config);
// 数据文件linux路径
String src = "/root/user_behavior.csv";
// 要上传的HDFS路径
Path newPath = new Path("/dataset");
// 在hdfs创建新路径
fs.mkdirs(newPath);
// 使用copyFromLocalFile方法,把本地文件传入到hdfs路径中
fs.copyFromLocalFile(new Path(src),newPath);
/********** End **********/
}
}
命令行需要启动Hadoop。
(ps:如果只需要快速通过,可以什么都不输入,但是得在第一关正确通过的前提下!)