Hadoop是大数据处理主流框架,如果要学习大数据处理与存储,hadoop是必须掌握的一种框架技术。动手安装是最基础的实践,下面介绍一下单机、伪分布式和完全分布式安装与配置、测试过程,供有需要的参考。
目录
(1)软件准备
(2)Centos安装及网络配置
(3)JDK安装配置
(4)Hadoop单机安装及配置
(5)Hadoop伪分布配置
(6)启动HADOOP及伪分布式测试
(7)Hadoop完全分布式集群搭建及配置
包括:VMWare Workstation虚拟机
Centos7 64位操作系统
JDK1.8.0 64位
Hadoop3.1.2 (可以在http://mirror.bit.edu.cn/apache/hadoop/common/下载)
第一步,虚拟机上安装Centos64位操作系统,安装过程比较简单,许多地方都是默认设置,包括网络设置采用nat方式默认设置。
需要提示的是:在安装过程中有设置用户和root密码的地方,建议设置用户时就设置hadoop用户,密码可以自行设置。后面再登录时默认当前用户就是hadoop。这样避免再去使用useradd添加hadoop用户。
第二步. 查看IP地址: 与ubuntu不一样,输入ifconfig会出现错误,这里最简单方法就是使用ping命令,如ping 192.168.58.130,虽然无法ping通,但可以发现在弹出的信息中有from 192.168.58.138字样,这192.168.58.138就是本机的ip地址。
另外在当前命令行使用ip addr也可以将本机IP地址显示出来。
第三步,在centos系统上安装SSH服务,便于上传JDK和HADOOP包。centos最简安装只有命令窗口,没有桌面环境,在使用过程中需要用户比较熟悉linux相关命令。本步骤主要用到如下命令:
1. root账号登录安装SSH : yum install -y openssl openssh-server
yum install rsync (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件)
2. root账户修改配置文件: 用vim打开配置文件/etc/ssh/sshd_config, 找到permitrootlogin将其前面的注释去掉
3. 启动SSH服务: systemctl start sshd.service
设置SSH开机自启动:systemctl enable sshd.service
第四步,修改机器hostname、设置host与ip映射
1. 修改hostname: root账户登录后输入: vi /etc/sysconfig/network, 然后修改如下:
2. 配置host与IP映射:root账户登录后输入: vi /etc/hosts,然后修改如下:
如上将本机IP地址192.168.58.138 映射为master机器名,其他两个节点也类似设置对应的机器名。可以在命令行输入:ping master,如果ping成功,说明机器名修改生效:
第五步,测试SSH,可连接。在windows上安装XSHELL或者SSH SECURE SHELL等软件,测试是否能正常登录连接。
第六步,设置SSH免密登录(这里如果不是完全分布式可以不做)。
为了便于主节点与其他从节点之间的顺畅通信,需要设置免密登录。在主节点机器上当前用户登录,命令行输入:ssh-keygen -t rsa,如下窗口。
由此生成一个私钥和一个公钥,存储在/home/hadoop/.ssh/目录下:
[hadoop@localhost ~]# cd ~/.ssh
[hadoop@localhost .ssh]# ll
total 8
-rw-------. 1 hadoop hadoop 1679 Aug 11 18:37 id_rsa
-rw-r--r--. 1 hadoop hadoop 408 Aug 11 18:37 id_rsa.pub
然后执行如下命令,cp id_rsa.pub authorized_keys,产生 authorized_keys文件
[hadoop@localhost .ssh]# cp id_rsa.pub authorized_keys
[hadoop@localhost .ssh]# ll
total 12
-rw-r--r--. 1 hadoop hadoop 408 Aug 11 19:34 authorized_keys
-rw-------. 1 hadoop hadoop 1679 Aug 11 18:37 id_rsa
-rw-r--r--. 1 hadoop hadoop 408 Aug 11 18:37 id_rsa.pub
然后修改权限ssh文件夹及authorized_keys文件:
[hadoop@localhost ~]$ chmod -R 700 .ssh
[hadoop@localhost ~]$ cd .ssh
[hadoop@localhost .ssh]$ chmod 600 authorized_keys
这里的权限700和600功能参考如下:
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
如下进行免密登录测试:ssh hadoop@master,或者直接使用ssh master,不需要输入密码时就表示配置成功。
为了实现几台机器之间互相免密登录,就需要将本机的公钥传递给其他机器,实现命令为:
[hadoop@slave1 .ssh]$ scp d_rsa.pub hadoop@slave2:/home/hadoop/
然后登录进入slave2机器,并在该机器上执行如下命令:
[hadoop@slave2 ]$cat id_rsa.pub >> .ssh/authorized_keys
即将slave1的公钥追加到本机的authorized_keys上。然后就可以在slave1机器上执行
[hadoop@slave1]$ssh slave2,实现免密登录
第7步,关闭防火墙
centos默认防火墙不是iptables,而是firewall。使用systemctl命令来开启和关闭防火墙。
关闭: [root@master ~]# systemctl stop firewalld
查看状态:[root@master ~]# service firewalld status
Redirecting to /bin/systemctl status firewalld.service
?firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2019-08-12 09:40:50 CST; 27s ago
Docs: man:firewalld(1)
Process: 6574 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
Main PID: 6574 (code=exited, status=0/SUCCESS)
JDK安装配置比较简单,将JDK安装包上传到当前目录下,如新建一个java文件夹,然后使用tar命令将压缩包解压,然后配置环境变量即可:
第一步,在当前用户目录下新建java文件夹: [hadoop@localhost ~]$ mkdir java
第二步,在新建的java文件夹中解压jdk包: [hadoop@localhost java]$ tar -xvf jdk-8u11-linux-x64.tar.gz
第三步,查看内容,其中jdk1.8.0_11就是jdk包所在的文件夹
[hadoop@localhost java]$ ll
total 155296
drwxr-xr-x. 8 hadoop hadoop 255 Jun 17 2014 jdk1.8.0_11
-rw-r--r--. 1 hadoop hadoop 159019376 Aug 10 21:13 jdk-8u11-linux-x64.tar.gz
[hadoop@localhost java]$ cd jdk1.8.0_11/
[hadoop@localhost jdk1.8.0_11]$ ll
total 25428
drwxr-xr-x. 2 hadoop hadoop 4096 Jun 17 2014 bin
-r--r--r--. 1 hadoop hadoop 3244 Jun 17 2014 COPYRIGHT
drwxr-xr-x. 4 hadoop hadoop 122 Jun 17 2014 db
drwxr-xr-x. 3 hadoop hadoop 132 Jun 17 2014 include
-rw-r--r--. 1 hadoop hadoop 4673670 Jun 17 2014 javafx-src.zip
drwxr-xr-x. 5 hadoop hadoop 185 Jun 17 2014 jre
drwxr-xr-x. 5 hadoop hadoop 225 Jun 17 2014 lib
-r--r--r--. 1 hadoop hadoop 40 Jun 17 2014 LICENSE
drwxr-xr-x. 4 hadoop hadoop 47 Jun 17 2014 man
-r--r--r--. 1 hadoop hadoop 159 Jun 17 2014 README.html
-rw-r--r--. 1 hadoop hadoop 525 Jun 17 2014 release
-rw-r--r--. 1 hadoop hadoop 21047086 Jun 17 2014 src.zip
-rw-r--r--. 1 hadoop hadoop 110114 Jun 17 2014 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r--. 1 hadoop hadoop 178445 Jun 17 2014 THIRDPARTYLICENSEREADME.txt
其中的bin文件夹、lib文件夹、jre文件夹都是熟悉的JAVA环境变量指向路径
第四步,配置java环境变量
使用root账户登录,然后命令行输入: vi /etc/profile,在文件的最下端加入java环境变量设置:
export JAVA_HOME=/home/hadoop/java/jdk1.8.0_11
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
第五步,保存上述文件并使环境变量生效:source /etc/profile.
第六步,测试java,在当前用户命令行输入: java -version,可以看到安装成功。
也可以编辑一个HelloWorldjava程序测试:
然后在命令行:
[hadoop@localhost ~]$ javac HelloWorld.java
[hadoop@localhost ~]$ java HelloWorld
测试打印出程序中的hello结果。
hadoop安装也比较简单,主要是配置比较麻烦。
将官网上下载的hadoop包上传到当前目录,然后tar解压缩即完成安装。然后麻烦的就是去配置相应的文件,包括core-site.xml、hadoop-env.sh、hdfs-site.xml、mapred-site.xml、yarn-site.xml等。
vi /etc/profile
然后在之前添加的JAVA环境变量文件下方添加HADOOP相关环境变量:
#JAVA环境变量设置
export JAVA_HOME=/home/hadoop/java/jdk1.8.0_11
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
#HADOOP环境变量设置
export HADOOP_HOME=/home/hadoop/hadoop-3.1.2
export PATH=$PATH:$HADOOP_HOME/bin
修改完成后保存该文件,然后使用:source /etc/profile使环境设置生效。
[hadoop@master ~]$ hadoop version
Hadoop 3.1.2
Source code repository https://github.com/apache/hadoop.git -r 1019dde65bcf12e05ef48ac71e84550d589e5d9a
Compiled by sunilg on 2019-01-29T01:39Z
Compiled with protoc 2.5.0
From source with checksum 64b8bdd4ca6e77cce75a93eb09ab2a9
This command was run using /home/hadoop/hadoop-3.1.2/share/hadoop/common/hadoop-common-3.1.2.jar
在当前home目录下新建一个input文件夹,使用vi命令编辑三个文件,
[hadoop@master ~]$ cd input
[hadoop@master input]$ ll
total 12
-rw-rw-r--. 1 hadoop hadoop 12 Aug 12 08:12 f1.txt
-rw-rw-r--. 1 hadoop hadoop 28 Aug 12 08:12 f2.txt
-rw-rw-r--. 1 hadoop hadoop 19 Aug 12 08:12 f3.txt
[hadoop@master input]$ more f1.txt
hello world
[hadoop@master input]$ more f2.txt
hello caojianhua my brother
[hadoop@master input]$ more f3.txt
hello dear brother
可以看到三个文件中分别有几个单词,其中hello重复出现了3次,brother重复出现了2次,其余的出现了1次。接下来我们用hadoop提供的样例调用其wordcount程序来执行单词统计测试。
[hadoop@master ~]$ hadoop jar hadoop-3.1.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount input output //解释:input为输入的文件夹,将处理input中的三个文件,output为输出结果文件夹。
回车执行后如果出现:2019-08-12 08:17:08,241 INFO mapreduce.Job: map 100% reduce 100%
也就是map任务和reduce任务均完成,说明程序执行正常。
然后可以使用more或者cat命令查看输出结果:
[hadoop@master ~]$ ll
total 324652
drwxr-xr-x. 9 hadoop hadoop 149 Jan 29 2019 hadoop-3.1.2
-rw-r--r--. 1 hadoop hadoop 332433589 Aug 9 12:52 hadoop-3.1.2.tar.gz
-rw-rw-r--. 1 hadoop hadoop 460 Aug 11 21:24 HelloWorld.class
-rw-rw-r--. 1 hadoop hadoop 151 Aug 11 21:24 HelloWorld.java
drwxrwxr-x. 2 hadoop hadoop 48 Aug 12 08:12 input
drwxrwxr-x. 3 hadoop hadoop 58 Aug 11 18:01 java
drwxr-xr-x. 2 hadoop hadoop 88 Aug 12 08:17 output
[hadoop@master ~]$ cd output
[hadoop@master output]$ ll
total 4
-rw-r--r--. 1 hadoop hadoop 61 Aug 12 08:17 part-r-00000
-rw-r--r--. 1 hadoop hadoop 0 Aug 12 08:17 _SUCCESS
[hadoop@master output]$ more part-r-00000
brother 2
caojianhua 1
dear 1
hello 3
my 1
world 1
在output文件夹中使用more命令查看part-r-00000文件,结果显示如上。
上面第4步安装及配置表明本机可以当做hadoop服务器处理程序,也即是单机运行,不是分布式的,map和reduce使用同一进程不同阶段来执行。Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
下面介绍伪分布式配置。主要需要修改配置文件然后启动相应的集群服务。包括如下5个配置文件修改:
1. 修改hadoop-env.sh,设置JAVA_HOME路径
export JAVA_HOME=/home/hadoop/java/jdk1.8.0_11
2. 修改core-site.xml,配置文件系统和存储目录
<!--设定hadoop运行时产生文件的存储路径 -->
hadoop.tmp.dir
file:/home/hadoop/hadoop-3.1.2/tmp
a base for other tempory directories.
<!--指定namenode的通信地址,默认8020端口 -->
fs.defaultFS
hdfs://localhost:9000
3. 修改配置文件 hdfs-site.xml:
dfs.name.dir
/home/hadoop/hadoop-3.1.2/tmp/dfs/name
dfs.data.dir
/home/hadoop/hadoop-3.1.2/tmp/dfs/data
dfs.replication
1
4. 修改配置文件 mapred-site.xml
mapreduce.framework.name
yarn
yarn.app.mapreduce.am.env
HADOOP_MAPRED_HOME=$HADOOP_HOME
mapreduce.map.env
HADOOP_MAPRED_HOME=$HADOOP_HOME
mapreduce.reduce.env
HADOOP_MAPRED_HOME=$HADOOP_HOME
mapreduce.map.memory.mb
2048
5.修改配置文件yarn-site.xml
yarn.resourcemanager.hostname
master
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.nodemanager.vmem-check-enabled
false
yarn.nodemanager.vmem-pmem-ratio
5
配置文件修改并保存后,就可以开始启动Hadoop了。
第一步,首先进行hadoop的初始化,在命令行输入:
[hadoop@master ~]$hadoop namenode -format
在执行结果最后出现:
2019-08-12 09:14:42,139 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.58.138
************************************************************/
表明初始化成功。
第二步,启动所有进程,在命令行输入:
[hadoop@master ~]$cd /hadoop-3.1.2/sbin
执行sbin目录中的start-all.sh脚本文件:
[hadoop@master sbin]$ ./start-all.sh
WARNING: Attempting to start all Apache Hadoop daemons as hadoop in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [localhost]
localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Starting datanodes
Starting secondary namenodes [master]
Starting resourcemanager
Starting nodemanagers
第三步,查看进程状态,在命令行输入:jps
[hadoop@master sbin]$ jps
17905 NameNode
18883 Jps
18198 SecondaryNameNode
18438 ResourceManager
18541 NodeManager
18015 DataNode
至此,单机上伪分布式Hadoop环境配置好了,一台机器上配置Hadoop集群:NameNode、DataNode、SecondaryNameNode,YARN集群:ResourceManager、NodeManager。Hadoop集群负责分布式存储和预算,YARN集群负责任务资源管理和调度。
第四步,可以在外部浏览器登录hadoop,由于本处使用的centos最简安装,没有图形界面,因此无法从服务器本机测试,需要外部浏览器测试。首先要确定防火墙关闭,然后hadoop3.0开始采用端口为:9870。因此在外部浏览器地址栏输入:
http://192.168.58.138:9870, 这里192.168.58.138是centos服务器的ip地址,9870为hadoop所用端口。
通过上述web界面浏览整个集群的状态。
第五步,实例测试,还是选用系统自带的MapReduce案例,进行wordcount测试。
(1)在hdfs系统里新建一个test文件夹,这里要理解不是真的在本地磁盘上建立文件夹,而是在虚拟的datanode上建立文件夹,实际存储路径在hdfs-site.xml设定了,即:/home/hadoop/hadoop-3.1.2/tmp/dfs/data,可以去这个目录下查看。
[hadoop@master ~]$ hdfs dfs -mkdir /test
新建成功后,可以在web界面上查看browse directory:有新建的test文件夹。
(2)将之前本地单机测试时input文件夹中的三个文件上传到test目录中:
[hadoop@master ~]$ hdfs dfs -put input/* /test
(3)开始测试,如下命令行:
[hadoop@master hadoop-3.1.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount /test /output2
2019-08-12 11:45:40,303 INFO mapreduce.Job: Running job: job_1565581394614_0001
2019-08-12 11:46:03,644 INFO mapreduce.Job: Job job_1565581394614_0001 running in uber mode : false
2019-08-12 11:46:03,714 INFO mapreduce.Job: map 0% reduce 0%
2019-08-12 11:47:56,955 INFO mapreduce.Job: map 100% reduce 0%
2019-08-12 11:48:44,873 INFO mapreduce.Job: map 100% reduce 100%
2019-08-12 11:48:48,055 INFO mapreduce.Job: Job job_1565581394614_0001 completed successfully
2019-08-12 11:48:53,548 INFO mapreduce.Job: Counters: 53
当测试结束后,可以在命令行输入:
[hadoop@master hadoop-3.1.2]$ hdfs dfs -cat /output2/*
brother 2
caojianhua 1
dear 1
hello 3
my 1
world 1
结果与单机版hadoop处理是一样的。
也可以在web界面查看
至此,整个单台机器安装Hadoop以及配置Hadoo伪分布式集群就结束了。
总体过程还比较顺利,都是边实践边记录,有几个地方需要注意的是:
(1)本次使用的是Hadoop3.1.2版本,在配置和使用时与hadoop2.0版本稍微有所差别,尤其是mapred-site配置和后面的yarn-site配置,增加了内存分配比例设置。
(2)在使用web访问hadoop时,端口号为9870,而不是之前的50070.如果要查看YARN集群状况,在web浏览器地址栏输入:
http://192.168.58.138:8088/cluster/,端口号为8088.
前面伪分布式集群配置好后,就可以实现完全分布式集群搭建了。具体做法记录如下:
$ vi workers
# 添加如下内容
slave1
slave2
然后保存退出
start-dfs.sh
和 stop-dfs.sh
中添加如下内容:HDFS_DATANODE_USER=hadoop
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=hadoop
HDFS_SECONDARYNAMENODE_USER=hadoop
分别在 start-yarn.sh
和 stop-yarn.sh
中添加如下内容:
YARN_RESOURCEMANAGER_USER=hadoop
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=hadoop
上面的操作要在每一个节点上都同步,但是一个一个的去编辑太麻烦了,可以用scp
命令,在 master
节点编辑好之后,直接发送给 slave
节点
scp -r /home/hadoop/hadoop hadoop@slave1:/home/hadoop
至此,集群各个机器的hadoop配置就完成了。与伪分布式测试一样,此时可以启动在master机器上启动hadoop,具体过程请参考伪分布式启动命令,也就是先使用hdfs namenode -format,然后在sbin目录下使用./start-all.sh执行该shell命令,就可以启动hadoop了。
测试查看一下datanode: