day 06Hadoop
更换虚拟机以后操作的步奏
1.到每一台机器上修改ip地址 ,然后修改hosts
1.5 给每台机器配置免密码登录
2.修改hadoop 的配置文件,发送到每台机器上
3.启动dfs start-dfs.sh PS:Netty现在已经成为大数据的主角了
PS:安装时hadoop格式化错误的解决方案, 说明 yarn没有起来
http://blog.csdn.net/weiyongle1996/article/details/74094989
安装Hadoop可能遇到的问题
1/运行mr程序出错, yarn没有启动
connecting to resoucemanager
retrying ....
retrying ..... 原因是没有启动yarn或者启动失败 2/初始化工作目录结构
hdfs namenode -format 只是初始化了namenode的工作目录
而datanode的工作目录是在datanode启动后自己初始化的 3/datanode不被namenode识别的问题
namenode在format初始化的时候会形成两个标识:
blockPoolId:
clusterId: 新的datanode加入时,会获取这两个标识作为自己工作目录中的标识 一旦namenode重新format后,namenode的身份标识已变,而datanode如果依然
持有原来的id,就不会被namenode识别 4/datanode下线后多久看到效果
datanode不是一下线就会被namenode认定为下线的,有一个超时时间 5/关于副本数量的问题
副本数由客户端的参数dfs.replication决定(优先级: conf.set > 自定义配置文件 > jar包中的hdfs-default.xml)
-------------------------------------------------离线计算系统-----------------------
0.Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
1.Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
2.
HDFS
NameNode
DataNode
1.1 什么是HADOOP
- HADOOP是apache旗下的一套开源软件平台-------也可以说是中间件
- HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理
- HADOOP的核心组件有
- HDFS(分布式文件系统) 要统计数据在一台机器上存不下,那么就要分块,还要记住文件在哪台机器上
- YARN(运算资源调度系统) 需要一种制度来管理硬件资源 resource manager、node manager
- MAPREDUCE(分布式运算编程框架) 任务的执行分为两个阶段,一个是maptask阶段,reducetask阶段。逻辑就写在 Mapreduce框架中。
- 广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈
PS: hadoop的生态圈 1. Hive是查询数据库的一个框架,(HDFS+MapReduce)的一个替代,用sql执行操作。
- 2. Workflow就是做工作流的问题, 用阿斯卡板,不用 乌贼(因为比较框架太重)
- 3. 右上角就是机器学习。
PS:传统的机器算法,和现在都差不多。都是在样本基础的上,分析样本的距离。
但是,hadoop出来以后,可以把所有的传统的计算算法进行实现,那么,速度执行效率有很大的提升,因为机器学习本身就是非常耗费机器资源的, 因为数据量的计算问题。
4.flume主要解决大数据的日志问题,因为大数据项目,日志必然很多,所以使用这个框架日志
5.左下角 sqoop解决的是数据的迁移问题,我们可以把传统的数据转移到关系型数据库,也可以把数据转移到hadoop数据库
PS:hadoop的框架引出, 比如说客户端有个任务统计字符,然后把人物分别打成jar包,放在每个服务器上。最后把做好数据返回给服务器。
但是比如说中间某台集群的机器挂了,就急需一个框架来解决问题。hadoop来了,我们只需关心业务逻辑,无需关心其他的复杂的问题。
PS:hadoop是一种框架,但是与传统的框架有不太一样。 因为传统 的框架需要导包,但是hadoop不一样,他需要多态服务器集群然后才可以利用相应的api。
像一个中间件,做离线的数据分析处理。
1.3 HADOOP在大数据、云计算中的位置和关系
- 云计算是分布式计算、并行计算、网格计算、多核计算、网络存储、虚拟化、负载均衡等传统计算机技术和互联网技术融合发展的产物。借助IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)等业务模式,把强大的计算能力提供给终端用户。
- 现阶段,云计算的两大底层支撑技术为“虚拟化”和“大数据技术”
- 而HADOOP则是云计算的PaaS层的解决方案之一,并不等同于PaaS,更不等同于云计算本身。
--------------------------分布式系统----------------------------------
PS:我的理解就是把一个大的 问题 分解为 多个小的问题 然后再汇总回来 ,完成并行计算。
----------------------------------------------------------------------------------------
3.1.2 案例需求描述
“Web点击流日志”包含着网站运营很重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值,广告转化率、访客的来源信息,访客的终端信息等。
3.1.3 数据来源
本案例的数据主要由用户的点击行为记录
获取方式:在页面预埋一段js程序,为页面上想要监听的标签绑定事件,只要用户点击或移动到标签,即可触发ajax请求到后台servlet程序,用log4j记录下事件信息,从而在web服务器(nginx、tomcat等)上形成不断增长的日志文件。
形如:
58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" |
3.2 数据处理流程
3.2.1 流程图解析
本案例跟典型的BI系统极其类似,整体流程如下:
但是,由于本案例的前提是处理海量数据,因而,流程中各环节所使用的技术则跟传统BI完全不同,后续课程都会一一讲解:
1) 数据采集:定制开发采集程序,或使用开源框架FLUME
2) 数据预处理:定制开发mapreduce程序运行于hadoop集群
3) 数据仓库技术:基于hadoop之上的Hive
4) 数据导出:基于hadoop的sqoop数据导入导出工具
5) 数据可视化:定制开发web程序或使用kettle等产品
6) 整个过程的流程调度:hadoop生态圈中的oozie工具或其他类似开源产品
PS:首先在 web系统的图片上预埋链接,记录到各个系统的分布式框架中的日志文件中。 如果是直接离线处理的话,就在HDFS系统中接着处理,后面使用mapreduce都数据进行分析,
在这里可以直接保存到Hive数据库中,也可以通过mahout对数据处理,最后导入mysql数据库中,进行数据可视化; 如果是实时对数据处理的话,使用kafka和spark直接汇入mysql,
到推荐界面(比如锤子手机说科大讯飞,使得科大讯飞用户猛增)
在推荐界面,还有自己的service进行干预,进行数据推荐(比如天冷就卖手套,情人节卖巧克力)
--------------------------------Hadoop集群安装-------------------------------------------------------
PS:Hadoop集群的 其实就是 hdfs的集群(name node)和yarn的集群(resource manager和 nodenanager)
PS:Hadoop的api非常多,但是我们只用常用的那几个就行了。在视频中都会讲解到。
4. 集群搭建
4.1 HADOOP集群搭建
4.1.1集群简介
HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起
HDFS集群:
负责海量数据的存储,集群中的角色主要有 NameNode / DataNode
YARN集群:
负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager
(那mapreduce是什么呢?它其实是一个应用程序开发包)
本集群搭建案例,以5节点为例进行搭建,角色分配如下:
hdp-node-01 NameNode SecondaryNameNode hdp-node-02 ResourceManager hdp-node-03 DataNode NodeManager hdp-node-04 DataNode NodeManager hdp-node-05 DataNode NodeManager |
部署图如下:
--------------------------------Hadoop 安装----------------------------
1.准备Linux环境
1.0先将虚拟机的网络模式选为NAT
1.1修改主机名
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=itcast ###
1.2修改IP
两种方式:
第一种:通过Linux图形界面进行修改(强烈推荐)
进入Linux图形界面 -> 右键点击右上方的两个小电脑 -> 点击Edit connections -> 选中当前网络System eth0 -> 点击edit按钮 -> 选择IPv4 -> method选择为manual -> 点击add按钮 -> 添加IP:192.168.1.101 子网掩码:255.255.255.0 网关:192.168.1.1 -> apply
第二种:修改配置文件方式(屌丝程序猿专用)
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static" ###
HWADDR="00:0C:29:3C:BF:E7"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="ce22eeca-ecde-4536-8cc2-ef0dc36d4a8c"
IPADDR="192.168.1.101" ###
NETMASK="255.255.255.0" ###
GATEWAY="192.168.1.1" ###
1.3修改主机名和IP的映射关系
vim /etc/hosts
192.168.1.101 itcast
1.4关闭防火墙
#查看防火墙状态
service iptables status
#关闭防火墙
service iptables stop
#查看防火墙开机启动状态
chkconfig iptables --list
#关闭防火墙开机启动
chkconfig iptables off
1.5 修改sudo
su root
vim /etc/sudoers
给hadoop用户添加执行的权限
关闭linux服务器的图形界面:
vi /etc/inittab
1.5重启Linux
reboot
2.安装JDK
2.1上传alt+p 后出现sftp窗口,然后put d:\xxx\yy\ll\jdk-7u_65-i585.tar.gz
2.2解压jdk
#创建文件夹
mkdir /home/hadoop/app
#解压
tar -zxvf jdk-7u55-linux-i586.tar.gz -C /home/hadoop/app
2.3将java添加到环境变量中
vim /etc/profile
#在文件最后添加
export JAVA_HOME=/home/hadoop/app/jdk-7u_65-i585
export PATH=$PATH:$JAVA_HOME/bin
#刷新配置
source /etc/profile
-----------------------------------------------------------------------------------------------
1.cd /home/
2. D:/Study/Java/chuanzhiboke大数据/视频/day06Hadoop/day06/软件/cenos-6.5-hadoop-2.6.4.tar.gz
mv /home/cenos-6.5-hadoop-2.6.4.tar.gz /root/cenos-6.5-hadoop-2.6.4.tar.gz
3.tar -zxvf cenos-6.5-hadoop-2.6.4.tar.gz -C apps/
PS:Hadoop虽然是用java 写的(跨平台),但是使用的时候还是要编译一下(需要安装很多的配置环境)。本人学习使用的是上面的tar包,centos6.5, 6.7也能用
3.安装hadoop2.4.1
先上传hadoop的安装包到服务器上去/home/hadoop/
注意:hadoop2.x的配置文件$HADOOP_HOME/etc/hadoop
伪分布式需要修改5个配置文件
3.1配置hadoop
第一个:hadoop-env.sh
vim hadoop-env.sh
#第27行
export JAVA_HOME=/root/apps/jdk1.7.0_45
第二个:core-site.xml
<!-- 指定HADOOP所使用的文件系统schema(URI),HDFS的老大(NameNode)的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bee1:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hdpdata</value>
</property>
第三个:hdfs-site.xml
<!-- 指定HDFS副本的数量,其实是可以不用配置 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>192.168.1.152:50090</value>
</property>
第四个:mapred-site.xml (mv mapred-site.xml.template mapred-site.xml)
mv mapred-site.xml.template mapred-site.xml //因为不编辑模板是空的
vim mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
第五个:yarn-site.xml
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bee1</value>
</property>
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
PS:配置好以后给每个机器传一份 scp -r apps bee3:/root
-------------------------------------------------------------------------------------
3.2将hadoop添加到环境变量
vim /etc/proflie
export JAVA_HOME=/root/java/jdk1.7.0_65
export HADOOP_HOME=/itcast/hadoop-2.4.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME=/root/apps/jdk1.7.0_45
export HADOOP_HOME=/root/apps/hadoop-2.6.4
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
把配置文件发给每台机器 sudo scp /etc/profile bee2:/etc 为了每台机器都能使用hadoop
source /etc/profile
3.3格式化namenode(是对namenode进行初始化,对配置文件初始化)
hdfs namenode -format (hadoop namenode -format)
-------------------------------------------------------------
PS:没有配置其他小弟,启动的话,可以在任何的机器上去启动
hadoop-daemon.sh start namenode 启动每一台机器
hadoop-daemon.sh stop namenode 关闭每一台机器
PS: 输入JMS测试系统是否启动,上图证明机器启动起来了
------------------------------------------------------------------------------
PS:如果这样启动的话,太浪费时间,我们需要脚本全部启动,slavs文件放所有的配置机器
PS:然后为老大,和小弟之间配置免密码登录。然后就可以 start-dfs.sh
关闭 stop-dfs.sh
-----------------------------
PS: 这个启动的过程很慢
PS:关闭分布式系统
3.4启动hadoop
先启动HDFS
sbin/start-dfs.sh
----------------------启动成功--------------------------------------------------
再启动YARN
sbin/start-yarn.sh
3.5验证是否启动成功
使用jps命令验证
27408 NameNode
28218 Jps
27643 SecondaryNameNode
28066 NodeManager
27803 ResourceManager
27512 DataNode
http://192.168.1.101:50070 (HDFS管理界面)
http://192.168.1.101:8088 (MR管理界面)
4.配置ssh免登陆
#生成ssh免登陆密钥
#进入到我的home目录
cd ~/.ssh
ssh-keygen -t rsa (四个回车)
执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免密登陆的目标机器上
ssh-copy-id localhost
---------------------------
ssh免登陆:
生成key:
ssh-keygen
复制从A复制到B上:
ssh-copy-id B
验证:
ssh localhost/exit,ps -e|grep ssh
ssh A #在B中执行
PS:其实namenode和datanode就是运行在分布式机器上的软件 PS: jps找出执行 的java进程
PS:
后来安装的时候,遇到了0个datanode
1.最后重新安装解决了问题 2.修改了tmp位置 和删除log 的位置
PS:安装时遇到的问题
1.jps命令找不到 http://blog.csdn.net/zhanglu1236789/article/details/50445261
----------------------------------------------------HDFS SHell-----------------------------------------------------------------------------------------------------------------------------------------------------
PS:服务端查看文件
PS: 客户端查看文件 (客户端访问命令使用的是箭头所指的,在hadoop/bin目录下面)
------------------------上传命令
1.hadoop fs -put test.sh / 上传test.sh到 /
PS:在网页端查看
PS:在客户端查看
PS:文件大小为128M才会对文件切分
PS:经过验证,大文件分成块以后是可以合并的并且使用的。所以框架帮我们做的也是这样的工作。
2. 观察其他机器备份的文件
3.1.hadoop fs -put test.sh / 获取文件
------------------------------体验mapreduce wordcount功能------------------------
PS:执行前确保三件事
1.集群的时间同步
2. start-dfs.sh只是启动hdfs
3.start-yarn.sh也应该启动,他启动的的是计算资源
1.cp wordtest.txt wordtest2.txt //创建文件,写入相应的字符,然后复制文件
2.创建 文件和文件夹上传到 /wordcount/input目录下
3.到 hadoop 的 share/mapreduce的目录下找到jar包,执行命令 执行成功就放在/wordcount/output目录下面
hadoop jar hadoop-mapreduce-examples-2.6.4.jar wordcount /wordcount/input /wordcount/output
4.查看mapreduce分析过的文件
hadoop fs -cat /wordcount/output/part-r-00000
-------------Java API文件系统的操作
-------------------------------------------
1.首先添加jar包,需要添加common和hdfs的jar和lib中的jar
2.因为windows系统,无法执行hadoop的东西,需要添加添加hadoop环境变量
-----------------------------------------------
import java.net.URI;
import java.util.Iterator;
import java.util.Map.Entry; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Before;
import org.junit.Test;
/**
*
* 客户端去操作hdfs时,是有一个用户身份的
* 默认情况下,hdfs客户端api会从jvm中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=hadoop
*
* 也可以在构造客户端fs对象时,通过参数传递进去
* @author
*
*/
public class HdfsClientDemo {
FileSystem fs = null;
Configuration conf = null;
@Before
public void init() throws Exception{ conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://bee1:9000"); //拿到一个文件系统操作的客户端实例对象
/*fs = FileSystem.get(conf);*/
//可以直接传入 uri和用户身份
fs = FileSystem.get(new URI("hdfs://bee1:9000"),conf,"root"); //最后一个参数为用户名
} @Test
public void testUpload() throws Exception { Thread.sleep(2000);
fs.copyFromLocalFile(new Path("D:/wordtest_PC.txt"), new Path("/wordtest_PC.txt.copy"));
fs.close();
} @Test
public void testDownload() throws Exception { fs.copyToLocalFile(new Path("/wordtest_PC.txt.copy"), new Path("d:/"));
fs.close();
} @Test
public void testConf(){
Iterator<Entry<String, String>> iterator = conf.iterator();
while (iterator.hasNext()) {
Entry<String, String> entry = iterator.next();
System.out.println(entry.getValue() + "--" + entry.getValue());//conf加载的内容
}
} /**
* 创建目录
*/
@Test
public void makdirTest() throws Exception {
boolean mkdirs = fs.mkdirs(new Path("/aaa/bbb"));
System.out.println(mkdirs);
} /**
* 删除
*/
@Test
public void deleteTest() throws Exception{
boolean delete = fs.delete(new Path("/aaa"), true);//true, 递归删除
System.out.println(delete);
} @Test
public void listTest() throws Exception{ FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
System.err.println(fileStatus.getPath()+"================="+fileStatus.toString());
}
//会递归找到所有的文件
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while(listFiles.hasNext()){
LocatedFileStatus next = listFiles.next();
String name = next.getPath().getName();
Path path = next.getPath();
System.out.println(name + "---" + path.toString());
}
} /* public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://bee1:9000");
//拿到一个文件系统操作的客户端实例对象
FileSystem fs = FileSystem.get(conf); fs.copyFromLocalFile(new Path("G:/access.log"), new Path("/access.log.copy"));
fs.close();
}*/ }
day 06Hadoop的更多相关文章
- weekend110(Hadoop)的 第一天笔记
(2015年1月10日) 课程目录 01-hadoop职位需求状况 02-hadoop课程安排 03-hadoop应用场景 04-hadoop对海量数据处理的解决思路 05-hadoop版本选择和伪分 ...
- weekend110(Hadoop)的 第二天笔记
(2015年1月11日) 课程目录 01-NN元数据管理机制 02-NN工作机制2 03-DN工作原理 04-HDFS的JAVA客户端编写 05-filesystem设计思想总结 06-hadoop中 ...
- Hadoop大数据学习视频教程 大数据hadoop运维之hadoop快速入门视频课程
Hadoop是一个能够对大量数据进行分布式处理的软件框架. Hadoop 以一种可靠.高效.可伸缩的方式进行数据处理适用人群有一定Java基础的学生或工作者课程简介 Hadoop是一个能够对大量数据进 ...
- 大数据Hadoop入门视频教程:Hadoop的快如入门
最新在学习hadoop .storm大数据相关技术,发现网上hadoop .storm 相关学习视频少之又少,这里整理了传智播客段海涛老师的hadoop学习视频,出来给大家学习交流. 视频下载地址:h ...
- 统计单词出现次数的mapreduce
1.新建Java项目 2.导包E:\工具\大数据\大数据提升资料\01-软件资料\06-Hadoop\安装包\Java1.8环境下编译\hadoop-2.7.3\hadoop-2.7.3\share\ ...
- Java程序操作HDFS
1.新建项目2.导包 解压hadoop-2.7.3.tar.gzE:\工具\大数据\大数据提升资料\01-软件资料\06-Hadoop\安装包\Java1.8环境下编译\hadoop-2.7.3\ha ...
随机推荐
- 各个版本的jee(servlet,jsp)对应的web.xml的模板
参考链接: https://yutuo.net/archives/7048a006eeb2ac85.html
- 四:(之一和之二) docker架构和底层技术分析(C/S架构)
1.架构和底层技术 Docker Host提供了RESTUL api,使docker client可以通过这些命令调用dockerd. Registry是一个公用的存储镜像的容器,类似于github. ...
- jdk8-四大函数式接口
jdk8四大核心接口 1.Comsumer接口 2.Function函数型接口 3.断言型接口 4.供给型接口 核心接口的子接口
- 3.7 C++派生类构造函数调用规则
参考:http://www.weixueyuan.net/view/6364.html 总结: 派生类构造函数可以自动调用基类的默认构造函数而无需显式调用. 生类构造函数可以自动调用基类的默认构造函数 ...
- 六、在U-boot中让LCD填充纯色
1. 编译U-boot 准备好U-boot压缩包urbetter-u-boot-1.1.6-v1.0.tgz,输入命令:tar -xvf urbetter-u-boot-1.1.6-v1.0.tgz ...
- php优秀框架codeigniter学习系列——前言
php的框架众多,笔者用过的包括thinkphp,CI,smarty,laravel,也用过一些公司自己开发的框架. thinkphp是国人自己开发的,我大概用过一段时间,基本功能都还好,应该也还比较 ...
- 分类算法的R语言实现案例
最近在读<R语言与网站分析>,书中对分类.聚类算法的讲解通俗易懂,和数据挖掘理论一起看的话,有很好的参照效果. 然而,这么好的讲解,作者居然没提供对应的数据集.手痒之余,我自己动手整理了一 ...
- php CURL 发送get,post请求
// 发送一个get请求 $url 发送地址 function get($url) { //初始化操作 $curl = curl_init($url); ...
- 字体图标Font Awesome 的使用
下载地址:http://fontawesome.dashgame.com/ 将下载下来的压缩包解压,然后解压,将下载的整个文件夹复制到你的项目中,在你需要用字体图标的html中引入“font-awes ...
- xargs用法
xargs是一个很有用的命令,它可以实现并行,同&有异曲同工之妙,在大批量管理服务器时非常有用 xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具.它擅长将标准输入数据 ...