安装调试了两个晚上,终于在虚拟机上把hadoop的环境搭建好了,中间遇到一些问题这里一并记录一下。
安装hadoop的首要任务当然是打开官网看文档中的安装指南。中文的资料也有,但是还是会因为版本和系统问题遇到一些坑,这里统一使用官网的推荐的各版本搭配使用,效果更佳。
官网文档地址 >>> Go!
系统:ubuntu 16.04
依赖:ssh、pdsh、jdk-8、hadoop-3.0.0
别说了,升级一下你的apt后,开始大量下载和安装。
// 添加java远程镜像地址
$ sudo add-apt-repository ppa:webupd8team/java
// 升级安装工具
$ sudo apt-get update
$ sudo apt-get upgrade
// 安装ssh和pdsh
$ sudo apt-get install ssh
$ sudo apt-get install pdsh
// 安装java,安装器会提示你同意 oracle 的服务条款,选择 ok
$ sudo apt-get install oracle-java8-installer
$ sudo update-java-alternatives -s java-8-oracle
# 测试java是否安装成功
$ java -version
# java环境变量配置,进入profile文件,添加以下环境变量到文件末尾,然后激活
$ vi /etc/profile
$ source profile
下面的内容添加的profile
# set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/java-8-oracle # 这里目录要换成自己的jvm里面java的目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
hadoop镜像地址
点击链接(或者wget)下载指定版本:hadoop-3.0.0
$ wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-3.0.0/hadoop-3.0.0.tar.gz
解压tar文件
$ tar -zxvf hadoop-3.0.0.tar.gz
修改hadoop配置文件
$ cd hadoop-3.0.0.tar.gz/
$ vi etc/hadoop/hadoop-env.sh
# 添加JAVA_HOME环境变量到最后一行
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
此时我们所在的一直是hadoop-3.0.0.tar.gz/
目录
运行hadoop脚本,会显示可用的命令行命令
$ bin/hadoop
现在环境基本上配置齐全了!
此操作用于调试,不适用分布式文件系统和调度系统操作数据。
$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar grep input output 'dfs[a-z.]+'
$ cat output/*
仅仅在本地运行MapReduce任务。
首先在以下文件的中添加配置内容。
$ vi etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://localhost:9000value>
property>
configuration>
$ vi etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
configuration>
尝试是否可以免密码登陆自己的主机:
$ ssh localhost
如果不行,就做如下操作
# 如果已经有了rsa_id就不需要指向下面这一句
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
免密配置和hadoop配置文件都设置好了,现在开始指向。
# 格式化文件系统
$ bin/hdfs namenode -format
# 开启`命名空间节点NameNode(主节点)`和`数据节点DataNode`的守护进程
$ sbin/start-dfs.sh
产生的log文件见logs文件夹。
此时可以访问NameNode节点web管理页面:NameNode - http://localhost:9870/
创建执行MapReduce任务所需的HDFS目录:
# 此时`/user`目录是分布式文件系统的根目录。
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/userMe
将测试用的文件复制到分布式文件系统(HDSF)中:
$ bin/hdfs dfs -mkdir /user/userMe/input
$ bin/hdfs dfs -put etc/hadoop/*.xml /user/userMe/input
以本地运行的方式执行一次最简单的mapreduce任务,接下来也会讲在单节点YARN分布式调度系统上运行,这里主要是需要注意两者的区别,就是现在没有使用分布式调度功能!
小黑板:YARN集群-负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager。如果数据量少在本地环境就可以跑,如果数据量多就需要在YARN调度集群上实现分布式的大数据处理。
运行hadoop提供的mapreduce任务测试用例,并获得输出日志:
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar grep /user/userMe/input output 'dfs[a-z.]+'
查看输出日志:
$ bin/hdfs dfs -cat output/*
现在一次最简单的hadoop任务已经执行完毕了!我们可以关闭文件系统进程。
$ sbin/stop-dfs.sh
我们先执行命令开启HDFS守护进程:
$ sbin/start-dfs.sh
小黑板:HDFS集群:负责海量数据的存储,集群中的角色主要有 NameNode / DataNode/SecondaryNameNode。
这里提到一个问题:注意
在启动进程时会报一个没有权限访问系统(start-dfs.sh提示rcmd: socket: Permission denied)的错误,在网上找到了解决方案,链接:start-dfs.sh -> rcmd: socket: Permission denied
然后需要修改一些跟YARN有关的配置文件
$ vi etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
vi etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.nodemanager.env-whitelistname>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOMEvalue>
property>
configuration>
开启ResourceManager
和NodeManager
守护进程:
$ sbin/start-yarn.sh
此时可以访问ResourceManager
的web管理页面:http://localhost:8088/
然后运行一个MapReduce任务,上一节写的一样。
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar grep input output 'dfs[a-z.]+'
关闭yarn守护进程
$ sbin/stop-yarn.sh
这样,我们通过上面的步骤实现了单机的伪分布式文件系统的搭建,和在本地运行MapReduce任务与通过单节点的YARN调度来跑MapReduce任务。
更多文章可以访问我的个人博客:码练