一起学Hadoop

因为上次面试的公司主要是做大数据风控的, 当然了, 大家也都知道大数据很火, 一直觉得大数据很难, 所以也没怎么去学习, 最近看了几个朋友发的博客, 也让我大概了解了大数据, 正好也有着Java 和 linux等基础. 所以就去学习学习大数据.(毕竟技多不压身嘛).

Hadoop

解决海量数据存储和数据分析计算的Apache的开源框架.

重点组件

  1. HDFS 分布式文件系统
    • NameNode(老大)管理
    • DataNode(小弟)存储数据
  2. MAPREDUCE 分布式运算程序开发框架
  3. HIVE SQL数据仓库工具
  4. HBASE 基于Hadoop的分布式海量数据库
  5. Zookeeper 分布式协调服务基础组件–RPC
  6. YARN 资源调度系统
    • ResourceManager(老大)
    • NodeManager
  7. Flume 日志数据采集框架
  8. Sqoop 数据迁移工具

Hadoop配置

众所周知 配置是我们在入手一门新的语言最重要的一道门槛, 大部分人都会停留下配置阶段, 因为每个人遇到的配置方面的bug都各不相同, 所以一旦有些配置自己不能解决了, 或者百度, 谷歌啥的也不能解决(其实都是查询的方式不对). 所以好多人就在这个时候放弃了.

所以我的这篇一起学Hadoop博客中最主要还是要具体说下 配置问题

  1. 准备linux环境
  2. 安装JDK
  3. 安装Hadoop(修改etc/hadoop的5个配置文件) 启动hdfs, yarn, 创建用户文件目录, 上传文件至目录, jar等等.
  4. 配置ssh免密登录

这里我搭建的是伪分布式的环境, 因为正式的环境至少要三台电脑, 伪分布式就是在自己本地上安装linux虚拟机即可.

准备linux环境就不用多说了吧.

建议下载的linux的最小化版本吧. 就是不带图形化界面的. 有linux基础的操作很简单的. 就是些文件上传, 远程登录, 还是就是一些软件的解压缩, 系统环境变量配置, 添加用户等等.

我是用的virtualBox 然后下载linux的centos7的iso镜像. 自行百度, 安装过程很傻瓜式的.

安装JDK

在linux安装JDK方式很多.

1
2
3
4
5
6
7
8
9
10
11
1. 方式一:
在本机上到oracle官网下载好jdk的压缩包,然后scp命令或者windows下有ftp的工具可以直接上传.
然后就在linux上解压缩, 命令就是 **tar -zxvf xxxxjdk1.8.0.tar.gz -C 这里放你想解压到哪个目录的路径**,
然后就是配置环境变量, 想要配置全局的(对所有用户都有效)就在 /etc/profile文件中配置, 针对具体用户请在 ~/.bash_profile中配置, 里面的语法都是Shell Script, 不懂的可以参考我之前的 一起学Shell Script.
也就是配置一下JAVA_HOME

JAVA_HOME=/usr/local/src/jdk1.8.0
export JAVA_HOME

PATH=$JAVA_HOME/bin:$PATH
export PATH

1
2
3
4
5
6
7
2. 方式二:
直接在linux上使用工具下载rpm版本的jdk. 可以不用配置环境变量, 默认将JAVA_HOME配置在/usr/java/default
使用wget下载, 如果没有wget的话, 可以在linux下使用 yum install wget下载, 然后具体的下载命令如下:
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.rpm

一定要加上--no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"这个绕过验证, 否则下载不了jdk的.
下载完成后解压缩: rpm -ivh xxxx.rpm 即可.

安装后要注意重新加载环境变量脚本: source /etc/profile

然后执行 java -version 如果能够正确打印java的信息, 配置就成功了.

至此 jdk 就算安装完了.

安装Hadoop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
同样的, 去Apache官网下载, 这里我也使用wget下载:
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz
然后用tar解压即可.
然后就是配置Hadoop的环境变量, 注意你hadoop放的目录可能和我不一样(对应修改下即可).
在 /etc/profile下

HADOOP_NAME=/usr/local/src/hadoop2.7.1
export HADOOP_NAME

