centos搭建大数据过程

centos8 搭建大数据全过程记录

一、软件下载地址如下:

https://blog.51cto.com/topic/centos7shezhiyongjiubieming.html?sort=time

  1. centos linux镜像下载地址: https://mirrors.aliyun.com/centos/8/isos/x86_64/
  2. vm ware station 下载地址https://www.vmware.com/cn/products/workstation-pro.html

永久激活码如下:

激活码名称 激活码
VMware Workstation 16 永久激活密钥 ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
VMware Workstation 15 永久激活密钥 YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8
UG5J2-0ME12-M89WY-NPWXX-WQH88
UA5DR-2ZD4H-089FY-6YQ5T-YPRX6
GA590-86Y05-4806Y-X4PEE-ZV8E0
YA18K-0WY8P-H85DY-L4NZG-X7RAD
ZF582-0NW5N-H8D2P-0XZEE-Z22VA
  1. chromedriver 安装地址: http://chromedriver.storage.googleapis.com/index.html

mac vmware fusion centos设置共享目录

  • 在虚拟机CentOS中安装了vmware-tools后,配置完成共享目录

  • 通过命令:vmware-hgfsclient 的执行结果可以看到你的共享目录名称

[pxy@localhost mnt]$ vmware-hgfsclient 
vm_share_folder
  • 手动挂载目录
sudo vmhgfs-fuse -o allow_other -o auto_unmount ".host:/vm_share_folder" "/mnt/share"
  • 检查是否挂载成功
[pxy@localhost mnt]$ ls
ls: cannot access hgfs: No such file or directory
cdrom  hgfs  share
[pxy@localhost mnt]$ cd share/
[pxy@localhost share]$ ls
big_data_soft
[pxy@localhost share]$ 
  • 自动挂载

修改/etc/fstab,加入如下内容

sudo vmhgfs-fuse -o allow_other -o auto_unmount ".host:/下载" "/mnt/hgfs"
  • 脚本实现
#!/bin/bash

vmware-hgfsclient | while read folder; do
  echo "[i] Mounting ${folder}   (/mnt/hgfs/${folder})"
  mkdir -p "/mnt/hgfs/${folder}"
  umount -f "/mnt/hgfs/${folder}" 2>/dev/null
  vmhgfs-fuse -o allow_other -o auto_unmount ".host:/${folder}" "/mnt/hgfs/${folder}"
done

sleep 2s

过程问题1:

  • 问题1: ls: cannot access hgfs: No such file or directory

解决办法,移除挂载目录hgfs

sudo umount /mnt/hgfs

过程问题2:

  • 问题2: is not in the sudoers file. This incident will be reported

解决办法:
1,root用户登录。
2,进入到/etc目录。
3,执行chmod u+w /etc/sudoers给sudoers文件增加write权限。
4,执行vim sudoers 找到root ALL=(ALL) ALL这一行,一下面增加hadoopALL=(ALL) ALL(注:hadoop为普通用户的用户名)
5,执行命令chmod u-w sudoers,撤销write权限。,
6,登录hadoop用户,进行测试。比如sudo cd /root 如果成功进入 /root目录说明配置成功

centos搭建java环境和配置java home

在Centos7上,通过yum install java,安装openjdk。安装后,执行echo $JAVA_HOME发现返回为空。说明JAVA_HOME没有配置,需要到/etc/profile中配置JAVA_HOME

  1. 第一个问题,就遇到了openjdk安装在哪里了?查询方法如下

which java ls -lrt /usr/bin/java ls -lrt /etc/alternatives/java

[pxy@localhost ~]$ which java
/usr/bin/java
[pxy@localhost ~]$ ls -lrt /usr/bin/java
lrwxrwxrwx. 1 root root 22 Jun 15 01:37 /usr/bin/java -> /etc/alternatives/java
[pxy@localhost ~]$ ls -lrt /etc/alternatives/java
lrwxrwxrwx. 1 root root 71 Jun 15 01:37 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java
[pxy@localhost ~]$ 

  1. 通过该命令查询到openjdk的安装路径后,编辑/etc/profile文件中配置JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
  1. 保存后退出,然后执行如下命令让配置生效。
