6 安装hadoop(报错解决方法见6.3):
6.1 单节点安装步骤
6.1.1 修改/etc/hostname
hadoop01
6.1.2 修改主机名解析文件/etc/hosts
比如:
192.168.0.1 hadoop01
6.1.3 建立hadoop用户,并给出默认shell
sudo useradd -m hadoop -s /bin/bash
6.1.4 修改hadoop密码:
sudo passwd hadoop
6.1.5 增加hadoop用户的管理员权限
sudo adduser hadoop sudo
6.1.6 下载hadoop
wget https://downloads.apache.org/hadoop/core/hadoop-3.3.6/hadoop-3.3.6.tar.gz
#如果wget下载速度慢,可以使用mget
如果没有mget,使用snap install mget
6.1.7 安装hadoop
sudo tar -zxf ~/Downloads/hadoop-3.3.6.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.3.6/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
6.1.8 添加hadoop环境变量
修改.bashrc,
vim .bashrc
在.bashrc文件后面添加内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
6.1.9 修改/usr/local/hadoop/etc/hadoop下的hadoop-env.sh与yarn-env.sh文件
在最后添加
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
其实,如果已经设置过,则无需再次设置
6.1.10 测试单机模式
cd /usr/local/hadoop
hadoop fs -mkdir -p ./wordcount/input 或者 mkdir ./wordcount/input
hadoop fs -mkdir -p ./wordcount/output 或者 mkdir ./wordcount/output
sudo cp ./etc/hadoop/*.xml ./wordcount/input # 将配置文件作为输入文件
sudo ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount ./wordcount/input ./wordcount/output/1
sudo cat ./wordcount/output/1/*
6.2 Hadoop伪分布式安装
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
注:Hadoop 的配置文件位于/usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2个配置文件core-site.xml 和 hdfs-site.xml。
6.2.1 修改配置文件 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>
<property>
<name>hadoop.http.staticuser.user</name> #解决web端无法删除上传文件
<value>hadoop</value>
</property>
</configuration>
注:上面的localhost可以改成具体的ip地址
6.2.2 修改配置文件hdfs-site.xml,如上所示
<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>
注.Hadoop配置文件说明:
Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
按照官方教材:伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为/tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。
6.2.3 配置完成后,执行 NameNode 的格式化,如上xml设置一样自动创建tmp目录等:
cd /usr/local/hadoop
./bin/hdfs namenode -format
6.2.4 开启 NameNode 和 DataNode 守护进程
cd /usr/local/hadoop
./sbin/start-dfs.sh
6.3 报错问题及解决
6.3.1 hadoop可能报错如下:
#there is no HDFS_NAMEnODE_USER defined等错误
#则需要在start-dfs.sh和stop-dfs.sh文件中添加如下几行
#!/usr/bin/env bash #在此行后粘贴入下面4行即可
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
6.3.2 如果再次运行任然报错如下:
./sbin/start-dfs.sh
Starting namenodes on [localhost]
localhost: root@localhost: Permission denied (publickey,password).
Starting datanodes
localhost: root@localhost: Permission denied (publickey,password).
Starting secondary namenodes [hadoop01]
hadoop01: root@hadoop01: Permission denied (publickey,password).
#此问题是因为没有设置ssh登录免密导致,按照如下设置
注:因为在ubuntu中,默认是不允许root登录的
首先修改sshd_config文件
将PermitRootLogin prohibie-password 修改为:PermitRootLogin yes
将PasswordAuthentication 后修改为yes
免密登录ssh,详见第5节
然后再修改sshd_config文件,见上
运行jps,查看是否运行成功
root@hadoop01:/usr/local/hadoop# jps
10803 Jps
10423 DataNode
10268 NameNode
10639 SecondaryNameNode
可通过web访问
http://localhost:9870/dfshealth.html#tab-overview
6.3.3 运行start-dfs.sh或者start-all.sh后,找不到DataNode进程的问题
问题分析:
在启动Hadoop之前,进行了多次格式化,导致DataNode的ID发生了变化。
问题解决:
删除tmp目录下所有的文件及文件夹,然后重新格式化
hadoop namenode -format 和 hdfs namenode -format
上面第一条命令支持普通模式和hdfs模式,第二条命令只支持hdfs模式,会互相覆盖VERSION文件的namespaceID值
所以只需要做一次即可。切记切记
6.4 运行伪分布式Hadoop实例:
6.4.1 说明
hdfs有三种shell命令方式:
hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
6.4.2 命令提示
hdfs dfs -mkdir -p /user/root #为root用户创建一个hdfs根文件夹
hdfs dfs -mkdir input #创建一个hdfs的输入文件夹,这是使用的相对目录,等于在root下建立input目录
hdfs dfs -put ./etc/hadoop/*.xml input #将多个xml文件复制到input
hdfs dfs -ls input #查看这些文件
#下面这条指令是在这些xml文件中查找有多少以dfs开头的记录
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
#查看结果
./bin/hdfs dfs -cat output/*
1 dfsadmin
1 dfs.replication
1 dfs.namenode.name.dir
1 dfs.datanode.data.dir
6.4.3 将结果复制到普通文件夹
hdfs dfs -get output ./output #将output中的结果复制到普通的本地output文件夹中,output是刚生成的
注:
output一旦生成,不会被删除,所有再次计算的时候需要先删除output目录
hdfs dfs -rm -r output