前言
最近由于工作中的项目将要用到大数据和底层数据抽取,所以花了些时间研究了相关的技术。已经整理出了相关的文档上传到了csdn,但是现在上传的资源不能自己设置免费, 系统自动生成了5积分才能下载,所以打算在博客中写出来。如果有不对的地方欢迎指正。
简介
1.hadoop: 大数据处理框架,三个基本组件hdfs,yarn,Mapreduce
2.hbase:和hadoop配合使用,结构化数据的分布式存储系统
3.kettle:开源的etl工具,用来进行数据抽取
如标题所说,在使用关系型数据库(例如mysql,oracle)时,如果数据是按秒级进行刷新,并且历史数据需要记录方便以后进行数据分许,那么这个数据量就非常大,这个时候使用hadoop来存储非常合适。想要实现最终目的我分了5个步骤。也分为5篇文章来叙述。
1)hadoop集群环境搭建
2)使用kettle抽取mysql数据到hadoop
3)基于hadoop集群搭建hbase
4)抽取mysql数据到hbase表中
5)抽取任务定时执行
hadoop集群环境搭建
Linux命令
1.向系统中增加了一个新组zu1,同时指定新组的组标识号(GID)是888。
groupadd -g 888 zu1
2.删除已知组zu1
groupdel zu1
3.将组zu1的标识号改为10000,组名修改为zu2
groupmod –g 10000 -n zu2 zu1
4.将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组
newgrp root
5.查看组信息:cat /etc/group
在/etc/group 中的每条记录分四个字段:
第一字段:用户组名称;
第二字段:用户组密码;
第三字段:GID
第四字段:用户列表,每个用户之间用逗号(,)号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
6.查询 wangkang所属的组都有哪些
[root@localhost ~]# groups wangkang
wangkang: zu1
7.将用户wangkang从zu1中删除
gpasswd zu1 -d wangkang
8.将用户wangkang加入到zu1中
usermod -a -G zu1 wangkang
安装前准备
Java版本:1.8
Hadoop版本:2.7.7
两台CentOS7虚拟机,修改主机名,内存分别为2G,固定ip地址。我的虚拟机分别是
master 192.168.93.131(主服务器)
slave1 192.168.93.132(从服务器)
1.使用root用户
分别在两台机器中新建用户wangkang,主目录为/home/wangkang(也可以在安装系统时直接创建出这个用户)
将用户wangkang加入到root用户组中
2.使用root用户
在两台机器的/etc/hosts文件中都加入
192.168.93.131 master
192.168.93.132 slave1
用丛域名解析
3.使用wangkang用户
将java安装包下载到主目录也就是/home/wangkang目录下(也可以下载好上传至linux系统下),输入命令
$cd ~ (进入主目录)
$tar -zxvf jdk-8u8o-linux-x64.tar.gz (解压缩)
4.使用wangkang用户
因为主从服务器需要相互访问,所以需要设置免密登陆
分别在两台机器上执行
$cd ~
$ssh-keygen -t rsa (生成本机密钥)
在master主机上执行
$cd ~ /.ssh/(进入隐藏文件夹.ssh)
$ssh-copy-id 192.168.93.131(把生成的本机密钥追加到自身的authorized_keys文件里)
$scp /home/wangkang/.ssh/authorized_keys 192.168.93.132:/home/wangkang/.ssh/
(把master中的authorized_keys文件拷贝到slave1中)
在slave1中执行
$ssh-copy-id 192.168.93.132(把生成的本机密钥追加到authorized_keys文件里)
注意:此时authorized_keys问件中包含了两台机器的密钥。
$scp /home/wangkang/.ssh/authorized_keys 192.168.93.131:/home/wangkang/.ssh/
(把slave1中的authorized_keys文件拷贝到master中)
免密登陆配置完成。
验证是否成功:
在master上
$ssh slave1(登陆slave1,第一次登陆需要密码)
输入slave1的密码后成功登陆slave1
$exit(退出)
$ssh slave1(第二次登陆不需要密码)
在slave1上同样去登陆master验证免密登陆是否成功
安装配置hadoop
整个过程使用wangkang用户在master主机上进行
1.和解压缩jdk一样,将hadoop压缩包上传或直接下载到wangkang的主目录下,然后解压缩
2.在hadoop解压后的目录下创建新目录
$cd ~/hadoop-2.7.7
$mkdir tmp
$mkdir hdfs
$mkdir hdfs/data
$mkdir hdfs/name
3.修改hadoop的配置文件
进入~/hadoop-2.7.7/etc/hadoop
1)core-site.xml,添加
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.93.131:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/wangkang/hadoop-2.7.7/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
2)hdfs-site.xml,添加
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/wangkang/hadoop-2.7.7/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/wangkang/hadoop-2.7.7/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.93.131:9001</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address</name>
<value>192.168.93.131:10000</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
3)yarn-site.xml,添加
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>192.168.93.131:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>192.168.93.131:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>192.168.93.131:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>192.168.93.131:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192.168.93.131:8088</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
4)mapred-site.xml(如果没有这个文件,就去找mapred-site.xml.templete文件,拷贝一份后,将其中一个文件名改为mapred-site.xml)
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.93.131:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.93.131:19888</value>
</property>
5)slaves文件(3.0的版本中叫workers文件),添加
192.168.93.132
6)hadoop-env.sh,添加
Export JAVA_HOME=/home/wangkang/jdk_1.8.0_75
7)yarn-env.sh,添加
Export JAVA_HOME=/home/wangkang/jdk_1.8.0_75
8)将master主机上配置好的hadoop文件夹赋值到slave1中
$cd ~
$scp -r ./hadoop-2.7.7 192.168.93.132:/home/wangkang
安装后配置
分别在两台机器上使用root用户,打开/etc/profile文件,添加环境变量
export JAVA_HOME=/home/wangkang/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/home/wangkang/hadoop-2.7.7
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/lib
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
执行命令是环境变量立刻生效
#source /etc/profile
此命令生效后,如果关闭终端再打开,会发现环境变量失效了,此时还要再执行一遍#source /etc/profile。
解决办法是关机重启,然后环境变量就会一直生效了。
环境变量失效的后果是,很多脚本命令执行起来会报命令不存在的提示,例如jps
hadoop fs ,start-all.sh
初始化及运行验证(全部使用wangkang用户)
在master机器上执行以下命令:
$hdfs namenode -format
(格式化hdfs,此操作只能执行一次,多次执行可能会出现问题,当看见/name has been succussfully formatted 表名格式化成功)
$start-dfs.sh(启动hdfs,第一次启动较慢)
$start-yarn.sh(启动yarn)
$ jps(使用jps命令查看master机器上的java进程),如下
在slave1机器上执行以下命令:
通过问页面查看namemode,在虚拟加master上打开浏览器,输入192.168.93.131:50070,可以进入页面
但是在本机上访问虚拟机master的192.168.93.131:50070地址却打不开。
查证后发现是虚拟机的防火墙没有关闭,关闭后即可访问
分别在master上slave1上使用root用户
#sudo firewall-cmd --state(查看防火墙状态)
#sudo systemctl stop firewalld.service(关闭防火墙,只对本次启动有用,重启后防火墙依然打开)
# sudo systemctl disable firewalld.service(设置防火墙默认关闭,下次启动后不会开启)
如图
运行hadoop自带的mapreduce例子wordcount
wordcount是一个jar包,一个简单的mapreduce实现,用来统计文件中每个单词出现的次数
1.在/home/wangkang下创建一个叫做test.txt的文件,里面写上几个单词,如图
2.在hdfs文件系统中创建名为word的路径
$hadoop fs -mkdir -p /word
3.将本地的test文件上传至hdfs文件系统中的word路径下
$hadoop fs -put /home/wankang/test.txt /word/
4.需要执行的jar包在hadoop安装目录下,路径为
/home/wangkang/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar,执行此jar的命令是
$hadoop jar /home/wangkang/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /word /out
其中
wordcount是这个jar包内部映射的一个别名;
/word是hdfs文件系统中,需要计算的文件存放的路径;
/out是计算结果存放的路径。这个路径是有你来指定的,系统会在hdfs文件系统中自动生成。但是,这个路径在执行命令前一定不能存在,否则会执行失败
执行结果如图
5.查看执行的结果
$hadoop fs -text /out/part-r-00000
6.执行时会遇到的问题。
问题1.
Invalid resource request, requested memory < 0, or requested memory > max configured, requestedMemory=1536, maxMemory=1024
第一次执行时可能会报这个错误,报错信息是说,这个任务请求的内存是1536,但是我们配置的内存最大只有1024
解决方案:
先关闭所有hadoop服务($stop-all.sh)
找到hadoop-2.7.7/etc/hadoop/yarn-site.xml
将yarn.nodemanager.resource.memory-mb属性由原来的1024改为2048
注意,需要将master机器和slave1机器都改掉。
改完后重启服务($start-all.sh)
问题2.
执行jar的时候任务卡死。
Running job: job_1559553475936_0001
卡在这个地方不动了。
解决方案:
查阅资料之后了解到是虚拟机内存太小。我的两台虚拟机内存为2G。
先将服务全部关闭。然后关闭虚拟机,将两台虚拟机内存调整为4G,然后重启。
结束:
参考书籍《Hadoop构建数据仓库实践》