HDFS架构
1、Master(NameNode/NN) 对应 N个Slaves(DataNode/NN)
2、一个文件会被拆分成多个块(Block)
默认:128M
例: 130M ==> 128M + 2M
3、NameNode、DataNode负责内容:
NN:
1)负责客户端请求的响应
2)负责元数据(文件名称、副本系数、Block存放的DN)的管理
DN:
1)存储用的文件对应的数据块(Block)
2)定期向NN发送心跳信息(默认3秒),汇报本身及其所有的Block信息,健康状况
4、 重要提示:
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软件。
群集中的每个其他机器运行DATEAON软件的一个实例。
架构不排除在同一台机器上运行多个数据流。
但在实际部署中,情况很少。 #不建议这种操作
NameNode + N个DataNode
建议:NameNode、DataNode分布在单独的节点中
2)replication factor 副本系数、副本因子
3)All blocks in a file except the last block are the same size
除了最后一个块之外,文件中的所有块都是相同大小的
HDFS相关配置:
hadoop-env.sh,core-site.xml,hdfs-site.xml3个配置文件进行修改
机器参数配置
hostname:主机名
修改机器名:/etc/sysconfig/network
NETWORK=yes
HOSTNAME=主机名
设置IP和hostname的映射关系:IP地址:主机名
SSH免密码登录:
ssh-keygen -t rsa
5、HDFS优缺点
优点:
高容错
适合批处理
适合大数据处理
可构建在廉价机器上
缺点:
低延迟访数据访问
不适合小文件存储
6、MapReduce
1、特点
1)易于编程
2)良好的扩展性
3)高容错性
4)海量数据的离线处理
2、不擅长场景
1)实时计算
2)流式计算
3)DAG(有向无环图)计算
YARN架构:
1个RM(ResourceManager)主节点+N个NM(NodeManager)从节点
ResourceManager职责:一个集群active状态的RM只有一个,负责整个集群额资源管理和调度
1.处理客户端的请求(启动或杀死一个作业)
2.启动/监控ApplicationMaster(一个作业对应一个AM)
3.通过心跳监控NM
4.系统的资源分配和调度
NodeManager职责:整个集群中有N个节点,负责单个节点的资源管理和使用以及task的运行
1.定期向RM汇报本节点资源使用情况和各个Container的运行状态
2.接收并处理RM的Container启停的各种命令
3.单个节点的资源管理和任务管理
ApplicationMaster职责:每个作业/应用对应一个,负责 应用程序的管理
1.数据切分
2.为应用程序向RM申请资源(container),并分配给内部任务
3.与NM通信以启停task,task是运行在container中的
4.task的监控和容错
container职责:对任务运行情况的描述包括(cpu,memory,环境变量)
YARN执行流程:
1.用户向YARN提交作业
2.RM为该作业分配的第一个Container(启动AM)
3.RM会与对应的NM通信,要求NM在这个Container上启动应用程序的AM
4.AM首先向RM注册,然后AM将为各个任务申请资源,并监控运行情况
5.AM采用轮训的方式通过RPC协议向RM申请和领取资源
6.AM申请到资源后,便和相应的NM通信,要求NM启动任务
7.NM启动我们作业对应的task
YARN环境搭建:
mapred-site.xml配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml配置
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
启动yarn:sbin/start-yarn.sh
验证是否启动成功:jps
有如下进程:ResourceManager,NodeManager,Web访问:http://主机名:8088
停止yarn:sbin/stop-yarn.sh
提交MapReduce作业到yarn上运行:
jar包位置hadoop-2.x-cdh5.x/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.x-cdh5.7.jar
hadoop jar位置 wordcount /input/文件位置/文件名 /output/文件夹目录
再次执行该作业时会报错:
FileAlreadyExistsException:
Output directory hdfs://hadoop000:8020/ouput/wc already exists
Hive构建在Hadoop上的数据仓库,定义一种类SQL的HQL语言,通常用于离线数据处理
Hive底层的执行引擎有:MapReduce,Spark,Tez
压缩有Gzip,Lzo,SNappy,Bzip2
存储有:TextFile,SequenceFile,RCfile,ORCfILE,
UDF:自定义函数,自己发开
1.下载地址:
2.解压:tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app/
3.配置:export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
export PATH=$HIVE_HOME/bin:$PATH
4.安装一个MySQL yum install mysql-server,输入service mysqld start 启动服务,输入:mysqladmin -u root -p password ‘123456‘来设置密码
5.在conf文件夹中hive.env.sh配置hadoop的安装路径:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
6.配置mysql的数据信息:有4项
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!--alterdb为要创建的数据库名,注意字符集设置-->
<value>jdbc:mysql://localhost:3306/alterdb?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<!--MySQL登录账户名-->
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<!--MySQL登录密码-->
<value>123456</value>
</property>
</configuration>
7.拷贝mysql驱动到hive安装路径下lib文件夹中 cp ~/software/mysql-connector-java-5.1.27-bin.jar .
8.启动hive 在hive的安装目录下${HIVE_HOME/bin} 执行 ./hive
9.创建表:
创建数据表:
CREATE TABLE table_name
[(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
例如:create table hive_worddcount(context string);
如果创建数据表出现如下问题:hive> create table ehr_base(id string);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct MetaStore DB connections, we don‘t support retries at the client level.)说明MySQL中的hive数据库字符编码有问题,需要连接mysql服务器,并执行SQL语句修改hive数据库的字符编码alter database ‘数据库‘ character set latin1;
登录mysql(mysql --uroot -proot)
show tables;
select * from TBLS;
表的字段在COLUMNS_V2 select * from COLUMNS_V2;
表创建完成后,需要将数据加载到表里面(将linux服务器目录下的data中的数据例如hello.txt加载到hive表里面去)
使用Hive进行wordcount统计
10.加载数据到hive表
命令:LOAD DATA LOCAL INPATH ‘filepath‘ INTO TABLE tablename
例如:load data local inpath ‘/home/hadoop/data/hello.txt‘ into table hive_worddcount;
使用explode函数对split的结果集进行行拆列:
select explode(split(context,‘ ‘)) as word from hive_wordcount;
11.查询统计词频出现的次数:
select word,count(1) as count from (select explode(split(context,‘ ‘)) as word from hive_wordcount) word group by word order by count;
$hive> INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/wordcount_result’ SELECT word,count(1) FROM words GROUP BY word ORDER BY word;
LOCAL去掉表示导出到HDFS的目录;
lateral view explade()作用是把每行记录按照指定分隔符进行拆解
练习
1.创建员工表:
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘;
2.创建部门表:
create table dept(
deptno int,
dname string,
location string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘;
加载数据表到hive中,执行:如下的hive语句:
hive> load data local input ‘/home/hadoop/data/dept.txt‘ into table dept;
hive> load data local input ‘/home/hadoop/data/emp.txt‘ into table emp;
求每个部门人数?
select deptno,count(1) from emp group by deptno;
12.
hive sql 提交执行以后会生产mr作业,并在yarn运行
原文:https://www.cnblogs.com/fenghuoliancheng/p/10483073.html