目录:
一、Nginx的相关配置,以及测试数据
二、Hadoop中创建使用目录
三、Hive的日志表创建,并同步到Hbase中
1)创建自增长ID的类,并添加到Hive环境中
2)在Hive中创建日志表
3)将Nginx的日志数据导入到Hive日志表中
方法一:将本地目录中的文件导入到hive中
方法二:从HDFS导入数据
方法三:通过如Flume、Kafka一类的工具监控日志数据,自动导入
4)在Hive中创建Hbase可以识别的表
5)将Hive的日志表,使用自增长Id做为rowkey导入到Hbase可识别的表中
6)到Hbase中验证效果使用get、scan、filter获取指定数据
四、FAQ
五、扩展阅读
一、Nginx的相关配置,以及测试数据
#Nginx的Conf中log格式化部分的内容
?
1 2 3 4 5 |
|
#Nginx生成后部分格式如下(测试数据)
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
二、Hadoop中创建使用目录
#在Hadoop2.2.0中创建Hive外部表中要用到的目录
?
1 2 3 4 5 |
|
三、Hive的日志表创建,并同步到Hbase中
1)创建自增长ID的java类UDFRowSequence.java,并添加到Hive环境中
#在Eclipse中创建Maven项目,然后使用Maven将项目打包成Jar文件,过程中需要引入hadoop-common-2.2.0.jar、hive-exec-0.13.1.jar这两个文件,可以在Hadoop2.2.0目录以及Hive0.13.1目录中找到。如果不会使用Maven将项目打包,可以参考这篇文章《Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用》中实现Java客户端部分,有如何打包的方法。
UDFRowSequence.java代码如下,使用Maven会打包成一个idoall.org-0.0.1-SNAPSHOT-jar-with-dependencies.jar文件,上传到Hive的lib目录下。本文后面会提供代码下载:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
2)在Hive中创建日志表
#然后将我们自定义的idoall.org-0.0.1-SNAPSHOT-jar-with-dependencies.jar,添加到Hive运行环境中
?
1 2 3 4 |
|
#在Hive中创建自定义函数对数据进行处理,如果不想每次都执行这个命令,可以在hive-site.xml里面的<name>hive.aux.jars.path</name> 节点下面,把jar文件加到<value>节点中。
?
1 2 3 |
|
#在Hive中创建收集Nginx的日志表(nginx_accesslog)
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
3)将Nginx的日志数据导入到Hive日志表中
关于导入数据过程中overwrite的特性:
•目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。
•如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代
如果不使用overwrite,改用into,只会增加记录。
方法一:将本地目录中的文件导入到Hive中
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
方法二:从HDFS导入数据,我们先将表删除,重新创建一次,然后尝试从HDFS导入数据
#先用Hadoop命令,将文件上传到HDFS中
?
1 2 3 4 5 |
|
#执行Hive命令,从HDFS导入数据,然后使用SELECT语句,可以看到Nginx的日志数据已经成功导入到Hive表中
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
方法三:通过如Flume、Kafka一类的工具监控日志数据,自动导入
就不在这里细说,可以参考这两篇文章里面的实例,根据自己的业务需求修改代码:《Flume1.5.0的安装、部署、简单应用(含分布式、与hadoop2.2.0、hbase0.96的案例)》、《Flume+Kafka+Strom基于分布式环境的结合使用》
4)在Hive中创建Hbase可以识别的表
#在Hive中创建Hbase可以识别的表,相当于一张中间表了。同时将之前的测试数据导入到这张中间表,会自动同步到Hbase。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
#这时在Hbase中,可以看到h2b_nginx_accesslog表自动创建了;
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
5)将Hive的日志表,使用自增长Id做为rowkey导入到Hbase可识别的表中
#将Hive的日志表(nginx_accesslog)导入到表(h2b_nginx_accesslog)中,会自动同步到hbase。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
#导入到中间表时运行的结果,如果你也能够看到和下面类似的日志,恭喜你成功了。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
6)到Hbase中验证效果使用get、scan、filter获取指定数据
#我们再登录到Hbase中看数据是否已经导入
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
#使用Filter过滤requesturl列中包含p04.png的记录,使用之前要先导入子串
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
四、FAQ
1)如果导入的内容使用select查看时,发现是null,那可能是你的正则写的有问题,可以使用下面这个工具验证你的正则是否有问题。
#http://regex101.com,一个在线的正则表达式工具,很好用,如下图。
#在线测试通过后,将正则表达式,复制到一个文本文件中,进行两次转义字符的替换就可以使用了,第1次,将一个右斜杠去你的成两个右斜杠:‘\‘替换成‘\\‘;第二次将双引号替换成斜框双引号‘"‘替换成‘\"‘
2)如果提示“org.apache.hadoop.hive.contrib.serde2.RegexSerDe”相关的错误,请在hive中执行以下命令:
?
1 |
|
五、扩展阅读
Add Built-In Hive UDFs on HDInsight Azure
本文中提到的Java代码下载地址:http://pan.baidu.com/s/1c0hD4n2
----------------------------------------
博文作者:迦壹
博客地址:Nginx日志导入到Hive,同步Hbase,设置RowKey为autoincrement(ID自增长)
转载声明:可以转载, 但必须以超链接形式标 明文章原始出处和作者信息及版权声明,谢谢合作!
---------------------------------------