source /etc/profile
[pxy@localhost ~]$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64
[pxy@localhost ~]$ 

搭建python 虚拟环境

  1. 安装虚拟环境 ``` pip install virtualenv virtualenvwrapper ````
  2. 编辑文件: vim ~/.bashrc 添加如下内容后,source ~/.bashrc
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
export export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
  1. 问题2: CentOS Linux 8 - AppStream 错误:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs
    解决办法:
  • 更换CentOS Linux 8的yum源
[root@17-132gui /]# cd /etc/yum.repos.d/
[root@17-132gui yum.repos.d]# ls -l
总用量 48
-rw-r--r--. 1 root root  719 218 14:36 CentOS-Linux-AppStream.repo
-rw-r--r--. 1 root root  704 218 14:36 CentOS-Linux-BaseOS.repo
-rw-r--r--. 1 root root 1130 915 09:11 CentOS-Linux-ContinuousRelease.repo
-rw-r--r--. 1 root root  318 915 09:11 CentOS-Linux-Debuginfo.repo
-rw-r--r--. 1 root root  732 915 09:11 CentOS-Linux-Devel.repo
-rw-r--r--. 1 root root  704 915 09:11 CentOS-Linux-Extras.repo
-rw-r--r--. 1 root root  719 915 09:11 CentOS-Linux-FastTrack.repo
-rw-r--r--. 1 root root  740 915 09:11 CentOS-Linux-HighAvailability.repo
-rw-r--r--. 1 root root  693 915 09:11 CentOS-Linux-Media.repo
-rw-r--r--. 1 root root  706 915 09:11 CentOS-Linux-Plus.repo
-rw-r--r--. 1 root root  724 915 09:11 CentOS-Linux-PowerTools.repo
-rw-r--r--. 1 root root 1124 915 09:11 CentOS-Linux-Sources.repo
[root@17-132gui yum.repos.d]# mkdir bak
[root@17-132gui yum.repos.d]# mv CentOS-Linux-* bak
[root@17-132gui yum.repos.d]# ls
bak
  • 下载新的源文件,并用命令yum makecache建立新的元数据缓存

## 阿里
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

## 网易
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@17-132gui yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
--2022-02-18 15:12:16--  https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 124.95.160.238, 124.95.160.244, 124.95.160.243, ...
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|124.95.160.238|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2495 (2.4K) [application/octet-stream]
正在保存至: “/etc/yum.repos.d/CentOS-Base.repo”

/etc/yum.repos.d/CentOS-B 100%[===================================>]   2.44K  --.-KB/s  用时 0s      

2022-02-18 15:12:16 (21.2 MB/s) - 已保存 “/etc/yum.repos.d/CentOS-Base.repo” [2495/2495])

[root@17-132gui yum.repos.d]# ls
bak  CentOS-Base.repo
[root@17-132gui yum.repos.d]# vim CentOS-Base.repo 
[root@17-132gui yum.repos.d]# yum makecache
CentOS-8.5.2111 - Base - mirrors.aliyun.com                           1.2 MB/s | 4.6 MB     00:03    
CentOS-8.5.2111 - Extras - mirrors.aliyun.com                          37 kB/s |  10 kB     00:00    
CentOS-8.5.2111 - AppStream - mirrors.aliyun.com                      1.1 MB/s | 8.4 MB     00:07    
元数据缓存已建立。
[root@17-132gui yum.repos.d]# 

centos8防火墙设置

1.查看防火墙状态

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor >
   Active: inactive (dead)
     Docs: man:firewalld(1)
# service firewalld start
Redirecting to /bin/systemctl start firewalld.service
# systemctl enable firewalld 

2.其他命令

systemctl status firewalld    # 查看firewalld服务状态
systemctl enable firewalld    # 设置firewalld服务开机启动
systemctl disable firewalld   # 禁止firewalld服务开机启动
service firewalld start       # 开启
service firewalld restart     # 重启
service firewalld stop        # 关闭
# 查看防火墙规则 注意:ssh的22端口默认开启,且不在该列表中
firewall-cmd --list-all

# 开放某个端口 如80
firewall-cmd --permanent --add-port=80/tcp
# 开放某个范围内的端口 如10000-11000
firewall-cmd --permanent --add-port=10000-11000/tcp

# 移除某个端口 如80
firewall-cmd --permanent --remove-port=80/tcp
# 移除某个范围内的端口 如10000-11000
firewall-cmd --permanent --remove-port=10000-11000/tcp

# 添加或移除端口 需重新加载才能生效
firewall-cmd --reload

安装hadoop

问题1 :hadoop的50070端口不能访问网页的解决方法

https://blog.csdn.net/xingyue0422/article/details/85316822
http://t.zoukankan.com/irobotzz-p-12639146.html

CentOS配置SSH免密登陆 地址

1.安装jdk

2.安装hadoop

以上的JAVA_HOME一般centos都已经安装好了,目录一般如下
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el8_4.x86_64/jre

3.配置hadoop配置文件: 配置文件路径: /usr/hadoop-3.3.3/etc/hadoop

  • core-site.xml
点击查看代码
<configuration>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:/usr/hadoop-3.3.3/tmp</value>
        </property>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://0.0.0.0:9000</value>
        </property>
    </configuration>  
  • hdfs-site.xml
点击查看代码
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>

        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/usr/hadoop-3.3.3/tmp/dfs/data</value>
        </property>

        <property>
                <name>dfs.namenode.http.address</name>
                <value>0.0.0.0:50070</value>
        </property>
    </configuration>  

  • mapred-site.xml
点击查看代码

<configuration>                                                                                                                                                          
        <property>                                                                                                                                                       
                <name>mapreduce.framework.name</name>                                                                                                                    
                <value>yarn</value>                                                                                                                                      
        </property>                                                                                                                                                      
                                                                                                                                                                         
                                                                                                                                                                         
        <property>                                                                                                                                                       
                <name>mapreduce.application.classpath</name>                                                                                                             
                <value>/home/hadoop/app/hadoop-3.3.3/share/hadoop/mapreduce/*:/home/hadoop/app/hadoop-3.3.3/share/hadoop/mapreduce/lib-examples/*</value>                
        </property>                                                                                                                                                      
                                                                                                                                                                         
        <property>                                                                                                                                                       
                <name>mapreduce.jobhistory.address</name>                                                                                                                
                <value>hadoop000:10020</value>                                                                                                                           
        </property>                                                                                                                                                      
                                                                                                                                                                         
        <property>                                                                                                                                                       
                <name>mapreduce.jobhistory.webapp.address</name>                                                                                                         
                <value>hadoop000:19888</value>                                                                                                                           
        </property>                                                                                                                                                      
                                                                                                                                                                         
        <property>                                                                                                                                                       
                <name>mapreduce.jobhistory.done-dir</name>                                                                                                               
                <value>/history/done</value>                                                                                                                             
        </property>                                                                                                                                                      
                                                                                                                                                                         
        <property>                                                                                                                                                       
                <name>mapreduce.jobhistory.intermediate-done-dir</name>                                                                                                  
                <value>/history/done_intermediate</value>                                                                                                                
        </property>                                                                                                                                                      
                                                                                                                                                                         
                                                                                                                                                                         
</configuration>                                                                                                                                                         


  • yarn-site.xml
点击查看代码

<configuration>

<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>

        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>

        </property>
</configuration>

4.以上配置好后,格式化namenode并启动服务

hdfs namenode -format
start-dfs.sh

5.访问ip+9870 http://192.168.21.128:9870/dfshealth.html#tab-startup-progress

3.centos安装docker

CentOS
$ sudo yum install yum-utils device-mapper-persistent-data lvm2
$
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce
$
$ sudo systemctl enable docker
$ sudo systemctl start docker

4. docker 启动mysql

docker run -p 3306:3306 --name pxymysql -v /home/pxy/mysql/conf:/etc/mysql/conf.d -v /home/pxy/mysql/logs:/logs -v /home/pxy/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

其中/home/pxy/mysql/conf
/home/pxy/mysql/logs
/home/pxy/mysql/data 自己本地目录需要自己创建

4.进入MySQL容器创建密码

进mysql容器操作mysql
# docker exec -it mysql bash

进mysql应用,使用root用户操作mysql
mysql -uroot -p 
mysql>

5.命令行中安装mysql

使用最新的包管理器安装MySQL

sudo dnf install @mysql  

安装完成后,运行以下命令来启动MySQL服务并使它在启动时自动启动:

sudo systemctl enable --now mysqld

要检查MySQL服务器是否正在运行,请输入:

sudo systemctl status mysqld

运行mysql_secure_installation脚本,该脚本执行一些与安全性相关的操作并设置MySQL根密码

sudo mysql_secure_installation

步骤如下:

  • 要求你配置VALIDATE PASSWORD component(验证密码组件): 输入y ,回车进入该配置
  • 选择密码验证策略等级, 我这里选择0 (low),回车
  • 输入新密码两次
  • 确认是否继续使用提供的密码?输入y ,回车
  • 移除匿名用户? 输入y ,回车
  • 不允许root远程登陆? 我这里需要远程登陆,所以输入n ,回车

mysql配置远程登陆

如果需要设置root账户远程登陆,上一步骤中,不允许root远程登陆?这一步需要设为n。
接下来本机登录MySQL,将root用户的host字段设为'%',意为接受root所有IP地址的登录请求:
本机登录MySQL:

`mysql -uroot -p<上面步骤中设置的密码>`

回车后即可登录,接下来终端变成了mysql>开头:
接着继续执行mysql语句,将将root用户的host字段设为'%':(用下面语句)

use mysql;
update user set host='%' where user='root';
flush privileges;

设置完成后输入exit退出mysql,回到终端shell界面,接着开启系统防火墙的3306端口:

sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload

关闭MySQL主机查询dns

MySQL会反向解析远程连接地址的dns记录,如果MySQL主机无法连接外网,则dns可能无法解析成功,导致第一次连接MySQL速度很慢,所以在配置中可以关闭该功能。
参考文档
打开/etc/my.cnf文件,添加以下配置:

[mysqld]
skip-name-resolve

重启服务
sudo systemctl restart mysqld

6.搭建hive

在搭建之前强力建议先如下文章

遇到的问题1: Hive报错 Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D

把所有的${system:user.name} 更改为 *** ${user.name***

遇到的问题2: ‘CTLGS‘ already exists (state=42S01,code=1050)的错误提示

进入到要连接的数据库下面,查看是否有一个hivemeta的database。如果有的话,直接删除掉hivemeta数据库,然后再重新初始化hive就可以了。

遇到的问题3:在初始化 schematool -initSchema -dbType mysql 报错: org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state wo

按照这篇文章搭建: https://blog.csdn.net/u011555260/article/details/109089688

7.安装配置spark



8.安装kafak

遇到的问题1: OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Out of memory' (errno=12)

free -m 查看内存
切换到root用户下

创建swapfile
# dd  if=/dev/zero  of=swapfile  bs=1024  count=500000  
count=空间大小 of空间名字
将swapfile设置为swap空间
# mkswap swapfile
启用交换空间,这个操作有点类似于mount操作
# swapon  swapfile (删除交换空间 swapoff swapfile)

1.进入Kafka安装目录进行验证操作

开启zookeeper,在一个终端中导航到Kafka安装目录下,执行bin文件夹中的zookeeper server-start..sh脚本

./bin/zookeeper-server-start.sh ./config/zookeeper.properties

2. 开启kafka,在一个新的终端执行Kafka安装目录下bin文件夹中的kafka-server-start..sh脚本

./bin/kafka-server-start.sh ./config/server.properties

3. 定义一个新的topic,在一个新的终端执行Kafka安装目录下bin文件夹中的kafka--topics.sh脚本

./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test

4. 使用kafka-topics.sh脚本,查看topic是否成功开启

./bin/kafka-topics.sh --list --bootstrap-server localhost:9092

5. 通过kafka-console-producer..sh脚本开启Kafka中的生产者服务,并输人一些用于测试的字符串。

./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test i am a boy, panxueyan

6. 在新终端中通过kafka-console-consumer..sh脚本开启消费者服务,用于接收消息。

kafka_2.13-3.2.0]$ ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

8.搭建pig

9.搭建hbase

通过如下url访问
http://192.168.21.128:16010/master-status

9.centos设置共享目录: https://blog.csdn.net/A10714075/article/details/123974225

大数据学习笔记

HDFS架构

1 Master(NameNode/NN) 带 N个Slaves(DataNode/DN)
HDFS/YARN/HBase

1个文件会被拆分成多个Block
blocksize:128M
130M ==> 2个Block: 128M 和 2M

NN:
1)负责客户端请求的响应
2)负责元数据(文件的名称、副本系数、Block存放的DN)的管理

DN:
1)存储用户的文件对应的数据块(Block)
2)要定期向NN发送心跳信息,汇报本身及其所有的block信息,健康状况

A typical deployment has a dedicated machine that runs only the NameNode software.
Each of the other machines in the cluster runs one instance of the DataNode software.
The architecture does not preclude running multiple DataNodes on the same machine
but in a real deployment that is rarely the case.

NameNode + N个DataNode
建议:NN和DN是部署在不同的节点上

replication factor:副本系数、副本因子

All blocks in a file except the last block are the same size

Hadoop伪分布式安装步骤
1)jdk安装
解压:tar -zxvf jdk-7u79-linux-x64.tar.gz -C ~/app
添加到系统环境变量: ~/.bash_profile
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
export PATH=JAVAHOME/bin:PATH
使得环境变量生效: source ~/.bash_profile
验证java是否配置成功: java -v

2)安装ssh
sudo yum install ssh
ssh-keygen -t rsa
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

3)下载并解压hadoop
下载:直接去cdh网站下载
解压:tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C ~/app

4)hadoop配置文件的修改(hadoop_home/etc/hadoop)
hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79

core-site.xml
	<property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop000:8020</value>
    </property>

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/app/tmp</value>
    </property>

hdfs-site.xml
	<property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

slaves    

5)启动hdfs
格式化文件系统(仅第一次执行即可,不要重复执行):hdfs/hadoop namenode -format
启动hdfs: sbin/start-dfs.sh
验证是否启动成功:
jps
DataNode
SecondaryNameNode
NameNode

	浏览器访问方式: http://hadoop000:50070

6)停止hdfs
sbin/stop-dfs.sh

Hadoop shell的基本使用
hdfs dfs
hadoop fs

Java API操作HDFS文件
文件 1 311585484 hdfs://hadoop000:8020/hadoop-2.6.0-cdh5.7.0.tar.gz
文件夹 0 0 hdfs://hadoop000:8020/hdfsapi
文件 1 49 hdfs://hadoop000:8020/hello.txt
文件 1 40762 hdfs://hadoop000:8020/install.log

问题:我们已经在hdfs-site.xml中设置了副本系数为1,为什么此时查询文件看到的3呢?
如果你是通过hdfs shell的方式put的上去的那么,才采用默认的副本系数1
如果我们是java api上传上去的,在本地我们并没有手工设置副本系数,所以否则采用的是hadoop自己的副本系数

Hadoop1.x

Hadoop1.x时:
MapReduce:Master/Slave架构,1个JobTracker带多个TaskTracker

JobTracker: 负责资源管理和作业调度
TaskTracker:
定期向JT汇报本节点的健康状况、资源使用情况、作业执行情况;
接收来自JT的命令:启动任务/杀死任务

YARN:不同计算框架可以共享同一个HDFS集群上的数据,享受整体的资源调度

XXX on YARN的好处:
与其他计算框架共享集群资源,按资源需要分配,进而提高集群资源的利用率
XXX: Spark/MapReduce/Storm/Flink

YARN架构:
1)ResourceManager: RM
整个集群同一时间提供服务的RM只有一个,负责集群资源的统一管理和调度
处理客户端的请求: 提交一个作业、杀死一个作业
监控我们的NM,一旦某个NM挂了,那么该NM上运行的任务需要告诉我们的AM来如何进行处理

  1. NodeManager: NM
    整个集群中有多个,负责自己本身节点资源管理和使用
    定时向RM汇报本节点的资源使用情况
    接收并处理来自RM的各种命令:启动Container
    处理来自AM的命令
    单个节点的资源管理

  2. ApplicationMaster: AM
    每个应用程序对应一个:MR、Spark,负责应用程序的管理
    为应用程序向RM申请资源(core、memory),分配给内部task
    需要与NM通信:启动/停止task,task是运行在container里面,AM也是运行在container里面

  3. Container
    封装了CPU、Memory等资源的一个容器
    是一个任务运行环境的抽象

  4. Client
    提交作业
    查询作业的运行进度
    杀死作业

YARN环境搭建
1)mapred-site.xml

mapreduce.framework.name
yarn

mapreduce.application.classpath HADOOPMAPREDHOME/share/hadoop/mapreduce/:HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*

/home/hadoop/app/hadoop-3.3.3/share/hadoop/mapreduce

mapreduce.application.classpath
HADOOPMAPREDHOME/share/hadoop/mapreduce/:HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib-examples/*

yarn.app.mapreduce.am.env HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory} mapreduce.map.env HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory} mapreduce.reduce.env HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}

2)yarn-site.xml

yarn.nodemanager.aux-services
mapreduce_shuffle

yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME
  1. 启动YARN相关的进程
    sbin/start-yarn.sh

4)验证
jps
ResourceManager
NodeManager
http://hadoop000:8088

5)停止YARN相关的进程
sbin/stop-yarn.sh

提交mr作业到YARN上运行:
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar

hadoop jar

hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 2 3

etc/hadoop/core-site.xml:

fs.defaultFS
hdfs://hadoop000:8020

hadoop.tmp.dir /home/hadoop/app/tmp

etc/hadoop/hdfs-site.xml:

dfs.replication
1

wordcount: 统计文件中每个单词出现的次数

需求:求wc

  1. 文件内容小:shell
    2)文件内容很大: TB GB ???? 如何解决大数据量的统计分析

> url TOPN < wc的延伸
工作中很多场景的开发都是wc的基础上进行改造的

借助于分布式计算框架来解决了: mapreduce

分而治之

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

核心概念
Split:交由MapReduce作业来处理的数据块,是MapReduce中最小的计算单元
HDFS:blocksize 是HDFS中最小的存储单元 128M
默认情况下:他们两是一一对应的,当然我们也可以手工设置他们之间的关系(不建议)

InputFormat:
将我们的输入数据进行分片(split): InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
TextInputFormat: 处理文本格式的数据

OutputFormat: 输出

MapReduce1.x的架构
1)JobTracker: JT
作业的管理者 管理的
将作业分解成一堆的任务:Task(MapTask和ReduceTask)
将任务分派给TaskTracker运行
作业的监控、容错处理(task作业挂了,重启task的机制)
在一定的时间间隔内,JT没有收到TT的心跳信息,TT可能是挂了,TT上运行的任务会被指派到其他TT上去执行

2)TaskTracker: TT
任务的执行者 干活的
在TT上执行我们的Task(MapTask和ReduceTask)
会与JT进行交互:执行/启动/停止作业,发送心跳信息给JT

3)MapTask
自己开发的map任务交由该Task出来
解析每条记录的数据,交给自己的map方法处理
将map的输出结果写到本地磁盘(有些作业只仅有map没有reduce==>HDFS)

4)ReduceTask
将Map Task输出的数据进行读取
按照数据进行分组传给我们自己编写的reduce方法处理
输出结果写到HDFS

使用IDEA+Maven开发wc:
1)开发
2)编译:mvn clean package -DskipTests
3)上传到服务器:scp target/hadoop-train-1.0.jar hadoop@hadoop000:~/lib
4)运行
hadoop jar /home/hadoop/lib/hadoop-train-1.0.jar com.imooc.hadoop.mapreduce.WordCountApp hdfs://hadoop000:8020/hello.txt hdfs://hadoop000:8020/output/wc

相同的代码和脚本再次执行,会报错
security.UserGroupInformation:
PriviledgedActionException as:hadoop (auth:SIMPLE) cause:
org.apache.hadoop.mapred.FileAlreadyExistsException: 
Output directory hdfs://hadoop000:8020/output/wc already exists
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: 
Output directory hdfs://hadoop000:8020/output/wc already exists

在MR中,输出文件是不能事先存在的
1)先手工通过shell的方式将输出文件夹先删除
	hadoop fs -rm -r /output/wc
2) 在代码中完成自动删除功能: 推荐大家使用这种方式
    Path outputPath = new Path(args[1]);
    FileSystem fileSystem = FileSystem.get(configuration);
    if(fileSystem.exists(outputPath)){
        fileSystem.delete(outputPath, true);
        System.out.println("output file exists, but is has deleted");
    }

partitioner
分区器:
分区器是一个类,它的作用是将数据分区到不同的节点上,这样就可以把数据分布到不同的节点上,这样就可以提高数据的分布性,提高数据的访问速度
分区器的作用是将数据分区到不同的节点上,这样就可以把数据分布到不同的节点上,这样就可以提高数据的分布性,提高数据的访问速度
分区器的作用是将数据分区到不同的节点上,这样就可以把数据分布到不同的节点上,这样就可以提高数据的分布性,提高数据的访问速度
分区器的作用是将数据分区到不同的节点上,这样就可以把数据分布到不同的节点上,这样就可以
xiaomi 200
huawei 300
xiaomi 100
huawei 200
iphone7 300
iphone7 500
nokia 20

Combiner
hadoop jar /home/hadoop/lib/hadoop-train-1.0.jar com.imooc.hadoop.mapreduce.CombinerApp hdfs://hadoop000:8020/hello.txt hdfs://hadoop000:8020/output/wc

使用场景:
求和、次数 +
平均数 X

Partitioner
hadoop jar /home/hadoop/lib/hadoop-train-1.0.jar com.imooc.hadoop.mapreduce.ParititonerApp hdfs://hadoop000:8020/partitioner hdfs://hadoop000:8020/output/partitioner

./start-yarn.sh
./mr-jobhistory-daemon.sh start historyserver

实战

用户行为日志:用户每次访问网站时所有的行为数据(访问、浏览、搜索、点击...)
用户行为轨迹、流量日志

日志数据内容:
1)访问的系统属性: 操作系统、浏览器等等
2)访问特征:点击的url、从哪个url跳转过来的(referer)、页面上的停留时间等
3)访问信息:session_id、访问ip(访问城市)等

2013-05-19 13:00:00 http://www.taobao.com/17/?tracker_u=1624169&type=1 B58W48U4WKZCJ5D1T3Z9ZY88RU7QA7B1 http://hao.360.cn/ 1.196.34.243

数据处理流程
1)数据采集
Flume: web日志写入到HDFS

2)数据清洗
脏数据
Spark、Hive、MapReduce 或者是其他的一些分布式计算框架
清洗完之后的数据可以存放在HDFS(Hive/Spark SQL)

3)数据处理
按照我们的需要进行相应业务的统计和分析
Spark、Hive、MapReduce 或者是其他的一些分布式计算框架

4)处理结果入库
结果可以存放到RDBMS、NoSQL

5)数据的可视化
通过图形化展示的方式展现出来:饼图、柱状图、地图、折线图
ECharts、HUE、Zeppelin

UserAgent

hadoop jar /home/hadoop/lib/hadoop-train-1.0-jar-with-dependencies.jar com.imooc.hadoop.project.LogApp /10000_access.log /browserout

结尾

spark启动:spark-shell --master local[2]

spark实现wc:
val file = sc.textFile("file:///home/hadoop/data/hello.txt")
val a = file.flatMap(line => line.split(" "))
val b = a.map(word => (word,1))
Array((hadoop,1), (welcome,1), (hadoop,1), (hdfs,1), (mapreduce,1), (hadoop,1), (hdfs,1))

val c = b.reduceByKey(_ + _)
Array((mapreduce,1), (welcome,1), (hadoop,3), (hdfs,2))

sc.textFile("file:///home/hadoop/data/hello.txt").flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_ + _).collect

Flink运行
./bin/flink run ./examples/batch/WordCount.jar
--input file:///home/hadoop/data/hello.txt --output file:///home/hadoop/tmp/flink_wc_output

Beam运行:

direct方式运行

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount
-Dexec.args="--inputFile=/home/hadoop/data/hello.txt --output=counts"
-Pdirect-runner

spark方式运行

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount
-Dexec.args="--runner=SparkRunner --inputFile=/home/hadoop/data/hello.txt --output=counts" -Pspark-runner

flink方式运行

posted @   热爱技术的小牛  阅读(222)  评论(2编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
热爱技术的小牛
点击右上角即可分享
微信分享提示