前段时间开始学习大数据的一些知识,在查阅hadoop的资料时,因网上的数据比较乱,所以对相关资料整理汇总了一下,形成笔记,以方便以后查阅,也可供有兴趣的朋友共同学习参考。
学习过程主要参考了厦门大学林子雨老师的相关资料,特别感谢。
林子雨老师的博客(https://dblab.xmu.edu.cn/blog/author/ziyulin/)
学习过程中需要在ubuntu下运行,如需要虚拟机下安装、配置、运行ubuntu系统,可参考《Oracle VM VirtualBox 虚拟机安装Ubuntu并实现主机与虚拟机的数据共享》一文。地址:https://blog.csdn.net/hnkkfan/article/details/142138235。
【什么是hadoop】
Hadoop是apache开发的,分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架。其核心部件是HDFS与MapReduce。HDFS是一个分布式文件系统,MapReduce是一个分布式计算框架。说通俗点,HDFS像是一个可以动态扩展的用来存储大规模数据的大硬盘,MapReduce像是一个计算引擎,通过规则编写程序,用于完成指定的计算任务。
【所需软件】
1、jdk-8u191-linux-x64.tar.gz
2、Hadoop 3.13
以上两个资源以及后面要用到的hbase,可从我的迅雷网盘中下载:
链接:https://pan.xunlei.com/s/VO5ao8SwNl67SPRnqjpFZk33A1#
提取码:rnfk
【准备工作】
(一)创建hadoop用户
创作如在ubuntu安装时,用户名就是hadoop,就无需本步操作。
否则就要新建一个。
首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 ,并设置其密码:
sudo useradd -m hadoop -s /bin/bash
这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。
(二)安装hadoop前,需要安装并配置ssh和JDK。
1 、安装ssh并配置ssh无密码访问
SSH是一种安全的远程访问连接方式,利用ssh工具,可以远程访问linux电脑并进行操作。Hadoop无论是单机运行还是集群运行,都需要用到ssh工具。Ssh工具需要客户端和服务器端。默认情况下,ubuntu安装完成后已经包括了客户端,所以我们只需要下载安装服务器端就行了。
打开ubuntu的终端(快键键为CTRL+ALT+T,这个在后面的操作经常用到,最好记得这个快捷键),输入:
sudo apt-get install openssh-server 后回车,按系统要求输入密码,会开始安装open ssh server。
安装过程中,系统会提示需要的空间,并确认我们是否继续,按Y,然后回车继续。
直到如下界面,安装完成。
在终端中输入 ssh localhost 即开始运行ssh服务。
第一次运行会有如下提示,输入yes按回车
然后输入密码,出现以下界面,说明ssh服务器已经在运行了。
这时我们的ssh是需要密码的,我们需要用 ssh-keygen 生成密钥,并将密钥加入到授权中,完成后以后再次登录,就不需要输入密码了。
输入exit 先退出目前正在登录的ssh
进入主目录的.ssh文件夹,cd ~/.ssh/
【说明】~指的是当前用户的主目录,.ssh文件夹前面有”.”,说明这是一个隐藏,用ls看不到这个文件夹,用ls -a可以看到。
执行 ssh-keygen -t rsa,重新生成密钥,然后输入三个回车
最后输入cat ./id_rsa.pub >> ./authorized_keys ,将公钥内容追加到授权文件中。
这时我们再运行ssh localhost 就不需要输入密码了。
2 、安装并配置JDK
打开终端中,在/usr/lib/新建文件夹jvm,然后把下载中的jdk文件解压到/usr/lib/jvm下
然后我们到/usr/lib/jvm下,看看解压工作是否正常完成。如看到一个名字为jdk1.8.0_191
的文件夹,说明解压正常,复制下这个文件夹名称,后面要用。
回到主目录,用gedit把主目录下的.bashrc文件编辑一下
对这个命令说明一下:
1…bashrc是linux系统中用于存储用户个性化设置的一个脚本文件,用户可以根据自己的需求定制工作环境,例如设置环境变量、定义别名、配置命令提示符等。
2.因为这个文件的特殊性,所以对它编辑时要用sudo 即系统管理身份才能编辑。
3.gedit是一个文本文件编辑器,类似于windows下的记事本。
所以这句命令的意思就是用以系统管理的身份,用gedit来编辑~/.bashrc这个文件。
打开gedit后,把以下内容添加到文件开头。然后保存退出gedit
(如在终端中出现不支持设置属性 metadata::gedit-position的警示,不用管他)
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_191
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
执行source ~/.bashrc命令,让编辑好的.bashrc文件立即生效。
执行java version命令,检查一下配置脚本是否生效。如出现以下结果,则说明生效正常。
【安装hadoop并配置hadoop非分布式运行】
由于我在后面要学习安装hbase2.2.2,而hbase2.2.2要求hadoop版本必须在3.1.3之上,所上我们在这里也安装hadoop3.1.3。
同样,把下载文件夹中的hadoop解压到指定文件夹(/usr/local/),
然后把文件夹名从hadoop-3.1.3改为hadoop
最后把这个文件夹中所有文件的所才者改为hadoop
执行 /usr/local/hadoop/bin/下的hadoop version 命令,如出现hadoop 3.1.3等内容,说明hadoop安装成功。
这样hadoop 的单机运行环境就配好了,下面进行hadopp伪分布配置。
【 hadopp伪分布配置】
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml。两个文件都在/usr/local/hadoop/etc/hadoop下面。
使用命令sudo gedit ./etc/hadoop/core-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>
保存退出
同样修改hdfs-site.xml
命令:sudo gedit ./etc/hadoop/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>
然后保存退出。
配置完成后,执行 NameNode 的格式化:
cd /usr/local/hadoop
./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 的提示,具体返回信息类似如下:
接着开启 NameNode 和 DataNode 守护进程。
cd /usr/local/hadoop
./sbin/start-dfs.sh
然后运行jps来判断是否成功启动,如果成功启动则会列出如下进程: “NameNode”、“DataNode” 和 “SecondaryNameNode”,如下图所示:
此外,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做):
cd /usr/local/hadoop
./sbin/stop-dfs.sh # 关闭dfs
rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format # 重新格式化 NameNode
./sbin/start-dfs.sh # 重启dfs
成功启动后,我们可以访问 Web 界面 http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
OK,hadoop的伪分布系统为完成了,下面我们用一个例子来实验一下我们的效果。
【举个栗子】
比如,有7个文件放在~/mylogs/路径下面,内容是9月1日至9月7日每个用户登录公司OA系统的时间。
如下:
如我们希望分析下一这一周admin这个用户一共登录了几次,可以使用hadoop的mapreduce中的grep例子进行分析统计
由于grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:命令如下:
./bin/hdfs dfs -mkdir -p /user/hadoop
然后在hadoop的dfs分布文件系统下下新建一个input文件夹,并把上面的日志文件复制到这个文件夹中。
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ~/mylogs/*.* input
使用ls 看下目录,可以看到这些文件
./bin/hdfs dfs -ls input
使用命令:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'adm[a-z.]+'
【解释】grep mapreduce下的一个文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。这行命令的大概意思就是把input文件下所有文件进行搜索,把以adm开头的单词统计次数,并返回到output文件夹中。
完成后,可以使用以下命令查看结果:
./bin/hdfs dfs -cat output/*
可以看到admin这个用户在这一周内登录了70次。
上例中只是一个例子,mapreduce还有很多功能,有兴趣的朋友可以从相关资料中详细看下。
【小结一下】
hadoop配置完成后,以后我们的ubuntu再开机重启后,只需要在终端运行:
进入hadoop所在的路径:cd /usr/local/hadoop/
开始dfs:
./sbin/start-dfs.sh
如需关闭dfs,则需要运行:
./sbin/stop-dfs.sh
如需重新格式化namenode的命令,运行:
./bin/hdfs namenode -format