hadoop伪分布配置

标题伪分布式模式

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。

1.修改配置文件
Hadoop的配置文件位于:/usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2个配置文件 core-site.xml和hdfs-site.xml。Hadoop的配置文件是 xml格式,每个配置以声明property的name和value的方式来实现。

在这里插入图片描述
①修改配置文件core-site.xml

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

在这里插入图片描述

②修改配置文件hdfs-site.xml

gedit./etc/hadoop/hdfs-site.xml

在这里插入图片描述
修改后:

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

在这里插入图片描述

Hadoop 配置文件说明

Hadoop的运行方式是由配置文件决定的(运行Hadoop时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除coresite.xml 中的配置项。 此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使 用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清 理掉,导致必须重新执行format才行。所以我们进行了设置,同时也指定dfs.namenode.name.dir和dfs.datanode.data.dir,否则在接下来的步骤 中可能会出错。

  1. 格式化 NameNode
./bin/hdfs namenode -format

成功的话,会看到类似如下信息(首次格式化会有警告,阅读后可以忽略)

在这里插入图片描述
如果提示:
Error:JAVA_HOME is not set and could not be found
可能是没有配置JAVA_HOME 环境变量

vim ~/.bashrc     #打开hadoop用户的环境变量,把下边几行粘进去

Esc+ZZ保存退出

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_241
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH	

在这里插入图片描述

如果还是出现
Error: JAVA_HOME is not set and could not be found.
那么请hadoop的安装目录修改配置文件
“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”
在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成 JAVA 安装路径的具体地址,比如“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动 Hadoop。

在这里插入图片描述
3. 开启 2 个守护进程(NameNode 和 DataNode)

cd /usr/local/hadoop 
./sbin/start-dfs.sh  #start-dfs.sh 是个完整的可执行文件,中间没有空格 

在这里插入图片描述
这一步常见错误:

(1)如果提示“public/private ……denied”的信息,表示“ssh 免密登录”设置失败,请重 新设置。
(2) 启动 Hadoop 时提示 Could not resolve hostname 。 如果启动Hadoop 时遇到输 出非常多“ssh:Could not resolve hostname xxx”的异常情况,这个并不是 ssh 的问题,可通过设置 Hadoop环境变量来解决。
首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中, 增加如下两行内容(设置过程与 JAVA_HOME环境变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):

export  HADOOP_HOME=/usr/local/hadoop 
export  HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

保存后,务必执行:

  source ~/.bashrc     #使变量生效
  ./sbin/start-dfs.sh   #启动Hadoop
  1. 判断是否成功启动
    启动完成后,可以通过命令jps来判断是否成功启动,若成功启动则会列出如下进程:
    “NameNode”、”DataNode”和“SecondaryNameNode”
    (如果SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
    在这里插入图片描述
    Hadoop 无法正常启动的解决方法:
    一般可以查看启动日志来排查原因,注意几点:
    • 启动时会提示形如

> “DBLab-XMU: starting namenode, logging to
> /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out”

其中DBLab-XMU 对应你的机器名,但其实启动日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log
所以应该查看这个后缀为 .log 的文件;

• 每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,对比下记录的时间就知道了。

• 一般出错的提示在最后面,通常是写着 Fatal、Error、Warning或者Java Exception 的地方。

• 可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。
此外,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中 原有的所有数据,如果原有的数据很重要请不要这样做):

针对 DataNode 没法启动的解决方法

cd /usr/local/hadoop          #切换目录
./sbin/stop-dfs.sh            # 关闭
rm -r ./tmp                   # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据 
./bin/hdfs namenode -format   # 重新格式化 NameNode 
./sbin/start-dfs.sh           # 重启 
  1. Web 界面查看 Nodes 信息
    成功启动后,可以访问 Web 界面: http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
    在这里插入图片描述
    (6)运行 Hadoop 伪分布式实例(grep 例子)
    ①创建实例目录 user/hadoop 上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。 要使用 HDFS,首先需要在 HDFS 中创建用户目录:
 ./bin/hdfs dfs -mkdir -p /user/hadoop

接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。
我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可 以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input

②创建实例目录 user/hadoop/input,并复制所有的.xml 文件

 ./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.]+'
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):

 ./bin/hdfs dfs -cat output/* 

结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。

④下载文件 我们也可以将运行结果取回到本地:

 rm -r ./output    # 先删除本地的 output 文件夹(如果存在)
 ./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 文件夹拷贝到本机 
 cat ./output/* 

Hadoop 运 行 程 序 时 , 输 出 目 录 不 能 存 在 , 否 则 会 提 示 错 误

org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory
hdfs://localhost:9000/user/hadoop/output already exists

,因此若要再次执行,需要执行如 下命令删除 output 文件夹:

 ./bin/hdfs dfs -rm -r output    # 删除 output 文件夹 

错误:运行程序时,输出目录不能存在

运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output) 不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应 用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目 录,避免繁琐的命令行操作:

Configuration conf = new Configuration(); 
Job job = new Job(conf); 
/* 删除输出目录 */ 
Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true); 
  1. 关闭 hadoop
    若要关闭 Hadoop,则运行
 ./sbin/stop-dfs.sh 
  1. 再次启动 hadoop
    下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 就可以!
 ./sbin/start-dfs.sh 
发布了22 篇原创文章 · 获赞 3 · 访问量 565

猜你喜欢

转载自blog.csdn.net/qq494370/article/details/104943345
今日推荐