温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
HDFS
作业
参考答案
题目一:编写一个Shell脚本,实现以下功能
1:在HDFS在/目录下创建一个用户目录:itcast
2:在HDFS用户目录itcast下创建日志目录: log
3:在HDFS的log目录下创建三个主机目录: node1 node2 nod3
创建完之后,效果如下:
4:每隔一个小时(提醒: sleep 3600),分别对每台主机的/export/server/hadoop-2.7.5/logs目录下的.log文件进行压缩,压缩文件存放到每台主机的/export/data目录,压缩文件格式:log_2021_01_07_175636.tar.gz
5:每隔1个小时(提醒: sleep 3600),分别将每台主机的/export/data下的压缩后的日志文件上传对/itcast/log下的对应主机目录下,日志上传到HDFS之后,原来本地的日志压缩包要删除
效果如下:
#!/bin/bash
# 主机地址存放目录
HOSTS=${HADOOP_HOME}/etc/hadoop/slaves
# HADOOP_BIN
HADOOP_BIN=${HADOOP_HOME}/bin
# 分别创建hdfs各主机文件对应备份目录
for host in $(cat $HOSTS)
do
echo "创建集群/itcast/log/${host}目录"
hadoop fs -mkdir -p /itcast/log/${host}
echo "目录创建完毕!"
done
# 日志目录
LOGDIR=/export/server/hadoop-2.7.5/logs
#备份路径
BACKUP=/export/data
# 开启备份
while true
do
for host in $(cat $HOSTS)
do
echo "备份时间:北京时间$(date +%Y-%m-%d_%H:%M:%S)"
echo "---------------------开始备份${host}日志数据---------------------"
# 备份时间
BACKUPTIME=$(date +%Y_%m_%d_%H%M%S)
# 备份文件名
BACKUPNAME=log_${BACKUPTIME}.tar.gz
echo "进入${LOGDIR}目录"
# 进入日志目录,备份日志到目标文件夹
echo "将log相关文件备份至${BACKUP}/${BACKUPNAME}"
ssh root@${host} "cd ${LOGDIR};mkdir ${BACKUPTIME};cp *.log ${BACKUPTIME};tar -czvf ${BACKUP}/${BACKUPNAME} ./${BACKUPTIME};rm -rf ${BACKUPTIME};"
# 移动hadoop日志文件到hdfs集群
echo "移动文件至集群/itcast/log/${host}"
ssh root@${host} "${HADOOP_BIN}/hadoop fs -moveFromLocal ${BACKUP}/${BACKUPNAME} /itcast/log/${host}"
echo "-------------------------${host}日志备份结束-------------------------"
done
sleep 3600
done
题目二:使用自己的话(面试)描述HDFS上传文件流程
题目三:使用自己的话(面试)描述HDFS下载文件流程
选做题(可以不做):
题目四:使用HDFS的Java API 封装一个方法uploadDirToHDFS(String localDirPath, String hdfsPath),要求传入一个文件夹路径和HDFS路径,将该文件夹的下所有子文件夹和文件上传到指定的HDFS路径下。
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 java.io.File;
import java.io.IOException;
import .URI;
import .URISyntaxException;
public class LocalToHDFS {
public static void main(String[] args) throws IOException, URISyntaxException {
uploadDirToHDFS("D:\\input\\sort_input","/test");
}
public static void uploadDirToHDFS(String localDirPath, String hdfsPath) throws IOException, URISyntaxException {
//获取hdfs文件系统对象
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node1:8020"), new Configuration());
File dir = new File(localDirPath);
listFiles(dir,fileSystem,hdfsPath);
//关闭
fileSystem.close();
}
private static void listFiles(File dir,FileSystem fileSystem,String hdfsPath) throws IOException {
//获取本地文件夹下面的文件和文件夹
File[] files = dir.listFiles();
if(files != null){
//遍历文件对象
for (File file : files) {
//判断是否是文件
if(file.isFile()){
//拼接本地文件上传HDFS的路径
String parent = file.getParent();
String fileDir = parent.substring(3);
String fileDirPath = fileDir.replaceAll("\\\\", "/");
boolean flag = fileSystem.exists(new Path(hdfsPath+"/"+fileDirPath));
if(!flag){
//上传路径不存在则创建
fileSystem.mkdirs(new Path(hdfsPath+"/"+fileDirPath));
}
//上传文件到HDFS指定路径
fileSystem.copyFromLocalFile(new Path(file.getPath()),new Path(hdfsPath+"/"+fileDirPath));
}else {
//文件目录递归
listFiles(file,fileSystem,hdfsPath);
}
}
}
}
}