深入理解Hadoop读书笔记-2

背景

公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的,需要考虑离线存储和计算引擎。

标签的数据量是巨大的,此时存储在mysql中是不合适的,所以我们考虑了分布式存储系统HDFS。目前考虑的架构是,把每条明细数据存储到HDFS中,利用Hive或者其他类SQL的解析引擎,定期进行离线统计计算。

查找相关资料后,我下载了深入理解Haddoop这本书,从大数据的一些基础原理开始调研,这一系列的笔记就是调研笔记。

系列文章:

深入理解Hadoop读书笔记1

深入理解Hadoop

安装部署-非CDH版本

总则:按照官网的文档一步一步部署即可,但是官网的太过简略,下面会补充一些内容。

官方文档地址

前置准备

部署前需要做一些前置准备,需要jdk和ssh。

JDK

Hadoop2.7以上的需要JDK7,Hadoop之前的版本使用JDK6即可,使用OpenJDK 或者 Oracle (HotSpot)'s JDK/JRE都可以 。

安装:sudo apt install openjdk-8-jdk-headless(Ubuntu下 )

ssh

SSH本质是一种远程登陆的方式。我们可以通过两种方式使用SSH,一种是直接 ssh 用户名@主机 输入用户的密码即可登录,但这种方式不够安全,需要把自己的密码告知对方;另一种是在被远程的机器上建立一把锁,提供给需要远程登陆的人一把钥匙,如果不想让其登录,把锁删了即可。

安装:SSH的安装及使用

下面介绍通过第二种方式登录需要做的设置

首先需要在被登录的主机上,使用下面命令生成公钥和私钥,第一个等待输入直接输入直接键入enter继续,第二个等待输入,需要输入一个访问密码,第三个等待输入也输入刚才相同的密码。

ging@ubuntu:~$ ssh-keygen

这个命令会在 ~/.ssh目录下生成两个文件:id_rsa是私钥,id_rsa.pub是公钥。

ging@ubuntu:~$ ls -l ~/.ssh
total 12
-rw------- 1 ging ging 2635 Aug 25 23:27 id_rsa
-rw-r--r-- 1 ging ging  565 Aug 25 23:27 id_rsa.pub

然后输入下面的命令,把本地的ssh公钥文件,复制到另外主机的 ~/.ssh文件夹中,中间需要输入对应主机用户的密码(因为这里我就一台虚拟机,所以模拟自己登录自己的操作,直接复制给自己)

ging@ubuntu:~$ ssh-copy-id ging@127.0.0.1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ging/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ging@127.0.0.1's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'ging@127.0.0.1'"
and check to make sure that only the key(s) you wanted were added.

这个命令后,会发现~/.ssh文件夹下出现了一个新的文件 authorized_keys

ging@ubuntu:~$ ls -l ~/.ssh
total 16
-rw-rw-r-- 1 ging ging  565 Aug 26 00:01 authorized_keys
-rw------- 1 ging ging 2655 Aug 26 00:00 id_rsa
-rw-r--r-- 1 ging ging  565 Aug 26 00:00 id_rsa.pub

远程登陆时,会提示需要输入刚才第二步设置的私钥文件的访问密码,如果成功即可远程登陆;如果连续三次输入失败,会要求输入登录用户的本地密码,正确也可以登录

ging@ubuntu:~$ ssh ging@127.0.0.1
Enter passphrase for key '/home/ging/.ssh/id_rsa': 
Enter passphrase for key '/home/ging/.ssh/id_rsa': 
Enter passphrase for key '/home/ging/.ssh/id_rsa': 
ging@127.0.0.1's password: 
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-42-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


221 updates can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable

Your Hardware Enablement Stack (HWE) is supported until April 2025.
Last login: Tue Aug 25 23:23:34 2020 from 127.0.0.1

如果不希望对方登录我们的主机,直接把 ~/.ssh文件夹删除即可,这样对方就只能使用我们的本地密码才能登录。

SSH的基本原理和使用介绍到这儿,接下来需要了解Hadoop集群需要的SSH配置

ssh Hadoop集群配置

Hadoop需要配置各个节点之间免密登录。

免密登录的操作步骤和上述的步骤类似,只不过在 ssh-keygen的步骤,不输入私钥文件的访问密码,三次等待输入都直接键入enter即可。

