Hadoop
本机集群机器:211 212 215 216
四台对应
s100 s101 s102 s103 s104
Ubuntu204-server-64-2-00 100 s100 211
node1
Ubuntu204-server-64-2-01 101 s101 212
node2
Ubuntu204-server-64-2-02 102 s102 215
node3
Ubuntu204-server-64-2-03 103 s103 215
node3
Ubuntu204-server-64-2-04 104 s104 216
node4
a)
bigdate
海量数据:
1byte = 8bit
1024B = 1M 2^10
1024M = 1G 2^10
1024G = 1T 2^10
1024T = 1P 2^10
1024P = 1E 2^10
1024E = 1Z 2^10
1024Z = 1Y 2^10
1024Y = 1N 2^10
存储
分布式存储
计算
分布式计算
Hadoop(一头大象) Doug cutting
Hadoop 可靠,可伸缩,分布式计算的开源软件。
HDFS
去
IOE (IBM+oracle+EMC)
MapReduce MR //
映射和化简,编程模型
推荐
Big data
4V 1)
Volumn //
题量大
2)
Variaty //
样式多
3)
Velocity //
速度快
4)
Valueless //
价值密度低
b)
Hadoop的安装:
(安装ubuntu系统)
安装
jdk
Ln –s /soft/jdk-xxx jdk
配置环境变量
JAVA_HOME = /soft/jdk PATH=”…:/soft/jdk/bin”
Source /etc/environment
Java –version
安装
hadoop
Hadoop.tar.gz
Hadoop version
配置环境变量
HADOOP_HOME PATH
配置
hadoop
分三个模式:
1.
standelone |local
//
独立
/
本地模式,使用的本地文件系统
Nothing
查看文件系统的方式:
查看文件系统
hadoop fs –ls /
没有守护进程,所有程序运行在同一JVM中,利用test和debug.
2.
Paeudo distributed Mode //
伪分布模式
3.
Fully distributed mode //
完全分布式
配置SSH
1)安装ssh
$sudo apt-get install ssh
2)生成密钥对
Ssh-keygen –t rsa –P ‘’ –f ~/.ssh/ Cd ~/.ssh3)导入公钥数据到授权库中
Cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
4)登录到localhost
Ssh localhost
5)格式化
hdfs
文件系统
Hadoop namenode -format
6)
启动所以进程
Start-all.sh 7)
查看进程
Jps
//5 RM NM NN DN 2NN
8)
查看文件系统
Hadoop fs -ls
9)创建文件系统
Hadoop fs –mkdir –p /user/Ubuntu/data
Hadoop fs –ls –R /
c)
Hadoop包含三个模块
1)
Hadoop common:
支持其他模块的工具模块
2)
Hadoop Distributed File System (HDFS)
分布式文件系统,提供了对应用程序数据的高吞吐量访问。
进程:
NameNode
名称节点
NN
DataNode
数据节点
DN
SecondaryNamenode
辅助名称节点
2ndNN
3)
Hadoop YARN:
作业调度与集群资源管理的框架。
进程
ResourceManager
资源管理
—RM NodeManager
节点管理器
—NM
4)
Hadoop MapReduce:
基于yarn系统的对大数据集进行并行处理技术
配置hadoop
1)
Standelone/local
d)
完全分布式安装:
1)准备5台客户机
本人集群机器:
211 212 215 216
四台对应
s100 s101 s102 s103 s104
ip 主机名 ip 主机名
1.
Ubuntu204-server-64-2-00 100 s100 211 node1
2.
Ubuntu204-server-64-2-01 101 s101 212 node2
3.
Ubuntu204-server-64-2-02 102 s102 215 node3
4.
Ubuntu204-server-64-2-03 103 s103 215 node3
5.
Ubuntu204-server-64-2-04 104 s104 216 node4
2)
安装ssh
1)
安装ssh
$sudo apt-get install ssh
2)生成密钥对
ssh-keygen –t rsa –P ‘’ –f ~/.ssh/ cd ~/.ssh
3)
导入公钥数据到授权库中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp /root/.ssh/* node2@:/root/.ssh/
scp /root/.ssh/* node3@:/root/.ssh/
scp /root/.ssh/* node2@:/root/.ssh/
4)
登录其他机器:
ssh node1 ifconfig
3)安装jdk
1.
rpm -ivh /opt/jdk-7u79-linux-x64.rpm
2.
ln –s /soft/jdk-xxx jdk
3.
配置环境变量
4.
JAVA_HOME = /soft/jdk
5.
PATH=”…;/soft/jdk/bin”
6.
source /etc/profile
7.
java –version
4)
安装hadoop
1.
tar –zxvf hadoop-2.7.3.tar.gz
2.
Hadoop version
3.
配置环境变量
4.
HADOOP_HOME=/soft/hadoop-2.7.3
5.
PATH=…:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
6.
配置hadoop 查看文件系统
hadoop fs –ls /
配置文件
/etc/hadoop/
core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node1:8020</value>
</property>
</configuration>
Hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
Mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager</name>
<value>localhost</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
5)
配置文件
-rw-r--r--. 1 root root 861 6
月
6 10:41 core-site.xml
-rw-r--r--. 1 root root 950 6
月
6 10:41 hdfs-site.xml
-rw-r--r--. 1 root root 844 6
月
6 10:41 mapred-site.xml
-rw-r--r--. 1 root root 728 6
月
6 10:43 yarn-site.xml
-rw-r--r--. 1 root root 12 6
月
6 10:43 slaves
/soft/hadoop/etc/hadoop/core-site.xml
fs.defaultFS=hdfs://node1/
/soft/hadoop/etc/hadoop/hdfs-site.xml
replication=3
dfs.namenode.secondary.http-address=node4:50090
/soft/hadoop/etc/hadoop/mapred-site.xml
mapreduce.framework.name=yarn
soft/hadoop/etc/hadoop/yarn-site.xml
yarn.resourcemanager.hostname=node1
/soft/hadoop/etc/hadoop/slaves node2 node3
在集群上分发以上三个文件
cd /soft/hadoop/etc/hadoop
xsync core-site.xml
xsync yarn-site.xml
xsync slaves
6)
首次启动
hadoop
1)
格式化文件系统
$>hadoop namenode -format
2)
启动所有进程
$>start-all.sh
3)
查询进程 jsp
4)
停止所有进程
Stop-all.sh
使用webui访问hadoop hdfs
1)
hdfs http:/node1:50070
2) dataNode http://node2:50075
3) 2nn http://node4:50090
删除hadoop临时目录数据:
默认:/tmp/
hadoop-root-datanode.pid(
伪分布式产生
)
e)
几种脚本
scp rsync xsync xcall
1)scp
2) rsync
远程同步工具
主要备份和镜像支持链接,设备。
rsync –rvl /soft/* ubuntu@s101:/soft
3)
自定义脚本
xsync,
在集群上分发文件
循环复制文件到所以节点的相同目录下
rsync –rvl /home/Ubuntu ubuntu@s101:
xsync hello.txt
[/usr/local/bin/xsync]
[root@node1 bin]# vim xsync
#!/bin/bash
pcount=$#
if((pcount<1)) ; then
echo no args;
exit;
fi
p1=$1;
#
获取文件名称
fname=`basename $p1`
echo fname=$fname;
#
获取上级目录的绝对路径
pdir=`cd -P $(dirname $p1);pwd`
echo pdir=$pdir;
#echo $p1;
cuser=`whoami`
for ((host=2; host<5;host=host+1)); do
echo ---------- node$host ---------
#echo $pdir/$fname $cuser@node$host:$pdir
scp $pdir/$fname $cuser@node$host:$pdir
done
4
)
编写
/usr/local/bin/xcall
脚本,在所有主机上执行相同的命令
xcall rm –rf /soft/jdk
[/usr/local/bin/xcall]
[root@node1 bin]# cd /usr/local/bin
[root@node1 bin]# xcall ls -l /soft/
[root@node1 bin]# xcall rm hello.txt
[root@node1 bin]# vim xcall
#!/bin/bash
pcount=$#
if((pcount<1)) ; then
echo no args;
exit;
fi
echo -------- localhost -------
$@
echo $@
for ((host=2; host<5;host=host+1)); do
echo ---------- node$host ---------
#scp $pdir/$fname $cuser@node$host:$pdir
ssh node$host $@
done
f)
整理hadoop的所有类库和配置文件
解压缩hadoop-2.7.2.tar.gz 到目录下
整理jar包
抽取所有配置文件
[core_default.xml]
hadoop-common-2.7.2.jar/core-default.xml
[hdfs-default.xml]
hadoop-hdfs-2.7.2.jar/hdfs-default.xml
[yarn-default.xml]
hadoop-yarn-common-2.7.3.jar/hdfs-default.xml
[mapred-default.xml]
hadoop-mapreduce-client-core-2.7.2.jar/mapred-default.xml
g)
hadoop fs /
使用:
hadoop fs –mkdir –p /user/Ubuntu/data
hadoop fs –put hello.txt /user/Ubuntu/data/
hdfs dfs -lsr /
hdfs dfs -cat /user/hello.txt
./hadoop fs -ls /
./hadoop fs –ls –R /
./hadoop fs -mkdir test
./hadoop fs -put /opt/test.sh /user
将本地文件存储至
hadoop ./hadoop fs –get /user/t/ok.txt /home/t 将hadoop上某个文件down至本地已有目录下
./hadoop fs -cat /user/test.sh
hadoop fs –rmr /user/t 删除hadoop上指定文件夹(包含子目录等)
hadoop fs -touchz /user/new.txt
在hadoop指定目录下新建一个空文件
hadoop fs –mv /user/test.txt /user/ok.txt (将test.txt重命名为ok.txt)
hadoop dfs –getmerge /user /home/t 将hadoop指定目录下所有内容保存为一个文件,同时down至本地
hadoop job –kill [job-id] 将正在运行的hadoop作业kill掉
h)
修改本地的临时目录hadoop.tmp.dir
1)
修改
hadoop.tmp.dir
[core-site.xml]
<property>
<name>hadoop.tmp.dir</name>
<value>/soft/hadoop-root</value>
</property>
2)
分发
core-site.xml
3)
hadoop namenode –format
后重启
hadoop
xcall mkdir /soft/hadoop-root
xcall rm –rf /soft/hadoop/logs
i)
hadoop
模块
1.
common
2.
hdfs
start-dfs.sh/stop-dfs.sh (先启动它)
nn
dn
2nn
3.
yarn
start-yarn.sh/stop-dfs.sh
rn
nn
4.
mapred
j)
hadoop
脚本分析
1.start-all.sh
libexec/hadoop-config.sh --设置变量
sbin/start-dfs.sh –config $HADOOP_CONF_DIR -- 启动
hdfs
sbin/start-yarn.sh –config $HADOOP_CONF_DIR --启动
yarn
2.libexec/hadoop-config.sh --设置变量
COMMON_DIR …
HADOOP_CONF_DIR=…
HEAP_SIEZ=1000M,
CLASSPATH=…
3.sbin/start-dfs.sh –config $HADOOP_CONF_DIR
启动
hdfs
1.libexec/hdfs-config.sh
2.
获取名称节点主机名
NAMENODES= hdfs getconf –namenodes
3.
启动名称节点
$HADOOP_prefix/sbin/hadoop-daemons.sh
--config $hadoop_conp_dir
--hostnames $namenodes
--script $bin/hdfs start namenode $nameStartOpt
4.
启动
datanode $HADOOP_prefix/sbin/hadoop-daemons.sh
--config $hadoop_conp_dir
--script $bin/hdfs start datanode $nameStartOpt
5.
启动
2nn $HADOOP_prefix/sbin/hadoop-daemons.sh
--config $hadoop_conp_dir
--hostnames $secondarynamenode
--script $bin/hdfs start secondarynamenode
4.libexec/hdfs-config.sh
libexec/hadoop-config.sh
5.sbin/hadoop-daemons.sh
--
启动守护进程脚本
1.libexec/hdfs-config.sh
--
执行配置脚本
2.slaves.sh --config $HADOOP_CONF_DIR cd $hadoop_prefic \;
$bin/hadoop-daemon.sh –config $hadoop_conf_dir “$@”
循环
slaves
文件,通过
ssh
方式登录远程主机,执行相应命令
[bin/hadoop-daemon.sh]
hadoop-config.sh
[bin/hdfs]
hdfs getconf –namenodes
hdfs getconf –secondaryNameNdoes
k)
在各个机子上启动节点:
hadoop-daemon.sh start namenode
hadoop-daemon.sh start secondarynamenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh stop datanode
数据库四个特点:
a atomic
原子性
c consistent
一致性
i isolation
隔离性
d durable
永久性
l)
常用命令:
格式化系统
hadoop namenode –format
put === copyFormLocal
hadoop fs –put //hdfs dsf –put
hdfs dfs –put //
重命名
hdfs dfs –mv ./sshd.txt ./how.txt
下载
hdfs dfs –get ./ssh.txt ./kk.txt
hdfs dfs –copyToLocal
移动到hdfs
hdfs dfs –moveFromLocal hello.txt .
从hdfs移动到本地,没有实现。
删除文件
hdfs dfs –rmdir …
在hdfs上进行文件复制
hdfs dfs –cp /user/Ubuntu/hello.txt /user/hello2.txt
hadoop
配置信息
namenode
的本地目录配置成多个,则每个目录存放内容相同,可靠性。
【hdfs-site.xml】
dfs.namenode.name.dir=file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2
datanode
也可以配置多个目录,不是副目录。
【hdfs-site.xml】
dfs.datanode.name.dir=file:///${hadoop.tmp.dir}/dfs/name1,file:///
${hadoop.tmp.dir}/dfs/name2
hadoop hdfs
文件大小
128M
磁盘的寻道时间
=10ms
磁盘的
IO
速率:
100MB/s
10 * 100 = 1s * 100M/s = 100M
通过API访问hdfs
@Test
public void writeFile() throwsException {
Configuration conf= newConfiguration();
FileSystem fs = FileSystem.get(conf);
Path path = new Path("hdfs://node1:8020/user/hello");
//
数据输出流
FSDataOutputStream dos = fs.create(path); dos.write("hello world !!!".getBytes());
dos.close();
System.
out
.println("over");
}
m)
在eclipse 安装hadoop插件,方便访问hdfs
下载
hadoop2x-eclipse-plugin.zip
解压
hadoop2x-eclipse-plugin.zip/release/*.jar(3)
到
eclipse
安装目录下
/plugins/下
重启eclipse
验证hadoop插件是否成功
剖析文件写入过程,
副本节点的选择(机架感知)
自定义机架感知
创建类实现
DNSToSwitchMapping
接口
配置文件
core-site.xml
[core-site.xml]
net.topology.node.switch.mapping.impl=com.it18zhang.rackaware.MyDNSToSwichmapping
分发core-site.xml
增加一个数据节点:
克隆一台机器,一个节点
启动新节点
hdfs是master /slave 架构,由一个名称节点以及多个数据节点构成,
nn负责namespace管理以及client的访问。
Namenode
存放元数据(名称,副本数,权限,快列表),不包含数据节点。
rack aware
策略
使用oie和oev查看namenode的镜像文件和编辑日志文件
离线工具:
hdfs oiv –p XML –I dfs/name1/current/fsimage_000 –o ~/image.xml
hdfs oiv –p XML –i xxx –o ~/xxx.xml //fsimage
hdfs oev –p XML -i xxx –o ~/xxx.xml //edit log
hadoop-daemon.sh stop namenode
hadoop-daemon.sh start namenode
hdfs dfsadmin –help saveNamespace
查看
nn
的镜像文件
hdfs oiv –p XML –I faimage –o xxx
查看
nn
的编辑日志文件
hdfs oev –p XML faedit-xxx –o xxx
n)
hadoop
集群启动是首先进入安全模式
如果集群出于安全模式,不能执行重要操作(写操作)。
集群启动完成后,自动退出安全模式。
安全模式操作
hdfs dfsadmin –safemode get //
查看安全模式状态
hdfs dfsadmin –safemode anter //
进入安全模式状态
hdfs dfsadmin –safemode leave //
离开安全模式状态
hdfs dfsadmin –safemode wait //
等待安全模式状态
保存名字空间
/
融合镜像和编辑日志:
进入安全模式
hdfs dfsadmin –safemode enter
进行保存hdfs dfsadmin –saveNamespace
退出安全模式
hdfs dfsadmin –safemode leave
一致性模型
scp
实现二个远程主机之间的文件复制。
$>scp –r hello.txt root@node4:/user/xx.txt
$>scp –r root@node4:/user/xx.txt ~/
$>scp –r -3 root@node4:/user/hello.txt root@noed1:/user/
distcp
实现二个 hadoop集群之间的递归数据复制
hadoop distcp hdfs://s101:8020/user/hello.txt hdfs://s102:8020/user/kk.txt
distcp和archive都是运行的一个MR作业,需要在yarn的框架上运行。
归档文件
hadoop archive –archiveName myhar.har –p /user/Ubuntu /user/my
查看归档:
hdfs dfs –lsr har:///user/my/myhar.har
解归档:
hdfs dfs –cp har:///user/my/myhar.har /user/your
数据完整性
o)
在ubuntu上安装eclipse
下载
eclipase-jee-mars-R-linux-gtk-x86_64.tar.gz
tar考到ubuntu /soft下
tar –xzvf eclise-xxx.tar.gz
配置环境变量:
PATH=…:/soft/eclipse
启动(后台)
eclipse &
p)
codec
编码解码器
1.deflate .deflate
2.gzip .gz
3.bzip2 .bz2
4.lzo .lzo
5.lz4 .lz4
6.snappy .snappy
deflateCodec: length=2054672, compressTime=1766, decompress=615
GzipCodec: length=2054684, compressTime=680, decompress=341
BZip2Codec: length=1457864, compressTime=10271, decompress=1695
LzoCodec: length=3636556, compressTime=499, decompress=303
Lz4Code: length=3644382, compressTime=177, decompress=392
SnappyCode: length=3987117, compressTime=424, decompress=434
空间效能:
Bzip2 > deflate > Gzip > lzo > lz4 > snappy
压缩时间:
lz4 > snappy > lzo > Gzip > deflate > Bzip2
解压缩时间:
lzo > Gzip > lz4 > snappy > deflate > Bzip2
使用
hadoop的checknative命令检查本地库安装情况
hadoop checknative –a
安装lzo-2.06版
lzo-2.06.tat.gz
./configure –enable-shared make make install
检查是否生成lzo库文件
find /usr/local/lib |grep lzo
编译
hadoop-lzo-master
项目:
hadoop-lzo-master.zip
编译
hadoop-lzo
c_INCLUDE_PATH=/usr/local/include
LIBRARY_PATH=/usr/local/lib
参考下文搭建maven环境。
mvn clean test
出现lzo共享库找不到,将liblzo2.so.xxx文件复制/lib目录下,
$>rsync –l /usr/local/lib/*lzo* root@node1:/lib
重新
mvn clean package
在hadoop 项目中集成hadoop-lzo-master的jar包
1.
复制生成的jar包到项目lib下
2.
cp target/hadoop-lzo-0.4.20-SNAPSHOT.jar ~/workspace/hadoop2-01/lib/
3.修改代码q)
centos上安装和使用 maven:apache-maven-3.3.9-bin.tar.gz到/soft下
配置maven的环境变量
etc/environment
M2_HOME=/soft/maven
PATH=…:/soft/maven/bin
配置maven的setting.xml文件,连接到本地仓库服务器。
注意:
maven安装在centos上nexus安装在win10上
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-
1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
配置maven插件
eclipse ->windows ->首选项-》maven ->user settings -> 右侧进行设置:
user settings :/soft/maven/conf/settings.xml
local repository :/home/Ubuntu/.m2/repository
完成
r)
win10安装maven:
1.
安装tomcat
2.
安装nexus.war文件
3.
复制nexus.war到${tomcat_home}/webapps/
4.
启动tomcat
5.
http://localhost:8080/nexus/
6.
本地服务器maven的配置
tomcat/webapps/nexus/WEB-INF/classes/nexus.properties
nexus-work=E:/maven-repo/nexus runtime=${bundleBasedir}
nexus-app=${runtime}
在win10 使用maven
1.
创建hello-world项目所在的文件夹
在hello-world文件夹下创建pom.xml
/hello-world/pom.xml
打开pom.xml
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it18zhang.heloo-world</groupId>
<artifactId>heloo-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>maven hello world project</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.
创建文件夹:
cd \workspace_eclipse\hello-world
mkdir
\src\main\java\com\it18zhang\helloworld
3.
创建
HelloWorld.java
文件
package com.it18zhang.helloworld;
public class HelloWorld {
public static void main(String[] args){
System.out.println("Hello world!!!");
} }4.
在pom.xml文件所在目录运行:
(需要安装maven apache-maven-3.5.0, 配置环境变量D:\software\apache-maven-3.5.0\bin 验证:mvn -v )
mvn clean compile
mvn clean
5.创建测试类包。。。
6.
创建包。。。
s)文件格式:
1.
txt 纯文本格式,若干行记录
2.
SequenceFile key-value //map
3.
编写
sequence
文件代码:
public class TestSequenceFile{
/*
* 写入
sequenceFile
* sequenceFile key-value
类似
map
*/
@Test
public void write() throws Exception{
Configuration conf= new Configuration();
conf.set("fs.defaultFS", "hdfs://node1:8020/");
FileSystem fs = FileSystem.get.(conf);
Path path = new Path("hdfs://node1:8020/user/myseqfile.seq");
Writer writer = SequenceFile.createWriter(fs,conf,path,IntWritable.class,Text.class
);
// //
写入数据
// writer.append(new IntWritable(1),new Text("tom1"));
// writer.append(new IntWritable(1),new Text("tom2"));
// writer.append(new IntWritable(1),new Text("tom3"));
// writer.append(new IntWritable(1),new Text("tom4"));
// writer.append(new IntWritable(1),new Text("tom5"));
// writer.close();
// System.out.println("-------------over-------------");
IntWritable key = new IntWritable();
Text value = newText();
for(int i=0;i<100;i++){
key.set(i);
value.set("star"+i);
writer.append(key, value);
}
System.out.println("-------------over-------------");
}
/*
*
读取
seqfile
*/
@Test
public void readSeq() throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://node1:8020/");
FileSystem fs = FileSystem.get(conf);
Path path = new Path("hdfs://node1:8020/user/myseqfile.seq");
Reader reader = new SequenceFile.Reader(fs,path,conf);
IntWritable key = new IntWritable();
Text value=new Text();
while(reader.next(key,value)){
System.out.println(key + " = " + value);
}
reader.close();
}
}
4.
查看是否写入:
hdfs dfs -cat /user/myseqfile.seq
hdfs dfs –test /user/myseqfile.seq
MapFile 是排序的seqfile具有索引。
index(seq) data(seq)
要求key按照大小顺序添加的。
index:
索引和偏移量的映射(seq),可以设置间隔值,默认128,
通过配置文件
io.map.index.interval
设置间隔值,可以进行折半查找。
data :key – value
可以寻找与指定key最近的key,可以设置是否向前寻找。
ArrayFile
key : index
value : value
SetFile
key : WritebleComparable
value : null
hadoo
序列化
没有元数据,数据间是独立的。数据量小,两边需要知道数据顺序,精简
1.
Writable
2.
IntWritable + Text + LongWritable
3.
DataOuputStream
4.
Text //java.lang.String
java
串行化
有元数据(数据类型)写入,数据量比较大,数据间不是独立的,存在相互引用的情况。
java : 3867297
hadoop : 47591150
class Address{
String province;
String city;
String street;
}
class Persion{
id
name
age
Address addr;
}
DataOutputStream
1.
writeUTF(“xxx”)
采用utf8存放数据。(字符采用1/2/3/字节数据存储);
2.
writeBytes(“xxx”) 每个字符只写入一个字节。
3.
writeChars(“xxx”) 每个字符两个字节。
4.
ArrayWritable
Array
5.
MapWritable
Map
6.
NullWritable
没有串行化
/
反串行过程,不涉及数据操作和网络传输,仅仅是一个占位符。单例模式(饿汉式)
.
SecondaryNamenode
1.
辅助名称节点
2ndNN
2.oiv off image viewer
3.oev
4.创建检查点过程
5.2nn
创建检查点的周期
hdfs dfsadmin
1.
设置配额管理
目录配额
控制的目录所有文件
/
文件夹的个数,1
表示空目录。
包含子文件。
$>hdfs dfsmain –setQuota 1 /user/Ubuntu/data //
设置配额
$>hdfs dfsadmin –clrQuota /user/Ubuntu/data
空间配额
副本数计算在内,控制的所有文件总大小。值至少大于
>384m,
磁盘空间最少消耗就是
384m.
$>hdfs dfsadmin –help setSpaceQuota //
查看空间配额
$>hdfs dfsadmin –setSpaceQuota 20m data //
设置空间配额
$>hdfs dfsadmin –clrSpaceQuota data //
清理空间配额
2.
快照
快照相当于对目录做一个备份。并不会立刻复制所有文件,而是指向同一个文件。当写入发生时,才会产生新文件。
$>hdfs dfs –help createSnapShot //
查看快照
$>hdfs dfsadmin –allowSnapshot data //
开启指定目录的快照功能,默认是禁用
$>hdfs dfs –createSnapShot /user/Ubuntu/data //
对目录创建快照
$>hdfs dfs –createSnapShot /user/Ubuntu/data xpc-0902 //
指定名称命名快照
$>hdfs dfs –renameSnapshot data s0902-0040.890 ubuntu_902 //
重命名快照
$>hdfs lsSnapshottableDir //
列出当前用户所有快照目录
$>hdfs diffSnapshot data . xpc_0902 //
比较两个快照目录的不同之处
3.
回收站
trash,对应的一个文件夹。
fs.trash.interval=0 //分钟数,
0表示禁用回收站,删除文件的存活时间。
fs.trash.checkpoint.interval //
检查回收站间隔时间,应该<= 存活时间,0表示和fs.trash.interval一致。
1.
启动回收站
core-site.xml fs.trash.interval=1
2.
分发文件,立刻生效
回收站位置:
/user/Ubuntu/.Trash/…
3.
通过程序删除的文件不会移过回收站,需要通过moveToTrash()才进入回收站。
Trash trash = new Treash(conf);
trash.moveToTrash(path);
4.丢弃回收站
hdfs dfs –expunge //
清空回收站
5.修改hdfs的webui的静态用户的名称。
core-site.xml
<property>
<name>hadoop.http.staticuser.user</name>
<value>Ubuntu</value>
</property>
t)大数据:
1存储
hdfs:hadoop distributed file system. GFS
分布式存储
2.运输
分布式运算。
MapReduce(MR) //映射 + 化简.编程模型
Key – Value
编写默认程序
1.
创建Mapper类(年份气温案例)
2.
创建Reducer
3.
创建MapReducer
4.
运行
5.
通过代码验证map和reduce分别运行在节点上?
MapReduce:Job
术语
MapTask:map任务
Reduce :task
map(映射)+reduce (简化)
Mapreduce
作业执行过程:
1.
编程源代码
2.
导出jar包
修改pom.xml文件
删除junit的scope部分
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
在项目下的
pom.xml文件右键运行
maven build…
Globals : package
确认
生产jar包
3.
上传ubuntu
4.
在ubuntu上提交job
hadoop jar xxx.jar com.xxx.xxx.xxxApp
/user/Ubuntu/data/ncdc /user/Ubuntu/out2
5.
win10无法提交作业给ubuntu.
交叉平台的问题。
eclipse中的maven项目需要查看源代码时,
项目不能够正常下载可以使用手动命令强制下载源代码
$>mvn dependency:sources –DdownloadSources=true
远程调试:
[远端(s100,namenode)]
1.
查看java远程调试的帮助
c:/>java –agentlib:jdwp=help
2.
设置java虚拟机的远程调试
java –agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000
//设置java虚拟机的参数,启用远程调试
3.
给namenode启动是增加jvm的远程调试功能,
a.
修改bin/hadfs启动脚本
HADOOP_NAMENODE_OPTS=$HADOOP_NAMENODE_OPTS –
agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000
b.
在shell当中直接设置环境变量
$>export HADOOP_NAMENODE_OPTS =”$HADOOP_NAMENODE_OPTS –
agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000”
c.
完成远程调试后,关闭远程调试功能
$>export HADOOP_NAMENODE_OPTS=
4.
启动名称节点
$>hadoop-daemon.sh start namenode
[客户端]
1.
找namenode类,在main函数上打断点.
2.
eclipse
右键调试
->remote java application
项目:
myhadoop ConnectionType : standard(socket attach)
host:s100
port:8000
3.
调试
开始调试
在win和ubuntu上通过远程调试,查看job在hadoop集群上的执行过远程
[远程s100,Ubuntu]
1.
传递jar到ubuntu
2.
设置
HADOOP_CLIENT_OPTS
环境变量
$>export HADOOP_CLIENT_OPTS=”$HADOOP_CLIENT_OPTS –
agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000”
3.
启动
job
提交命令
$>hadoop jar xxx.jar com.xx.x.x.App data/ncdc out3
[
客户端,
win7,eclipse]
1.
在源代码中设置断点
App.main()…
2.
eclipse
右键调试
->remote java application
项目:
myhadoop
ConnectionType : standard(socket attach)
host:a100
port:8000
3.
调试开始
MR AM :MapReduce App master
resMgrDelegate :ResourceManager
代理
YARM ResourceManager NodeManager
google PB:protocal buffer,
协议缓存区。
RPC
google protobuf
Remote procedure call,
远程过程调用
eclipse
启动服务端,客户端
ipc
切片大小和block相当,
优化策略(map),
1.
数据本地化优化策略
2.
机架本地化策略
3.
不同机架运行任务
Partition
分区
Combiner:
合成器
减低map和reduce之间的传输量。
启动
mr
作业历史服务器
1.启动
xcal mr –jobhistory-daemon.sh stop
historyserver
wordcount
空格分割的单词
block设置:
hdfs //
存储范围,
hdfs-site.xml
512的倍数
//512是校验和设置
切片
split //mr
作业范畴
minSplit , maxSplit , blocksize //
取中间值:
切片的数量决定了map task的数量
集群转换本地:
mapred-site.xml <value>local</value>
yarn-site.xml <value>localhost</value>
core-site.xml <value>file:///</value>
Debug Configurations -> Argunents D:/mr d:/mr/out/
u) 最后
命令:
which start-all.sh
find .
cat h1 >> h0
hdfs getconf -nnRpcAddresses
eclipse 单步跳过 单步进入
</configuration>
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property> </configuration>
[root@localhost conf]# vim slaves
10.10.1.212
10.10.1.215
[root@localhost conf]# vim masters
10.10.1.212
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
格式化:
./hadoop namenode -format
java --version
vim hadoop-env.sh
# The java implementation to use. Required. export JAVA_HOME=/usr/java/jdk1.8.0_101
./start-dfs.sh
./stop-dfs.sh
jps
http://10.10.1.206:50070
http://10.0.27.206:50070
(二) MapReduce
分布式计算框架
MapReduce
移动计算,而不是移动数据
split -> map -> sort -> reduce
(三) Shuffler
计算框架
在mapper和reducer中间的一个步骤
安装部署:
MapReduce 主JobTracker, 从TaskTracker.
安装DataName上
vim mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>10.0.27.206:9001</value>
</property>
http://10.0.27.206:50030
date -s "2017-05-17 15:03:00"
Hadoop fs
命令:
1,
Hadoop fs –fs [local | <file system URI>]
:声明hadoop使用的文件系统。
2,
hadoop fs –ls <path>
:等同于本地系统的ls,列出在指定目录下的文件内容,支持pattern匹配。输出格式如
filename(full path) <r n> size.其中n代表replica的个数,size代表大小(单位bytes)。
3,
hadoop fs –lsr <path>
:递归列出匹配pattern的文件信息,类似ls,只不过递归列出所有子目录信息。
4,
hadoop fs –du <path>
:列出匹配pattern的指定的文件系统空间总量(单位bytes),等价于unix下的针对目录的du –sb <path>/*
和针对文件的du –b <path> ,输出格式如name(full path) size(in bytes)。
5,
hadoop fs –dus <path>
:等价于-du,输出格式也相同,只不过等价于unix的du -sb。
6,
hadoop fs –mv <src> <dst>
:将制定格式的文件
move到指定的目标位置。当src为多个文件时,dst必须是个目录。
7,
hadoop fs –cp <src> <dst>
:拷贝文件到目标位置,当src为多个文件时,dst必须是个目录。
8,
hadoop fs –rm [-skipTrash] <src>
:删除匹配pattern的指定文件,等价于unix下的rm <src>。
9,
hadoop fs –rmr [skipTrash] <src>
:递归删掉所有的文件和目录,等价于unix下的rm –rf <src>。
10,
hadoop fs –rmi [skipTrash] <src>
:等价于unix的rm –rfi <src>。
11,
hadoop fs –put <localsrc>
…
<dst>:从本地系统拷贝文件到DFS
。
12,
hadoop fs –copyFromLocal <localsrc>
…
<dst>
:等价于-put
。
13,
hadoop fs –moveFromLocal <localsrc>
…
<dst>
:等同于-put,只不过源文件在拷贝后被删除。
14,
hadoop fs –get [-ignoreCrc] [-crc] <src> <localdst>
:从DFS拷贝文件到本地文件系统,文件匹配pattern,若是多个文件,则dst必须是目录。
15,
hadoop fs –getmerge <src> <localdst>
:顾名思义,从DFS拷贝多个文件、合并排序为一个文件到本地文件系统。
16,
hadoop fs –cat <src>
:展示文件内容。
17,
hadoop fs –copyToLocal [-ignoreCrc] [-crc] <src> <localdst>
:等价于-get
。
18,
hadoop fs –mkdir <path>
:在指定位置创建目录。
19,
hadoop fs –setrep [-R] [-w] <rep> <path/file>
:设置文件的备份级别,
-R标志控制是否递归设置子目录及文件。
20,
hadoop fs –chmod [-R] <MODE[,MODE]
…
|OCTALMODE> PATH
…:修改文件的权限,
-R
标记递归修改。
MODE为a+r,g-w,+rwx等,
OCTALMODE为755这样。
21,
hadoop fs -chown [-R] [OWNER][:[GROUP]] PATH
…:修改文件的所有者和组。
-R表示递归。
22,
hadoop fs -chgrp [-R] GROUP PATH
…:等价于
-chown
…
:GROUP
…。
23,
hadoop fs –count[-q] <path>
:计数文件个数及所占空间的详情,输出表格的列的含义依次为:
DIR_COUNT,FILE_COUNT,CONTENT_SIZE,FILE_NAME
或者如果加了
-q
的话,还会列出
QUOTA,REMAINING_QUOTA,SPACE_QUOTA,REMAINING_SPACE_QUOTA
。
转载路径:
http://www.blogjava.net/changedi/archive/2013/08/12/402696.html
[root@node1 bin]# ./hadoop fs -ls /
./hadoop fs -mkdir test
./hadoop fs -put /opt/test.sh /user
将本地文件存储至
hadoop
./hadoop fs –get /user/t/ok.txt /home/t
将hadoop上某个文件down至本地已有目录下
./hadoop fs -cat /user/test.sh
hadoop fs –rmr /user/t
删除hadoop上指定文件夹(包含子目录等)
hadoop fs -touchz /user/new.txt
在
hadoop
指定目录下新建一个空文件
hadoop fs –mv /user/test.txt /user/ok.txt (将test.txt重命名为ok.txt)
hadoop dfs –getmerge /user /home/t 将hadoop指定目录下所有内容保存为一个文件,同时down至本地
hadoop job –kill [job-id]
将正在运行的hadoop作业kill掉
java打jar包:
项目
-> export ->java -> JAR file ->
选择导出目录。
下一步
./hadoop jar /opt/MapReduceTools.jar mr01.JobRun
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
============================================
hadoop 2.7.3
============================================================
cd /opt/hadoop2.7.3/etc
vim hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/java/jdk1.8.0_101
vim hdfs-site.xml
vim core-site.xml
vim slaves
node2
node3
node4
启动
JournalNode
cd /opt/hadoop-2.7.3/sbin/
./hadoop-daemon.sh start journalnode
./hdfs namenode -format
在node1上
格式化
cd /opt/2hadoop/dfs/name/current
原数据文件
node1
./hadoop-daemon.sh start namenode node1
上启动
namenode
cd ../logs tail -n100 hadoop-root-namenode-node1.out
vim /opt/hadoop-2.7.3/logs/hadoop-root-namenode-node1.out
cd /opt/hadoop-2.7.3/bin/ ./hdfs namenode -bootstrapStandby node2
上拷贝
cd /opt/hadoop2/dfs/name/current node2
/opt/hadoop-2.7.3/bin ./hdfs zkfc -formatZK
格式化
zkfc
cd /opt/hadoop-2.7.3/sbin/ ./stop-dfs.sh
cd /opt/hadoop-2.7.3/sbin/ ./start-dfs.sh
./hdfs dfs -mkdir -p /opt/file
./hdfs dfs -put /opt/jdk-7u79-linux-x64.rpm /opt/file
http://10.0.27.206:50070 Utilities ->Browse Directory
查看文件大小
http://10.0.27.212:50070
ResourceManager
启动:
cd /opt/hadoop-2.7.3/etc/hadoop
vim mapred-site.xml
vim yarn-site.xml
sbin]# ./start-yarn.sh
ResourceManager nodemanager
http://10.0.27.206:8088
eclipse安装hadoop
导包:
hadoop-2.7.3\share\hadoop\common
hadoop-2.7.3\share\hadoop\common\lib
hadoop-2.7.3\share\hadoop\mapreduce
hadoop-2.7.3\share\hadoop\yarn
hadoop-2.7.3\share\hadoop\hdfs
java打jar包:
项目
-> export ->java -> JAR file ->
选择导出目录。
下一步
1003 cd hadoop-2.7.3/bin/
1006 ./hdfs dfs -mkdir -p /usr/input/hot
1007 ./hdfs dfs -put data /usr/input/hot
1016 ./hadoop jar /opt/hadoop2.7.3.jar com.bjsxt.mr.RunJob
http://10.0.27.212:50070/explorer.html#/usr/output/hot
./hdfs dfs -cat /usr/output/hot/part* |head -n10
hive
Hive
是数据仓库,
Hive 是解释器,编译器,优化器等。
hive
安装:
https://my.oschina.net/jackieyeah/blog/735424
apache-hive-2.1.1-bin.tar.gz
cd /opt/apache-hive-2.1.1-bin/conf/
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties
修改
hive-env.sh
因为Hive 使用了Hadoop, 需要在hive-env.sh 文件中指定Hadoop 安装路径:
JAVA_HOME=/opt/java ##Java
路径
export
HADOOP_HOME=/opt/hadoop ##Hadoop
安装路径
HIVE_HOME=/opt/hive ##Hive
安装路径
HIVE_CONF_DIR=/opt/hive/conf ##Hive
配置文件路径
创建HDFS目录
在Hive 中创建表之前需要创建以下HDFS 目录并给它们赋相应的权限。
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /user/hive/tmp
hdfs dfs -mkdir -p /user/hive/log
hdfs dfs -chmod 777 /user/hive/warehouse
hdfs dfs -chmod 777 /user/hive/tmp
hdfs dfs -chmod 777 /user/hive/log
修改
hive-site.xml
将
hive-site.xml
文件中以下几个配置项的值设置成上一步中创建的几个路径。
<property>
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission.
For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created,
with ${hive.scratch.dir.permission}.</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/user/hive/log</value>
<description>Location of Hive run time structured log file</description>
</property>
安装
mysql
yum install mariadb mariadb-server mariadb-devel
service mariadb restart
mysql
----------------
yum install mysql-server
service mysqld restart
--------------------------
创建数据库和用户
假定你已经安装好MySQL。下面创建一个hive 数据库用来存储 Hive 元数据,且数据库访问的用户名和密码都为hive
。
mysql> CREATE DATABASE hive;
mysql> USE hive;
mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';
mysql> FLUSH PRIVILEGES;
mysql> quit;
运行
Hive
在命令行运行
hive
命令时必须保证以下两点:
HDFS
已经启动。可以使用
start-dfs.sh
脚本来启动
HDFS
。
MySQL Java
连接器添加到
$HIVE_HOME/lib
目录下。我安装时使用的是
mysql-connector-java-5.1.39.jar
。
schematool -dbType mysql -initSchema
要使用
Hive CLI
(
Hive command line interface
)
,
可以在终端输入以下命令:
hive
hive> show tables;
OK
MariaDB [(none)]> use hive;
MariaDB [hive]> show tables;
hive>create table t_emp(id int,name string,age int,dept_name string)row format delimited fields
terminated by ',';
导入数据:
load data local inpath '/opt/emp.txt' into table t_emp;
hive>select * from t_emp;
---------------------------------export LANG=zh_CN.UTF-8
HQL
脚本三种方式执行:
1,hive-e 'hql'
2,hive -f 'hql.file'
3,hive jdbc
代码执行脚本
eclipse 创建hive 添加jar包
C:\workspace_eclipse\apache-hive-2.1.1-bin\lib
启动
hiveserver2
服务:
vim hive-site.xml
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
<description>Bind host on which to run the HiveServer2 Thrift service.</description>
</property>
[root@node1 bin]# ./hive --service hiveserver2
netstat -an|grep 10000
./beeline
!connect jdbc:hive2://node1/default
Error: Could not open client transport with JDBC Uri: jdbc:hive2://node1:-1/default: Cannot open
without port. (state=08S01,code=0)
hive
有二种函数:
UDF ,UDAF
1,udf:
输入数据为一条数据,输出数据也为一条数据,
2,udaf:
输入数据为多条数据,
count
聚合函数,
Avg,min,
计数框架
Mapper
mr
hadoop
生态系统
hdfs hbase MapReduce Mahout Pig Hive zookeeper Flume Sqoop
hbase:
hbase-1.2.5-bin.tar.gz
vim hbase-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_101
vim hbase-site.xml
vim regionservers
vim hbase-env.sh
export HBASE_MANAGES_ZK=false
cp -a /opt/hadoop-2.7.3/etc/hadoop/hdfs-site.xml . /opt/hbase-1.2.5/bin
sh start-hbase.sh
./hbase-daemon.sh start master
同步时间:
ntpdate 1.asia.pool.ntp.org service ntpd start
修改给上海时区:
cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
* */2 * * * root ntpdate 1.asia.pool.ntp.org;hwclock -w
http://10.0.27.206:16010/master-status
./hbase shell
hbase(main):002:0> create 't_person','cf1'
hbase(main):003:0> list hbase(main):004:0> put 't_person','007','cf1:name','zs'
hbase(main):005:0> flush 't_person'
./hbase hfile -p -f /../../
anptl