在学习大数据的过程中,需要使用Hadoop,此篇文章用来记录从别人那里学习的步骤(与自己的相结合)以及遇到的问题和解决方式。
一、VMware16.1.1+Linux(ubuntu-18.04)+JDK+Hadoop 1.VMware16.1.1VMware16.1.1的安装包以及安装步骤
备注:需要保存到百度网盘上进行下载,有百度网盘会员则下载速度会很快。
Linux(ubuntu-18.04的安装包以及安装步骤)
备注:
①该链接中的教程分为2个部分:一是安装虚拟机,二是在虚拟机下安装Linux(ubuntu-18.04)系统。如果已经安装虚拟机则只需要操作第二部分。
②在安装步骤中的第12个如图所示,不要选择勾选图中的箭头所指,要选择第一个 NAT模式 ,否则可能会导致进入ubuntu无法联网,为后面的带来麻烦。
③在第24个步骤如图所示。在设置密码时候要查看小键盘是否打开,否则可能会导致数字未被按上去,建议输入6位密码。
选择linux下的安装包
官网:Java Downloads | Oracle
我选择的是:jdk-8u191-linux-x64.tar.gz
附上百度网盘链接如下
链接:https://pan.baidu.com/s/1HJcWrucJ-w6jCTWaNDYpJA
提取码:2cd7
–来自百度网盘超级会员V3的分享
要是去官网的话可以参考:
如何在Ubuntu 18.04上以独立模式安装Hadoop
我选择的是:hadoop-2.7.1.tar.gz
附上百度网盘链接如下:
链接:https://pan.baidu.com/s/1JAruGtDK6wVny7-lH1ZWvQ
提取码:mbhs
–来自百度网盘超级会员V3的分享
①安装VMwareTools后,可以实现主机与虚拟机之间的文件拖拽
②linux中 复制 = ctrl + shit +c 黏贴 = ctrl + shit +v(后续会用到)
③安装步骤请参考该博主[daixiangcn]:如何在linux中安装VMwareTools
三、ubuntu18.04安装Hadoop①首先将jdk-8u191-linux-x64.tar.gz和hadoop-2.7.1.tar.gz从主机拖拽到虚拟机桌面。
②后续操作均在linux 下Xshell终端进行,打开终端快捷键: ctrl + alt +t
③后续操作中的密码如果自己没有进行更改,则为创建ubuntu时的用户密码
1.更新apt包sudo apt-get update2.安装SSH server
sudo apt-get install openssh-server3.配置SSH
ssh localhost
exit
输入密码登录本机和退出本机
如果需要无密码登录
在进行了初次登陆后,会在当前家目录用户下有一个.ssh文件夹,进入该文件夹下:
cd ~/.ssh/
使用rsa算法生成秘钥和公钥对:
ssh-keygen -t rsa
运行后一路回车就可以了,其中第一个是要输入秘钥和公钥对的保存位置,默认是在:.ssh/id_rsa
生成完后就可以看到这一对的位置:
Your identification has been saved in /home/ykt/.ssh/id_rsa.
Your public key has been saved in /home/ykt/.ssh/id_rsa.pub.
然后把公钥加入到授权中:
cat ./id_rsa.pub >> ./authorized_keys
再次ssh localhost的时候就可以无密码登陆了。
4.安装JDK首先检查是否已经安装
java -version
如果没有进行安装:则进行下列操作
我选择的是:jdk-8u191-linux-x64.tar.gz
为了方便,为其单独创立一个文件夹:然后将其放到该目录下
sudo mkdir -p /usr/local/java
将 jdk-8u191-linux-x64.tar.gz移动到 /usr/local/java/,因为我之前将该压缩包移动到了虚拟机的桌面上,就是/home/xue/桌面/(其中xue为我的用户名。具体位置以自己的为准)
sudo mv /home/xue/桌面/jdk-8u191-linux-x64.tar.gz /usr/local/java/
进入该目录进行解压
cd /usr/local/java sudo tar xvzf jdk-8u191-linux-x64.tar.gz
解压成功后会在当前目录下看到 :jdk1.8.0_191文件夹
然后删除安装包
sudo rm jdk-8u191-linux-x64.tar.gz5.配置JDK
【后续的操作中会用到 Linux编辑器vi,如果没有接触过的可以参考“Linux编辑器vi使用方法详细介绍”Linux编辑器vi使用方法详细介绍】
下列内容均参考博主weixin_42001089的ubuntu18.04安装Hadoop部分根据情况做了改动。
设置环境变量:打开环境变量的配置文件
sudo vi /etc/profile
(如果vi 不可以,试试换成vim )
在末尾添加:
JAVA_HOME=/usr/local/java/jdk1.8.0_191 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME export PATH
(我的版本号是jdk1.8.0_191,具体的请以自己的为准)
告诉Ubuntu Java JDK的位置:
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_191/bin/java" 1 sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_191/bin/javac" 1 sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_191/bin/javaws" 1
相应的将其设为默认方式:
sudo update-alternatives --set java /usr/local/java/jdk1.8.0_191/bin/java sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_191/bin/javac sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_191/bin/javaws
重新加载环境变量的配置文件:
source /etc/profile
检测:
java -version
出现以下即成功:
我选择的是:hadoop-2.7.1.tar.gz
将hadoop-2.7.1.tar.gz移动到 /usr/local,因为我之前将该压缩包移动到了虚拟机的桌面上,具体位置以自己的为准。
sudo mv /home/xue/桌面/hadoop-2.7.1.tar.gz /usr/local/
进入该目录进行解压:
cd /usr/local sudo tar xvzf hadoop-2.7.1.tar.gz
解压成功后会在当前目录下看到 :hadoop-2.7.1文件夹
然后删除安装包:
sudo rm hadoop-2.7.1.tar.gz
重命名并修改权限:
cd /usr/local/ sudo mv ./hadoop-2.7.1/ ./hadoop
sudo chown -R xue ./hadoop
(xue 为我的用户名,具体的请参考自己的)
检测:
./usr/local/hadoop/bin/hadoop version
出现以下安装成功:
Hadoop 2.7.1
Subversion https://github.com/apache/hadoop.git -r e30710aea4e6e55e69372929106cf119af06fd0e
Compiled by root on 2018-04-16T09:33Z
Compiled with protoc 2.5.0
From source with checksum 7d6d2b655115c6cc336d662cc2b919bd
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.1.jar
无需做任何东西,上面安装成功即是默认的单机模式:
测试:
cd /usr/local/hadoop ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar
可以看到Hadoop自身内置的很多例子:
An example program must be given as the first argument.
Valid program names are:
aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.
dbcount: An example job that count the pageview counts from a database.
distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.
grep: A map/reduce program that counts the matches of a regex in the input.
join: A job that effects a join over sorted, equally partitioned datasets
multifilewc: A job that counts words from several files.
pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
randomwriter: A map/reduce program that writes 10GB of random data per node.
secondarysort: An example defining a secondary sort to the reduce.
sort: A map/reduce program that sorts the data written by the random writer.
sudoku: A sudoku solver.
teragen: Generate data for the terasort
terasort: Run the terasort
teravalidate: Checking results of terasort
wordcount: A map/reduce program that counts the words in the input files.
wordmean: A map/reduce program that counts the average length of the words in the input files.
wordmedian: A map/reduce program that counts the median length of the words in the input files.
wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.
cd /usr/local/hadoop mkdir ./input cp ./etc/hadoop/*.xml ./input cd input ls
可以看到将以下xml作为输入:
capacity-scheduler.xml core-site.xml hadoop-policy.xml hdfs-site.xml httpfs-site.xml kms-acls.xml kms-site.xml yarn-site.xml
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar grep input output 'dfs[a-z.]+'
查看输出:
cat ./output/*
1 dfsadmin
可以看到在这些xml文件中符合dfs[a-z.]+正则表达式的单词只有一个即dfsadmin
注意:Hadoop默认不会覆盖结果文件,想要再次运行上面实例会提示出错,需要先将./out删除
rm -r ./out
试验完后可以将输入也删掉了
sudo rm -rf input②伪分布式配置:
伪分布式需要修改2个配置文件core-site.xml和hdfs-site.xml,路径在:/usr/local/hadoop/etc/hadoop
打开core-site.xml
cd /usr/local/hadoop/etc/hadoop vi core-site.xml
在打开的文件中,下面部分
中添加如下配置
hadoop.tmp.dir /usr/local/hadoop/tmp Abase for other temporary directories. fs.defaultFS hdfs://localhost:9000
说明:可以看到这里使用的是hdfs://localhost:9000即hdfs文件系统,例如还有淘宝的tfs://,谷歌的gfs://以及本地的file://
打开hdfs-site.xml
vi hdfs-site.xml
在打开的文件中,下面部分
中添加如下配置
dfs.replication 1 dfs.namenode.name.dir /usr/local/hadoop/tmp/dfs/name dfs.datanode.data.dir /usr/local/hadoop/tmp/dfs/data
这里的dfs.replication就是指备份的份数
配置说明:(原博主的话)
Hadoop的运行方式是由配置文件决定的(运行Hadoop时会读取配置文件),因此如果需要从伪分布模式切换到非分布式模式,需要删除core-site.xml中的配置项。
此外,伪分布式虽然只需要配置fs.defaultFS和dfs.replication就可以运行(官方教程如此),不过若没有配置hadoop.tmp.dir参数,则默认使用的临时目录为/tmp/hadoop-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行format才行。所以进行了设置,同时也指定dfs.namenode.name.dir和dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
切换回hadoop主目录:/usr/local/hadoop
cd /usr/local/hadoop
NameNode的格式化
./bin/hdfs namenode -format
出现如下即成功:
00000000 using no compression
18/08/20 11:07:16 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 320 bytes saved in 0 seconds .
18/08/20 11:07:16 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
18/08/20 11:07:16 INFO namenode.NameNode: SHUTDOWN_MSG:
开启NameNode和DataNode守护进程
./sbin/start-dfs.sh
注意:如果报错没有没有JAVA——HOME
则在对应的位置手动添加下面加粗的一行即可:(当前目录是usr/local/hadoop)
cd etc/hadoop/ vi hadoop-env.sh
#Set Hadoop-specific environment variables here.
#The only required environment variable is JAVA_HOME. All others are
#optional. When running a distributed configuration it is best to
#set JAVA_HOME in this file, so that it is correctly defined on
#remote nodes.
#The java implementation to use.
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
即可
验证:
jps
3648 DataNode
3941 Jps
2678 NameNode
3095 SecondaryNameNode
同时出现以上四个即成功
注意:
1)如果没有出现:SecondaryNameNode,重启,即运行sbin/stop-dfs.sh关闭进行,然后再次尝试启动尝试)
2)如果没有DataNode,这个情况的发生是由于虚拟机和linux共同作用的结果,虚拟机本身不稳电工。会虚拟机假死的情况,如果说页面已经出现了Datanode的话,那么重启一下,假死现象消失,jps后出现DataNode.
3)如果datanode确实没有启动,可以试着将/usr/local/hadoop/tmp/dfs下的data目录删除,然后重新启动dfs
rm -rf data ./sbin/start-dfs.sh jps
笔者就是属于后者这种情况,因为在配置core-site.xml和hdfs-site.xml两个文件时,手动出错,所以多次修改,然后多次使用
*./bin/hdfs namenode -format进行NameNode的格式化,但是这样的话每次都会为NameNode生成新的namespaceID,,但是在hadoop.tmp.dir目录下的DataNode还是保留上次的namespaceID,因为namespaceID的不一致,而导致DataNode无法启动,所以手动删除(删除/usr/local/hadoop/tmp/dfs目录下的data),重新生成datanode
格式化成功以后,后续别再进行格式化。
运行:
上面的单击模式,grep例子读取的是本地数据,伪分布式读取则是HDFS上的数据。
伪分布式和单机的mapreduce基本上都是一样的,最主要的区别就是该模式下要使用HDFS的文件系统。
所以首先需要在HDFS中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop
然后创建输入文件夹:
./bin/hdfs dfs -mkdir /user/hadoop/input
类似单机模式,将etc/hadoop下所有的xml文件复制到输入
./bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input
然后查看:
./bin/hdfs dfs -ls /user/hadoop/input
可以看到:
-rw-r–r-- 1 ykt supergroup 7861 2018-08-20 13:15 /user/hadoop/input/capacity-scheduler.xml
-rw-r–r-- 1 ykt supergroup 1028 2018-08-20 13:15 /user/hadoop/input/core-site.xml
-rw-r–r-- 1 ykt supergroup 10206 2018-08-20 13:15 /user/hadoop/input/hadoop-policy.xml
-rw-r–r-- 1 ykt supergroup 1069 2018-08-20 13:15 /user/hadoop/input/hdfs-site.xml
-rw-r–r-- 1 ykt supergroup 620 2018-08-20 13:15 /user/hadoop/input/httpfs-site.xml
-rw-r–r-- 1 ykt supergroup 3518 2018-08-20 13:15 /user/hadoop/input/kms-acls.xml
-rw-r–r-- 1 ykt supergroup 5939 2018-08-20 13:15 /user/hadoop/input/kms-site.xml
-rw-r–r-- 1 ykt supergroup 690 2018-08-20 13:15 /user/hadoop/input/yarn-site.xml
运行grep(该流程的mapreduce就和单机一样了,不一样的就是从hdfs文件系统取输入)
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar grep /user/hadoop/input output 'dfs[a-z]+'
查看结果:
./bin/hdfs dfs -cat output/*
1 dfsadmin
可以看到和单机模式一样的结果
关闭Hadoop:
./sbin/stop-dfs.sh
下次开启Hadoop:
./sbin/start-dfs.sh
从以上可以看出:每次操作hadoop时都得切换到目录/usr/local/hadoop/bin 或是/usr/local/hadoop/sbin下,所以还是给hadoop配置一下环境变量比较方便:
sudo vi /etc/bash.bashrc
最后在任意位置试一下hadoop
hadoop version
配置完环境变量以后:
开启Hadoop:
start-dfs.sh
关闭Hadoop:
stop-dfs.sh