另外,需要在集群的各个主机中的每个~/.ssh/authorized_keys 文件中,都添加上其他主机的公钥,这样集群中的所有机器就可以互相免密访问了。

具体可以参考这个博客:Hadoop集群配置免密SSH登录方法

Hadoop安装部署

我这里部署的是2.10.0版本,百度网盘下载链接

链接:https://pan.baidu.com/s/1MHBPlf5lOnKK6MXOGl0PGA
提取码:fijb

注意:解压Hadoop的tar.gz这里略去不表,读者应该知道如何解压。

解压后,需要配置一下 etc/hadoop/hadoop-env.sh 这个脚本里面的java环境变量,在

export JAVA_HOME=${JAVA_HOME}

这行的上面直接加入下面的命令即可,其中,/usr/lib/jvm/java-8-openjdk-amd64是我本地jdk的路径

# The java implementation to use.
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

配置成功后,执行下面命令

其中,~/hadoop/hadoop-2.10.0/是我本地的hadoop的解压路径

ging@ubuntu:~/hadoop/hadoop-2.10.0$ ~/hadoop/hadoop-2.10.0/bin/hadoop

如果出现下面的文字,就配置完成了

ging@ubuntu:~/hadoop/hadoop-2.10.0$ ~/hadoop/hadoop-2.10.0/bin/hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
  CLASSNAME            run the class named CLASSNAME
 or
  where COMMAND is one of:
  fs                   run a generic filesystem user client
  version              print the version
  jar <jar>            run a jar file
                       note: please use "yarn jar" to launch
                             YARN applications, not this command.
  checknative [-a|-h]  check native hadoop and compression libraries availability
  distcp <srcurl> <desturl> copy file or directories recursively
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
                       Hadoop jar and the required libraries
  credential           interact with credential providers
  daemonlog            get/set the log level for each daemon
  trace                view and modify Hadoop tracing settings

Most commands print help when invoked w/o parameters.

Hadoop的部署分为三种模式。

  • 单机模式:只启动一个jvm进行MapResuce任务测试,没有守护进程的概念

  • 伪分布式:所有的守护进程都运行在一个单节点上

  • 完整分布式:守护进程运行在集群的不同节点上。

单机模式

操作完上面的步骤后,hadoop集群默认进入单机模式,官网文档中给出了一个测试jar包,指导我们如何测试,按照官网一步一步操作即可。

伪分布式

伪分布式部署介绍了两种方式,一种是不使用Yarn的MapReduce作业执行;另一种是把MR作业提交到Yarn框架执行。

这里跟着官方文档一步一步执行即可,需要注意一点:

官方文档中有个步骤

Browse the web interface for the NameNode; by default it is available at:

  • NameNode - http://localhost:9870/

这里需要访问:http://localhost:50070/ 这个端口才可以。

访问成功后,界面显示如下:

注意:Yarn模式部署时,提交任务后,虚拟机卡住,只能强制关闭虚拟机。

初步怀疑虚拟机配置的资源数小于任务执行需要的资源数(cpu核数1核,内存2G),查阅相关资料后得知,需要修改yarn分配内存和cpu的相关参数,以匹配真实虚拟机的资源,防止分配的资源大于虚拟机的资源。

相关配置项如下(以虚拟机8G内存为例):

Configuration File Configuration Setting Value Calculation 8G VM (4G For MR)
yarn-site.xml yarn.nodemanager.resource.memory-mb = containers * RAM-per-container 4096
yarn-site.xml yarn.scheduler.minimum-allocation-mb = RAM-per-container 1024
yarn-site.xml yarn.scheduler.maximum-allocation-mb = containers * RAM-per-container 4096
mapred-site.xml mapreduce.map.memory.mb = RAM-per-container 1024
mapred-site.xml mapreduce.reduce.memory.mb = 2 * RAM-per-container 2048
mapred-site.xml mapreduce.map.java.opts = 0.8 * RAM-per-container 819
mapred-site.xml mapreduce.reduce.java.opts = 0.8 * 2 * RAM-per-container 1638

相关项目解释参考这篇博文:Yarn 内存分配管理机制及相关参数配置

按照配置配置完成后,提交任务到Yarn,成功执行。

完整分布式

未完待续...

参考资料

ssh的用法,关于公钥和私钥

posted @ 2020-08-26 15:50  Ging  阅读(202)  评论(0编辑  收藏  举报