PATH=$HADOOP_NAME/bin:$HADOOP_NAME/sbin:$PATH
export PATH

source /etc/profile 使配置脚本生效.
然后敲 hadoop 如果能输出相关输出, 则配置成功.

然后就是伪分布式hadoop环境具体的配置了.

1
2
3
4
5
6
> 先说下 Hadoop的比较重要的几个目录
> sbin: 启动和停止hadoop相关服务的脚本;
> bin: 对hadoop相关服务(hdfs, yarn)进行操作的脚本
> etc: hadoop的配置文件目录,
> share: hadoop的依赖jar包, 以及还有一些hadoop的示例程序, 比如 wordcount. 后面会具体说下.
> lib: hadoop本地库,

接下来就是具体的配置了, 一共5个配置文件

  1. 在 hadoop-evn.sh

    1
    大约在25-27行吧, 有一个 JAVA_HOME=${JAVA_HOME}, 改成绝对路径, JAVA_HOME=/usr/local/src/jdk1.8.0即可.
  2. core-site.xml hadoop核心配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!--配置hdfs的namenode, 即管理的主机地址, 可以直接填写 localhost, 端口一般配置 9000-->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://192.168.1.239:9000</value>
    </property>
    <!--配置datanode保存数据的位置, 该目录必须事先存在. 要创建-->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/root/training/hadoop/tmp</value>
    </property>
    `

注意:
结束了之后最好修改下datanode保存数据文件的权限

如果你是在Mac上部署的话, 不改这个权限会报错的(启动不了namenode和datanode)
sudo chmod -R a+w /Library/hadoop-2.7.3

  1. hdfs-site.xml 配置hdfs, hadoop的分布式文件系统.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!--配置hdfs的冗余度-->
    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>
    <!--配置是否进行权限检查-->
    <property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
    </property>
  2. mapred-site.xml 配置mapreduce

    1
    2
    3
    4
    5
    <!--配置mapreduce运行的框架,为yarn容器-->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
  3. yarn-site.xml 配置yarn

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- 配置resourceManager的地址 -->
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>192.168.1.239</value>
    </property>
    <!-- 配置nodemanager执行任务的方式 -->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    配置文件就算配置好了. 不过启动hadoop之前要格式化下namenode
  4. 格式化namenode

    1
    2
    hdfs namenode -format
    日志: xxxx has been successfully formatted
  5. 启动, (如果之前没配置免密码登录, 启动过程中会要求输出多次密码. 下面我会说下 免密码配置)

    1
    2
    3
    4
    5
    6
    7
    8
    start-all.sh
    1. 启动yarn 执行计算
    2. 启动hdfs 存储数据

    执行jps 查看是否有: datanode, namenode, resourcemanager, nodemanager等是否启动成功.
    到这里, 伪分布环境就搭建好了.

    同样的停止命令: stop-all.sh
  6. 访问方式:

    1
    2
    3
    4
    5
    1. 命令行
    2. Java API
    3. Web Console
    hdfs: 192.168.1.239:50070 这里可以看到hadoop的dfs文件系统的信息.
    yarn: 192.168.1.239.8088 这里可以看到hadoop的资源管理器 yarn的一些信息.
  7. mapreduce下的wordcount程序示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
1. 首先 cd 到hadoop下 hadoop-2.7.3/share/hadoop/mapreduce 目录中.
2. vim hello.txt, linux上没有vim的, 可以使用 yum install vim 即可.
3. 在hello.txt中写上一些:(随便写)
i love nanjing
i love China
i love jiangsu
nanjing is the center city in jianagsu of China
4. 在hadoop的hdfs中创建一个文件夹
命令: hdfs dfs -mkdir -p /data/input
5. 查看文件是否创建成功:
命令: hdfs dfs -ls /data
输出信息:
Found 1 items
drwxr-xr-x - Daejong supergroup 0 2018-01-16 13:20 /data/input
则创建成功
6. 将hello.txt文件上传到hdfs上;
命令: hdfs dfs -put hello.txt
查看是否上传成功:
命令:hdfs dfs -ls /data/input
输出结果:
Found 1 items
-rw-r--r-- 1 Daejong supergroup 92 2018-01-16 13:26 /data/input/hello.txt
则上传成功;
7. 执行wordcount程序(统计每个单词出现的次数)
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /data/input/hello.txt /data/output
这里执行的是一个可以独立运行的jar, 所以执行类型为jar
wordcount是该jar中的一个程序, 即统计单词出现的次数
/data/input/hello.txt 表示该程序输出的参数, 文件路径
/data/output 表示执行程序执行后输出结果的目录.

输出信息中有: 18/01/16 13:28:53 INFO mapreduce.Job: map 100% reduce 100%
即map 完成, reduce 完成, 表示程序执行成功;
8. 查看输出结果:
命令: hdfs dfs -ls /data/output
输出结果: 发现该目录下多了两个文件
Found 2 items
-rw-r--r-- 1 Daejong supergroup 0 2018-01-16 13:28 /data/output/_SUCCESS
-rw-r--r-- 1 Daejong supergroup 87 2018-01-16 13:28 /data/output/part-r-00000

这里的_SUCCESS是一个标志文件, 标志程序执行成功.
这里的part-r-00000是一个文本文件, 存放程序运行的结果. 我们使用命令查看文件内容:
命令: hdfs dfs -cat /data/output/part-r-00000
输出结果:
China 2
center 1
city 1
i 3
in 1
is 1
jianagsu 1
jiangsu 1
love 3
nanjing 2
of 1
the 1

可以比对下我们之前在hello.txt文件中输入的, 可以清晰的看到每个单词出现的次序.

至此, 我们已经配置好hadoop的所有环境变量. 也体验了hadoop中mapreduce的wordcount程序了.

免密码登录

1
2
3
4
5
6
7
8
9
10
11
1. 生成公钥和私钥:(在哪个用户下生成就是那个用户的秘钥对. 根据用户来区分的)
cd ~/.ssh/
ssh-keygen -t rsa 使用rsa加密算法, 生成一对秘钥. 然后直接回车就可.
然后查看该目录下生成了两个文件: id_rsa, id_rsa.pub, 一个公钥, 一个私钥.

2. 将公钥拷给自己
ssh-copy-id localhost
会生成一个文件authorized_keys
当然, 也可以 使用 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 即可.

3. 然后就可以 start-all.sh 就可以直接启动hadoop, 过程中就不用输出密码了.
1
2
3
4
5
6
7
8
9
10
11
12
信任的配置:(使用ssh远程登录时, 可以设置成不校验key, 也可以指定私钥, 从而可以进行远程登录.)
在 ~.ssh目录下: vim config

Host localhost
StrictHostKeyChecking no

Host 115.159.92.156
User root
IdentityFile ~/.ssh/id_rsa

Host *hadoop*
StrictHostKeyChecking no

还有一些其余的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
添加用户
useradd dottie
passwd dottie 若不设置密码, 每次可以先登录root, 然后 su - dottie 切换到dottie用户.
提示你输入密码


给dottie用户sudo权限即赋予用户root权限:
vim /etc/sudoers 在root下面添加一行即可
root ALL=(ALL) ALL
dottie ALL=(ALL) ALL

修改主机名:
hostnamectl set-hostname hadoop
查看主机名: hostname

注意点:
若没有权限: 则在root下修改权限:
sudo chmod -R a+w /root/training/hadoop/tmp
若没有sudo工具
yum install sudo

禁止掉ipv6网络: vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
然后使配置生效:
sysctl -p
输出配置的信息


关闭防火墙:centos7 firewalld, centos6iptables
systemctl status firewalld 查看状态
systemctl stop firewalld 停止


关闭selinux
输入: sestatus 查看selinux是否是enforcing
然后修改配置文件 将该状态关闭 vim /etc/selinux/config
把里面的内容: SELINUX=ENFORCING 修改为: SELINUX=disabled 即可.

配置ip和主机名映射:
sudo vim /etc/hosts文件:
添加一条记录:
192.168.1.239 master.hadoop
然后就可以 ssh master.hadoop 登录了.

百度—-ssh远程登录过程以及ssh会话管理连接