资源描述
题目:Hadoop完全分布式环境下的网盘项目
姓名:王宏磊 学号:201500800546 专业:软件工程 班级:15-01班
手机:17863087272
姓名:苗纯源 学号:201500800524 专业:软件工程 班级:15-01班
手机:17863085895
项目
要求
满分
实际得分
起评分
达到题目基本要求
50
流畅性
程序运行过程完整流畅,能清楚说明问题
10
美观性
程序界面美观舒适
10
回答问题
能正确回答老师就代码和程序设计的问题
10
安装步骤
清晰明了
10
编程风格
程序书写正规,程序注释完整规范
10
总评
Part1、安装说明
一、虚拟机和linux系统的安装
我们选择的虚拟机是VMware Workstation Pro14.0,linux系统的版本是CentOS-6.6-x86_64-bin-DVD1.iso
(1) 安装虚拟机,运行VMware Workstation Pro14.0,选择合适的安装路径,从网上找到该版本虚拟机的注册码,输入后一直点下一步直到安装完成即可。
(2) 安装linux系统,打开虚拟机,点击文件->新建虚拟机,选择自定义,下一步,为了防止版本问题,这里选择硬件兼容性为10.x,选择linux系统镜像的路径,设置linux系统的用户名和密码然后点击下一步,处理机数量选择1个即可,内存暂时设置为1g,若以后内存不够可以再修改,网络类型选择NAT,剩下的均为默认设置,一直下一步直到完成。
完成之后打开该新建的虚拟机,虚拟机会自动安装linux操作系统,等待其安装。安装完成之后输入用户名和密码登录到linux系统中。
(3) 关闭防火墙和selinux
学习环境可以直接把防火墙关闭掉
(1) 用root用户登录后,执行查看防火墙状态。
shell命令为: service iptables status
(2) 用service iptables stop关闭防火墙,这个是临时关闭防火墙。
(3) 如果要永久关闭防火墙用。
chkconfig iptables off
selinux是Linux一个子安全机制,学习环境可以将它禁用。
用命令vim /etc/sysconfig/selinux打开文件设置SELINUX为disabled。
二、Hadoop开发环境的搭建
1、3台主机的hostname修改和Ip地址绑定(三台主机均以root用户登录)
(1)3台主机的基本网络环境
CentOS6,64位,在虚拟机下实现。
在虚拟机下安装了一个centos6系统,然后克隆该虚拟机为3个虚拟机,其Ip地址和主机名分别如下:
192.198.162.133 hadoop
192.168.162.131 hadoop0
192.168.162.132 hadoop1
(2)IP地址与hostname绑定
在hadoop主机下,在控制台中输入vi /etc/sysconfig/network,将hostname修改为hadoop,在hadoop0主机下操作类似,将HOSTNAME修改为hadoop0;在hadoop1主机下操作类似,将HOSTNAME修改为hadoop1。
在hadoop主机下,输入:vi /etc/hosts,在hosts下添加如下内容
192.168.162.133 hadoop
192.168.162.131 hadoop0
192.168.162.132 hadoop1
然后通过scp命令,将修改好的hosts复制到hadoop0和hadoop1的/etc/hosts文件夹下覆盖:
scp /etc/hosts root@hadoop0:/etc/hosts
scp /etc/hosts root@hadoop1:/etc/hosts
(3)测试3太主机之间是否能Ping通
在3台主机下分别输入:
ping hadoop
ping hadoop0
ping hadoop1
如果3太主机都能ping通,那说明前面的配置成功
2、SSH免密码登录
在hadoop主机下:
(1) 查看当前用户下(root)是否有.ssh的隐藏文件,如果没有就创建一个
命令为mkdir .ssh
(2) 生成公钥
输入ssh-keygen -t rsa -P '' (注:最后是二个单引号,表示不设置密码)
然后分发公钥到目标机器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop0 (注意不要忘记了参数-i)
(3)验证SSH是否安装成功,以及是否可以免密码登陆本机
ssh localhost
ssh hadoop0
ssh hadoop1
在第一次登陆是需要密码,以后则不要。到此,ssh的免密码登陆完成
附: 如果失败,有可能是以下原因(在配置过程中我们遇到的是第一种情况,权限不足):
1、权限问题
.ssh目录,以及/home/当前用户 需要700权限,参考以下操作调整
sudo chmod 700 ~/.ssh
sudo chmod 700 /home/当前用户
.ssh目录下的authorized_keys文件需要600或644权限,参考以下操作调整
sudo chmod 600 ~/.ssh/authorized_keys
2、StrictModes问题
编辑
sudo vi /etc/ssh/sshd_config
找到
#StrictModes yes
改成
StrictModes no
如果还不行,可以用ssh -vvv 目标机器ip 查看详情,根据输出内容具体问题具体分析了
参考网址:
3、安装和配置hadoop
(1)解压安装hadoop2.9.0
在hadoop主机下:
下载并将hadoop-2.9.0.tar.gz解压到当前用户目录下(/usr/local)
tar -zxvf hadoop-2.9.0.tar.gz
然后将hadoop文件夹重命名为hadoop。
(2)配置hadoop
在hadoop主机下:
进入hadoop文件夹下的etc文件夹下的hadoop文件夹,修改配置文件。
1.指定jdk安装位置:
Hadoop-env.sh:
export JAVA_HOME=/root/jdk1.8/jdk1.8.0_171
2.hadoop核心配置文件,配置HDFS地址和段口号。
core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
3.hdfs-site.xml,默认的配置方式是3,这里表示副本数是3,由于我们搭建的子节点只有2个,所以输入1或2
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
3.1修改core-default.xml文件,不然在之后的eclipse编程时会出现file sys not exist “hdfs”的错误,该文件在hadoop安装目录下的/share/doc/Hadoop/hadoop-project-dist/hadoop-common/下
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
<description>The FileSystem for hdfs: uris.</description>
</property>
4.配置MapReduce文件,配置JobTracker的地址和端口
mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadoop:9001</value>
</property>
</configuration>
5‘修改masters文件,如果没有就创一个空白文件改名为masters。
在其中写入hadoop
6.修改slaves文件
写入hadoop0
hadoop1
7.然后将hadoop文件夹复制到另外2台主机。
scp -R /uer/local/hadoop root@hadoop0:/uer/local / hadoop
scp -R /uer/local/hadoop root@hadoop1: /uer/local / Hadoop
8. 修改环境变量
vi /etc/profile
export JAVA_HOME=/root/jdk1.8/jdk1.8.0_171
export HADOOP_HOME=/usr/local/hadoop
export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
同样,将profile复制到另外两台主机上
scp /etc/profile root@hadoop0:/etc/
scp /etc/profile root@hadoop1:/etc/
注意请先使用source /etc/profile更新命令
(3)启动hadoop
在hadoop下:
输入:
hadoop namenode -format
然后通过start-all.sh启动所有进程:
.进入到$HADOOP_HOME/sbin目录下启动start-all.sh
可以通过jps命令来查看运行的进程, 如果成功运行,那么将会有如下显示
在hadoop0和hadoop1的shell中输入jps也会有3个运行,其中datanode一定要检查是否存在,如果不存在说明配置存在问题。
附:在配置中,我们遇到datanode无法启动的问题,经查阅后了解到是由于我们使用的是64位linux系统,需要下载对应的64位编译版本替换原来的native文件,下载对应文件后,将准备好的64位的lib包解压到已经安装好的hadoop安装目录的lib/native 和 lib目录下:然后增加环境变量:vi /etc/profile增加下面的内容:
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
让环境变量生效source /etc/profile
自检hadoop checknative –a 指令检查hadoop checknative –a
参考地址:
至此,hadoop启动成功,要想看集群状态,可以打开下面两个网址:
localhost:8088(mapreduce的web页面,注意hadoop2.0以前的版本端口号为50030,我使用的是2.9.0版本,所有端口号为8088)
localhost:50070(HDFS的web页面)
三、搭建并测试开发环境(JAVA)
1、JAVA jdk的安装
(1)查看是否已经安装了java JDK。
Shell下输入java –version
注意:Hadoop机器上的JDK,最好是Oracle的Java JDK,不然会有一 些问题,比如可能没有JPS命令。
如果安装了其他版本的JDK,卸载掉。
(2) 安装java JDK
去下载Oracle版本Java JDK:我下载的是1.8版本的jdk-8u171-linux-x64.tar.gz,然后将jdk-8u171-linux-x64.tar.gz解压到你想安装的目录下,这里我选的目录是/root/jdk1.8
Shell命令为tar -zxvf jdk-8u171-linux-x64.tar.gz -C /root/jdk1.8,也可以直接在文件系统里右键复制粘贴到对应目录
接下来添加环境变量,设置JDK的环境变量 JAVA_HOME。需要修改配置文件/etc/profile,追加
export JAVA_HOME=/root/jdk1.8/jdk1.8.0_171
export CLASSPATH=.:/root/jdk1.8/jdk1.8.0_171/jre/lib/rt.jar:/root/jdk1.8/jdk1.8.0_171/lib/dt.jar:/root/jdk1.8/jdk1.8.0_171/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
修改完毕后,执行 source /etc/profile
三台虚拟机上都要进行对应的操作,或者设置好以个虚拟机的之后,将相应的文件用scp命令复制到另外两台虚拟机上
安装后再次执行 java –version,可以看见已经安装完成。
2、Tomcat的安装
(1) 下载 tomcat Linux 版本
oracle 官网下载地址:http://tomcat.apache.org/download-80.cgi
我下载的是apache-tomcat-7.0.86.tar.gz,注意不要下载8.0及以上版本,否则之后的编程会提示不兼容问题
(2) 在 usr 目录下新建 tomcat 目录,然后将 下载的 tomcat 用工具拷贝到这个新建的 tomcat目录中
(3) 解压 tomcat 文件, 由于文件名有点长,我们需要给解压后的文件夹重命名,以便后面引用方便,我改为了tomcat7.0
(4) 配置环境变量(注意:这里我们前提是已经安装并配置好了 JDK)
追加export CATALINA_HOME=/usr/tomcat/tomcat7.0
export PATH=$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
输入如下命令让配置生效:source /etc/profile
(5) 启动 tomcat
进入到 /usr/tomcat/tomcat7.0/bin 目录下,输入如下命令
./startup.sh
(6) 查看 tomcat 是否启动成功
ps -efigrep java
(7) 关闭的方法为进入到 /usr/tomcat/tomcat8.5/bin 目录下,输入如下命令
./shutdown.sh
(8) 验证是否启动成功
启动tomcat 之后,在浏览器输入 http:\\localhost:8080。如果出现 tomcat 的主页则启动成功
附:参考资源;
3、mysql安装
(1) 下载mysql的linux版本,我这里下载的是mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
(2) 将安装包解压到/usr/local下并改名为mysql
(3) 添加mysql用户组和mysql用户
先检查是否有mysql用户组和mysql用户,命令为groups mysql,若无,则添加;groupadd mysql
useradd -r -g mysql mysql
若添加成功则再次groups mysql时会如下图
(4) 进入mysql目录更改权限
cd /usr/local/mysql/
chown -R mysql:mysql ./
(5) 执行安装脚本
./scripts/mysql_install_db --user=mysql
安装完之后修改当前目录拥有者为root用户,修改data目录拥有者为mysql
chown -R root:root ./
chown -R mysql:mysql data
(6) 先启动mysql,然后更改mysql密码
./support-files/mysql.server start
如果MySQL启动报错,则可能是已经存在MySQL进程,杀掉即可
ps aux|grep mysql
kill -9 上边的进程号
#或者下边一条命令即可杀掉所有MySQL进程
ps aux|grep mysql|awk '{print $2}'|xargs kill -9
MySQL启动之后再执行如下命令更改密码:
./bin/mysqladmin -u root -h localhost.localdomain password 'root'
密码更改后即可登录MySQL
./bin/mysql -h127.0.0.1 -uroot -proot
登录之后将其他用户的密码也可改为root
update mysql.user set password=password('root') where user='root';
flush privileges;
在数据库中创建一个hadoop数据库并在hadoop数据库中创建一个users表,为后面的开发做准备
(7) 增加远程登录权限
本地登陆MySQL后执行如下命令
grant all privileges on *.* to root@'%' identified by 'root';
flush privileges;
(8) 将MySQL加入Service系统服务
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld restart
service mysqld status
附:参考网址:
4、eclipse安装和配置
(1)官网下载eclipse,我下载的是eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz
(2)解压安装包到/root/下改名为eclipse
(3)下载hadoop-eclipse-plugin-2.7.3.jar并放到eclipse下的plugins目录下
然后启动eclipse, 打开eclipse Window -> preferences找到hadoop, 设置hadoop路径
(4) 配置eclipse开发tomcat
新建项目, 选择Web project
设置项目名称
选择new Runtime
在弹出对话框配置tomcat版本以及tomcat位置
然后下一步, 下一步
勾选web.xml,并完成
(5) 链接数据库
在Window菜单栏下打开Open Perspertive,选择 Database Development。
然后再Database Connections文件夹下邮件选择New ..;
然后再URL上填上刚刚创建的hadoop数据库;
点击 Test Connection,测试链接成功。
至此,有关hadoop网盘开发的所有配置已经配置完毕,接下来就可以开始代码部分了
PART2代码部分
一、 UI界面
登录界面:
输入账号密码正确后会登录到该用户的网盘,若该用户不存在可以点击注册进行账号的注册,注册完毕后即可进行登录
相关代码:
登录界面数据提交:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<head>
<meta charset="UTF-8">
<title>我的网盘</title>
<meta name="keywords" content="我的网盘">
<meta name="content" content="我的网盘">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
<link type="text/css" rel="stylesheet" href="css/login.css">
<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
</head>
<body class="login_bj" >
<div class="zhuce_body">
<div class="logo"></div>
<div class="zhuce_kong login_kuang">
<div class="zc">
<div class="bj_bai">
<h3>登录</h3>
<form action="LoginServlet" method="post">
<input name="username" type="text" id="inputEmail" class="kuang_txt" placeholder="用户名">
<input name="password" type="text" id="inputPassword" class="kuang_txt" placeholder="密码">
<div>
<a href="#">忘记密码?</a><input name="" type="checkbox" value="" checked><span>记住我</span>
</div>
<input name="登录" type="submit" class="btn_zhuce" value="登录">
</form>
</div>
<div class="bj_right">
<p>使用以下账号直接登录</p>
<a href="#" class="zhuce_qq">QQ登录</a>
<a href="#" class="zhuce_wb">微博登录</a>
<a href="#" class="zhuce_wx">微信登录</a>
<p>没有账号?<a href="zhuce.jsp">立即注册</a></p>
</div>
</div>
<P> 欢迎您使用本网盘</P>
</div>
</div>
</body>
对登录界面提交的数据进行处理:
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UserBeanCl ubc = new UserBeanCl();
if(ubc.checkUser(username, password)){
//用户合法,跳转到界面
HttpSession session = request.getSession();
session.setAttribute("username", username);
JobConf conf = HdfsDAO.config();
HdfsDAO hdfs = new HdfsDAO(conf);
FileStatus[] list = hdfs.ls("/"+username);
request.setAttribute("list",list);
request.getRequestDispatcher("index.jsp?user="+username+"").forward(request, response);
}else{
//用户不合法,调回登录界面,并提示错误信息
System.out.println("====Error!====\n");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
注册界面:
用户输入用户名邮箱密码验证码之后点击注册即可注册成功,然后用户便可通过登录账号登录到自己的网盘
相关代码
注册界面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<head>
<meta charset="UTF-8">
<title>我的网盘</title>
<meta name="keywords" content="我的网盘">
<meta name="content" content="我的网盘">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
<link type="text/css" rel="stylesheet" href="css/login.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
</head>
<body class="login_bj" >
<div class="zhuce_body">
<div class="logo"></div>
<div class="zhuce_kong">
<div class="zc">
<div class="bj_bai">
<h3>欢迎注册</h3>
<form action="CreateServlet" method="post">
<input name="username" type="text" class="kuang_txt user" placeholder="用户名">
<input name="emal" type="text" class="kuang_txt email" placeholder="邮箱">
<input name="password" type="text" class="kuang_txt possword" placeholder="密码">
<input name="id" type="text" class="kuang_txt yanzm" placeholder="验证码">
<div>
<div class="hui_kuang"><img src="images/zc_22.jpg" width="92" height="31"></div>
<div class="shuaxin"><a href="#"><img src="images/zc_25.jpg" width="13" height="14"></a></div>
</div>
<div>
<input name="" type="checkbox" value=""><span>已阅读并同意<a href="#" target="_blank"><span class="lan">《XXXXX使用协议》</span></a></span>
</div>
<input name="注册" type="submit" class="btn_zhuce" value="注册">
</form>
</div>
<div class="bj_right">
<p>使用以下账号直接注册</p>
<a href="#" class="zhuce_qq">QQ注册</a>
<a href="#" class="zhuce_wb">微博注册</a>
<a href="#" class="zhuce_wx">微信注册</a>
<p>已有账号?<a href="login.jsp">立即登录</a></p>
</div>
</div>
<P> 欢迎您使用本网盘</P>
</div>
</div>
</body>
对注册界面提交的数据进行处理:
public class CreateServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取提交的数据
String id=request.getParameter("id");
String username = request.getParameter("username");
String password = request.getParameter("password");
String emal = request.getParameter("emal");
//创建新建用户的对象
UserCreate ubc = new UserCreate();
try {
if(ubc.createUser(id,username,password,emal)){
//用户创建成功,hdfs中创建文件夹
JobConf conf = HdfsDAO.config();
HdfsDAO hdfs = new HdfsDAO(conf);
hdfs.mkdirs
展开阅读全文