实验1:熟悉常用的Linux操作和Hadoop操作

本文记录了大数据挖掘课程中实验1的步骤和遇到的问题。本文基于该参考教程

创建Hadoop用户

在root用户下创建新用户hadoopB22040024,授予root权限并切换至该用户

sudo useradd -m hadoopB22040024 -s /bin/bash
sudo adduser hadoopB22040024 sudo
su hadoopB22040024
sudo apt-get install openssh-server

安装并配置环境

安装ssh-server

sudo apt-get install openssh-server

image-1

连接localhost

ssh localhost

image-2

设置无需密码连接

exit
cd ~/.ssh
ssh-keygen -t rsa
cat ./id_rsa.pub >> ./authorized_keys
cd ~
ssh localhost

image-3

安装jdk1.8

假设压缩包在~/download目录下

cd /usr/lib
sudo mkdir jvm
cd ~
cd download
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm
cd /usr/lib/jvm
ls
cd ~
vim ~/.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

输入:wq保存并退出

source ~/.bashrc
java -version

image-4

解压安装Hadoop

假设压缩包在~download目录下

sudo tar -zxf ~/download/hadoop-3.1.3.tar.gz -C /usr/local
cd /usr/local/
sudo mv ./hadoop-3.1.3/ ./hadoop
sudo chown -R hadoop ./hadoop
cd /usr/local/hadoop
./bin/hadoop version

image-5

Hadoop单机配置(非伪分布式)

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/*

image-6

Hadoop伪分布式安装

Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件core-site.xmlhdfs-site.xml

修改配置文件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>

修改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格式化

cd /usr/local/hadoop
./bin/hdfs namenode -format

image-7

开启NameNode和DataNode守护进程

cd /usr/local/hadoop
./sbin/start-dfs.sh

image-8

我在运行时发生以下报错

image-11

由于我是使用WSL进行实验,而在Windows系统下下载安装包并直接将安装包复制进Linux系统中,为了实现这一目标,我通过以下命令修改权限:

chmod 777 ~

所以导致在使用ssh localhost命令的时候依然需要输入密码导致开启失败,使用以下命令修改后解决问题:

chmod 700 ~

运行Hadoop伪分布式实例

在HDFS中创建目录

./bin/hdfs dfs -mkdir -p /user/hadoop

./etc/hadoop中的xml文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop复制到分布式文件系统中的/user/hadoop/input

原教程此处使用相对路径,但是实际操作发现会报错,加入-p参数后因当前目录未切换,创建的目录存在问题,因此以下统一修改为绝对目录

./bin/hdfs dfs -mkdir /user/hadoop/input
./bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input

image-9

运行伪分布式MapReduce并查看运行结果

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep /user/hadoop/input /user/hadoop/output 'dfs[a-z.]+'

image-10

关闭Hadoop

./sbin/stop-dfs.sh