hadoop系列一:安装过程简介及一些注意项

本文详细介绍了在CentOS7上安装Hadoop的过程,包括单机、伪分布式和完全分布式环境的配置步骤。并提供了在安装过程中可能遇到的问题及其解决方案,如JDK版本、SSH设置、HDFS操作错误等。

今天在公司服务器centos7上安装hadoop,参考了这个安装教程,同时参考这个博客

安装的流程大致如下:

1.单机安装

  • 下载好jdk和hadoop压缩文件
  • 创建linux新用户hadoop, 创建新目录/opt/hadoop
  • 安装jdk到/usr/local/,我的版本1.8.0_181
  • 安装hadoop到/opt/hadoop/,我的版本2.8.5
  • 环境变量配置
  • 将目录指定所有者为hadoop用户:sudo chown -R hadoop:hadoop /opt/hadoop
  • 运行测试
> mkdir /opt/hadoop/input
> cp $HADOOP_HOME/*.txt /opt/hadoop/input
> hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar  wordcount /opt/hadoop/input /opt/hadoop/ouput

2.伪分布式安装(在单机基础上修改配置即可)

  • 配置hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_181
  • 配置core-site.xml
<configuration>

   <property>
      <name>fs.default.name </name>
      <value> hdfs://localhost:9000 </value> 
   </property>
</configuration>
  • 配置hdfs-site.xml
<configuration>

   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>
   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value>
   </property>
   <property>
      <name>dfs.data.dir</name> 
 <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value> 
   </property>
</configuration>
  • 配置yarn-site.xml
<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value> 
   </property>
</configuration>
  • 配置mapred-site.xml
<configuration>
   <property> 
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>
  • 格式化HDFS
  • 启动HDFS
  • 传输文件到HDFS文件系统,或从HDFS下载到本地
  • 测试
hadoop fs -mkdir /user/hadoop/inputs #创建目录
hadoop fs -put /opt/hadoop/input/*.txt /user/hadoop/inputs  #上传文件到HDFS文件系统
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount inputs outputs  # inputs outputs 是在HDFS文件系统下的目录

3.完全分布式(在伪分布式基础上操作即可,已两台电脑为例)

  • 网络配置
电脑01:ip:10.12.28.27
电脑02:ip:10.12.28.144
为了方便输入,用域名代替ip,可以分别都两台机器上:
sudo vi /etc/hosts
都添加:
10.12.28.27 master
10.12.28.144 slave1
此时,从01登入到02可以:
ssh hadoop@slave1
相当于ssh hadoop@10.12.28.144

01登入02需要输入用户密码。无秘钥通信:

生成ssh秘钥:ssh-keygen -t rsa
此时~/.ssh目录下会生成公钥和私钥
发送公钥到02:ssh-copy-id hadoop@10.12.28.144
同样,在02上操作可以,从02无秘钥登入01
  • 多台电脑安装+配置。 电脑01已经如上安装配置完成,在电脑02进行同样建立hadoop用户+安装+配置
安装java或hadoop可以直接从01拷贝到02上
scp -r /opt/hadoop/hadoop-2.8.5 hadoop@10.12.28.144:/opt/hadoop/
  • 在master上启动hadoop
hadoop namenode -format 重新进行格式化命令
start-dfs.sh  启动hdfs
使用jps会看见,在master上面启动了NameNode,SecondaryNameNode
在slave1上使用jps查看,会看见上面启动了 DataNode
start-yarn.sh 启动yarn
master端多了一个ResourceManager,slave1端多了一个NodeManager。
  • 测试

下面就记录安装过程中遇到的一些问题:

1.jdk版本问题

jdk用最新的11版本后,运行hadoop会出现如下信息,可能造成hadoop运行不成功。建议jdk安装8版本及之前版本

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.ibatis.reflection.Reflector (file:/C:/Users/jiangcy/.m2/repository/org/mybatis/mybatis/3.4.5/mybatis-3.4.5.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.apache.ibatis.reflection.Reflector
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

2.~/.bashrc文件配置问题(环境变量配置)

在安装完jdk后,需要配置~/.bashrc文件,按照上面参考教程提供的配置:

export JAVA_HOME=/usr/local/jdk1.8.0_181
export PATH=PATH:$JAVA_HOME/bin
export HADOOP_HOME=/opt/hadoop/hadoop-2.8.5

执行source ~/.bashrc生效,会出现其它命令不能用的情况如:‘-bash: ls: 未找到命令’(因为PATH路径被修改了)

应该改为:

export JAVA_HOME=/usr/local/jdk1.8.0_181 
export PATH=$JAVA_HOME/bin:$PATH

export HADOOP_HOME=/opt/hadoop/hadoop-2.8.5
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

3.SSH设置和密钥生成

配置为可以免密码登陆本机。实际上,在hadoop的安装过程中,是否免密码登陆是无关紧要的,但是如果不配置免密码登陆,每次启动hadoop都需要输入密码以登陆到每台DataNode上。不配置免密码登陆时,当集群大了,就会很麻烦。

4.hadoop fs -mkdir /user/input 报错

将数据插入到HDFS需要创建一个目录,执行上面语句会出现hadoop fs -mkdir:No such file or directory的错误。

原因:HDFS默认的工作目录是/user/<你的登录用户名>,但是HDFS文件系统可能只有根目录,注意:HDFS文件系统目录和本地目录不是一个。参考

所以可以如下操作:

  • hadoop fs -ls / 查看HDFS文件系统根目录
  • hadoop fs -mkdir /user
  • hadoop fs -mkdir /user/<你的登录用户名>
  • hadoop fs -mkdir /user/<你的登入用户名>/input
hdfs常用操作
1.对hdfs操作的命令格式是hadoop fs 
1.1 -ls 表示对hdfs下一级目录的查看 
1.2 -lsr 表示对hdfs目录的递归查看 
1.3 -mkdir 创建目录 
1.4 -put 从linux上传文件到hdfs 
1.5 -get 从hdfs下载文件到linux 
1.6 -text 查看文件内容 
1.7 -rm 表示删除文件 -rm -r 删除文件夹
1.7 -rmr 表示递归删除文件

5.用mapreduce的stream流操作执行python脚本

首先用命令:find / -name 'hadoop-streaming*.jar' 找到hadoop安装目录中streaming的java应用程序,不同版本肯能存放的目录不一样,我的在目录下:/opt/hadoop/hadoop-2.8.5/share/hadoop/tools/lib/hadoop-streaming-2.8.5.jar

执行命令:

hadoop jar hadoop-streaming-2.8.5.jar -input inputs -output py_outs -mapper /opt/hadoop/mapper.py -reducer /opt/hadoop/reducer.py

python计数脚本:

mapper.py

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

import sys
#输入为标准输入stdin
for line in sys.stdin:
    #删除开头和结尾的空格
    line = line.strip()
    #以默认空格分隔行单词到words列表
    words = line.split()
    for word in words:
        #输出所有单词,格式为“单词,1”以便作为Reduce的输入
        print ('%s\t%s' % (word, 1))

reducer.py

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
# from operator import itemgetter
import sys

current_word = None
current_count = 0
word = None

# 获取标准输入,即mapper.py的输出
for line in sys.stdin:
    # 删除开头和结尾的空格
    line = line.strip()

    # 解析mapper.py输出作为程序的输入,以tab作为分隔符
    word, count = line.split('\t', 1)

    # 转换count从字符型成整型
    try:
        count = int(count)
    except ValueError:
        # count不是数据时,忽略此行
        continue

    # 要求mapper.py的输出做排序操作,以便对连续的word做判断,hadoop会自动排序
    if current_word == word:
        current_count += count
    else:
        if current_word:
            # 输出当前word统计结果到标准输出
            print('%s\t%s' % (current_word, current_count))
        current_count = count
        current_word = word

# 输出最后一个word统计
if current_word == word:
    print('%s\t%s' % (current_word, current_count))  

6.集群安装后,启动报错

slave1: /opt/hadoop/hadoop-2.8.5/bin/hdfs: line 305: /usr/local/jdk1.8.0_181/bin/java: 没有那个文件或目录
slave1: /opt/hadoop/hadoop-2.8.5/bin/hdfs: line 305: exec: /usr/local/jdk1.8.0_181/bin/java: cannot execute: 没有那个文件或目录

从节点slave1机器上hadoop配置需要修改,我这里因为jdk安装目录不一样导致的。修改hadoop-env.sh、mapred-env.sh、yarn-env.sh文件中的jdk路径

export JAVA_HOME=/usr/local/java/jdk1.8.0_131

7.集群安装完,数据上传到HDFS出错

[hadoop@localhost ~]$ hadoop fs -put /opt/hadoop/input/*.txt /user/hadoop/inputs
18/10/18 16:14:24 WARN hdfs.DataStreamer: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/hadoop/inputs/LICENSE.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.
        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1726)
        at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:265)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2567)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:829)
.
.
.
put: File /user/hadoop/inputs/README.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.

原因:参考

转载于:https://my.oschina.net/u/3851199/blog/2248897

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值