参考资料:厦门大学 林子雨 Hadoop3.1.3安装教程_单机/伪分布式配置_Hadoop3.1.3/Ubuntu18.04(16.04)
配置过程中所需资源:
deepin 20.1镜像文件链接(提取码:t60l)
JDK 1.8安装文件链接(提取码:rw9b)
Hadoop 3.1.3安装文件链接 (提取码:b6om)
环境
本教程基于deepin 20.1社区版,使用虚拟机安装。
创建hadoop用户
按下快捷键Ctrl+Alt+T打开终端,创建hadoop用户,并且使用/bin/bash
作为Shell:
$ sudo useradd -m hadoop -s /bin/bash
设置用户hadoop的密码:
$ sudo passwd hadoop
为用户hadoop添加管理员权限:
$ sudo adduser hadoop sudo
完成上述步骤后,点击右下角的关机图标,选择注销,返回登录界面,选择用户hadoop登录。
更新apt
按下快捷键Ctrl+Alt+T打开终端,更新apt:
$ sudo apt-get update
配置SSH无密码登录
我们可以使用下面的命令登录本机:
$ ssh localhost
但是这样登录是需要每次输入密码的,使用下面的命令配置成SSH无密码登录:
$ exit
$ cd ~/.ssh/
$ ssh-keygen -t rsa
$ cat ./id_rsa.pub >> ./authorized_keys
此时再使用ssh localhost
命令,无需密码即可直接登录。
安装Java环境
JDK 1.8的安装文件保存在/home/hadoop/Downloads/
目录下。
解压jdk-8u162-linux-x64.tar.gz文件:
$ cd /usr/lib
$ sudo mkdir jvm
$ cd ~/Downloads
$ sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm
配置环境变量:
$ cd ~
$ vim ~/.bashrc
在.bashrc
文件的开头位置添加如下内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存退出vim,输入下面的命令使配置生效:
$ source ~/.bashrc
查看Java的版本信息,如果能返回Java的版本信息即为安装成功。
$ java -version
安装Hadoop 3.1.3
Hadoop 3.1.3的安装文件保存在/home/hadoop/Downloads/
目录下。
解压hadoop-3.1.3.tar.gz文件,重命名,修改权限:
$ sudo tar -zxf ~/Downloads/hadoop-3.1.3.tar.gz -C /usr/local
$ cd /usr/local/
$ sudo mv ./hadoop-3.1.3/ ./hadoop
$ sudo chown -R hadoop ./hadoop
查看Hadoop的版本信息,如果能返回Hadoop的版本信息即为安装成功。
$ ./bin/hadoop version
Hadoop单机配置(非分布式)
Hadoop默认模式为非分布式模式(本地模式),非分布式即单Java进程,便于调试。下面运行grep
例子,将input
目录中的所有文件作为输入,筛选其中符合正则表达式dfs[a-z.]+
的单词并统计出现的次数,将结果输出到output
目录:
$ cd /usr/local/hadoop
$ mkdir ./input
$ cp ./etc/hadoop/*.xml ./input
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep ./input ./output 'dfs[a-z.]+'
$ cat ./output/*
Hadoop默认不会覆盖结果文件,再次运行上面的实例需要先将./output
删除。
Hadoop伪分布式配置
Hadoop的配置文件位于/usr/local/hadoop/etc/hadoop/
,伪分布式需要修改2个配置文件core-site.xml
和hdfs-site.xml
。
使用vim修改core-site.xml
:
$ vim ./etc/hadoop/core-site.xml
将其中的
<configuration>
</configuration>
修改为下面配置
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
使用vim修改hdfs-site.xml
:
$ vim ./etc/hadoop/hdfs-site.xml
将其中的
<configuration>
</configuration>
修改为下面配置
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
配置完成后,执行NameNode的格式化:
$ ./bin/hdfs namenode -format
开启NameNode和DataNode守护进程并且判断是否启动成功:
$ ./sbin/start-dfs.sh
$ jps
运行Hadoop伪分布式实例
在HDFS中创建用户目录:
$ ./bin/hdfs dfs -mkdir -p /user/hadoop
将./etc/hadoop
中的xml文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop
复制到分布式文件系统中的/user/hadoop/input
中。
$ ./bin/hdfs dfs -mkdir input
$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input
查看文件列表:
$ ./bin/hdfs dfs -ls input
伪分布式运行MapReduce作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件,可以将单机步骤中创建的本地input
文件夹,输出结果output
文件夹都删掉来验证这一点。
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
查看运行结果:
$ ./bin/hdfs dfs -cat output/*
也可以将运行结果取回本地:
$ rm -r ./output
$ ./bin/hdfs dfs -get output ./output
$ cat ./output/*
Hadoop运行程序时,输出目录不能存在,否则会提示错误org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists
,因此若要再次执行,需要删除output
文件夹。
关闭Hadoop:
$ ./sbin/stop-dfs.sh