博客地址:http://www.moonxy.com

一、前言

ES-Hadoop 是连接快速查询和大数据分析的桥梁,它能够无间隙的在 Hadoop 和 ElasticSearch 上移动数据。ES Hadoop索引 Hadoop 数据到 Elasticsearch,充分利用其查询速度,大量聚合能力来使它比以往更快,同时可以使用 HDFS 作为 Elasticsearch 长期存档。ES-Hadoop可以本地集成 Hadoop 生态系统上的很多流行组件,比如 Spark、Storm、Hive、Pig、Storm、MapReduce等。

ES-Hadoop 与大数据的关系图

首先需要在机器上配置 SSH 免密登录,此处不再讲解。

二、安装 Hadoop

2.1 Hadoop 的三种模式

Hadoop 主要分为三种安装模式,分别为:单机模式、伪分布式模式和完全分布式模式。下面以伪分布式模式为例。

1)单机(非分布式)模式

这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。

2)伪分布式运行模式

这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点: (NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode)

请注意分布式运行中的这几个结点的区别:

从分布式存储的角度来说,集群中的结点由一个NameNode和若干个DataNode组成,另有一个SecondaryNameNode作为NameNode的备份。

从分布式应用的角度来说,集群中的结点由一个JobTracker和若干个TaskTracker组成,JobTracker负责任务的调度,TaskTracker负责并行执行任务。TaskTracker必须运行在DataNode上,这样便于数据的本地计算。JobTracker和NameNode则无须在同一台机器上。一个机器上,既当 namenode,又当 datanode,或者说既是 jobtracker,又是tasktracker。没有所谓的在多台机器上进行真正的分布式计算,故称为 "伪分布式"。

3)完全分布式模式

真正的分布式,由3个及以上的实体机或者虚拟机组件的机群。

2.2 下载 Hadoop

Apache Hadoop 官方下载地址为:http://apache.org/dist/hadoop/common/,或者访问所有历史版本地址:http://archive.apache.org/dist/hadoop/common/

此处选择 2.9.1 版本,下载并解压,如下:

[root@masternode software]# tar zxvf /usr/software/hadoop-2.9..tar.gz -C /opt/hadoop
[root@masternode software]# chown -R esuser:esuser /opt/hadoop

2.3 配置 Hadoop

hadoop 包括的配置文件主要有:hadoop-env.sh、core-site.xml、yarn-site.xml、mapred-site.xml、hdfs-site.xml 等均位于 /opt/hadoop/hadoop-2.9.1/etc/hadoop 目录下。

修改 hadoop-env.sh,添加 JAVA_HOME,如下:

[esuser@masternode hadoop]$ vim /opt/hadoop/hadoop-2.9./etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/jdk/jdk1..0_16

在集群环境下,即使各结点在 /etc/profile 中都正确地配置了JAVA_HOME,也会报如下错误:

localhost: Error: JAVA_HOME is not set and could not be found.

在hadoop-env.sh中,再显示地重新声明一遍JAVA_HOME

修改 /etc/profile 系统环境变量,添加 Hadoop 变量,如下:

[root@masternode hadoop-2.9.]# vim /etc/profile

添加 Hadoop_HOME,如下:

#Hadoop variables
export HADOOP_HOME=/opt/hadoop/hadoop-2.9.
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

是配置文件生效(只对当前 Bash 生效),如下:

[root@masternode hadoop-2.9.]# source /etc/profile

修改 core-site.xml,添加如下配置:

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/hadoop-2.9.1/hdfs/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

属性名 fs.default.name 已经废弃,使用新的 fs.defaultFS 来代替。fs.defaultFS 保存了 NameNode 的位置,HDFS 和 MapReduce 组件都需要使用到。

修改 mapred-site.xml,如下:

先从模板复制一份配置文件

[esuser@masternode hadoop]$ cp /opt/hadoop/hadoop-2.9./etc/hadoop/mapred-site.xml.template /opt/hadoop/hadoop-2.9./etc/hadoop/mapred-site.xml

再添加如下配置

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9010</value>
</property>
</configuration>

变量 mapred.job.tracker 保存了 JobTracker 的位置,MapReduce 组件需要知道这个位置。

修改 hdfs-site.xml,添加如下配置,如下:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

变量 dfs.replication 制定了每个 HDFS 数据文件的副本次数,默认为 3,此处修改为 1。

#并在hdfs-site.xml添加:
#name:
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
#专门针对name的路径设置,不放在默认的路径下,可以指定我们的默认物理磁盘
<description>确定本地文件系统上DFS名称节点的位置应该存储名称表(fsimage)。 如果这是一个以逗号分隔的列表的目录,然后名称表被复制到所有的目录中,以实现冗余。</description>
</property>
#data:
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
<description>确定本地文件系统上DFS数据节点的位置应该存储它的块。如果这是逗号分隔的目录列表,然后数据将被存储在所有命名目录,通常在不同的设备上。目录应该被标记与HDFS对应的存储类型([SSD] / [磁盘] / [存档] / [RAM_DISK])存储政策。 如果目录不存在,则默认存储类型为DISK没有明确标记的存储类型。 不存在的目录将如果本地文件系统权限允许,则创建它。</description>
</property>

启动 Hadoop 之前,首先格式化 namenode,如下:

[esuser@masternode ~]$ hadoop namenode -format

显示如下:

2.4 启动 Hadoop

执行 start-all.sh 脚本和先执行 star-dfs.sh 再执行 start-yarn.sh 是一样的。

格式化完成之后,启动 Hadoop,命令如下:

[esuser@masternode hadoop]$ start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [localhost]
localhost: starting namenode, logging to /opt/hadoop/hadoop-2.9./logs/hadoop-esuser-namenode-masternode.out
localhost: starting datanode, logging to /opt/hadoop/hadoop-2.9./logs/hadoop-esuser-datanode-masternode.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /opt/hadoop/hadoop-2.9./logs/hadoop-esuser-secondarynamenode-masternode.out
starting yarn daemons
resourcemanager running as process . Stop it first.
localhost: starting nodemanager, logging to /opt/hadoop/hadoop-2.9./logs/yarn-esuser-nodemanager-masternode.out

使用 jps 命令查看 JVM 进程,如下:

[esuser@masternode hadoop]$ jps
SecondaryNameNode
DataNode
ResourceManager
NameNode
NodeManager
Jps

正常情况下会看到 NameNode、Nodemanager、ResourceManager、DataNode 和 SecondaryNameNode,就说明已经启动成功了。

三、安装 ES-Hadoop

ES-Hadoop 所有版本下载地址:https://www.elastic.co/downloads/past-releases,找到 ES-Hadoop 5.6.0 版本下载,需要与 Elasticsearch 5.6.0 的版本相互对应一致,下载并解压到 /opt 目录下。

ES-Hadoop是一个 jar 包,工作在 hadoop 这边,ES 这边不需要安装。

在 /etc/profile 中添加环境变量:

#ESHADOOP_HOME variables
export ESHADOOP_HOME=/opt/elasticsearch-hadoop-5.6.0
export CLASSPATH=$CLASSPATH:$ESHADOOP_HOME/dist

四、从 HDFS 到 Elasticsearch

首先将 blog.json 上传到 HDFS,使用如下命令:

hadoop fs -put blog.json /work
#或者
hdfs dfs -put blog.json /work

blog.json 的内容为:

{"id":"1","title":"git简介","posttime":"2016-06-11","content":"svn与git的最主要区别..."}
{"id":"2","title":"ava中泛型的介绍与简单使用","posttime":"2016-06-12","content":"基本操作:CRUD ..."}
{"id":"3","title":"SQL基本操作","posttime":"2016-06-13","content":"svn与git的最主要区别..."}
{"id":"4","title":"Hibernate框架基础","posttime":"2016-06-14","content":"Hibernate框架基础..."}
{"id":"5","title":"Shell基本知识","posttime":"2016-06-15","content":"Shell是什么..."}

编写程序:

package com.es.hd;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.elasticsearch.hadoop.mr.EsOutputFormat;
import java.io.IOException; public class HdfsToES { public static class MyMapper extends Mapper<Object, Text, NullWritable, BytesWritable> {
public void map(Object key, Text value, Mapper<Object, Text, NullWritable, BytesWritable>.Context context)
throws IOException, InterruptedException {
byte[] line = value.toString().trim().getBytes();
BytesWritable blog = new BytesWritable(line);
context.write(NullWritable.get(), blog);
}
} public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
conf.setBoolean("mapred.map.tasks.speculative.execution", false);
conf.setBoolean("mapred.reduce.tasks.speculative.execution", false);
conf.set("es.nodes", "192.168.56.110:9200");
conf.set("es.resource", "blog/cnblogs");
conf.set("es.mapping.id", "id");
conf.set("es.input.json", "yes"); Job job = Job.getInstance(conf, "hadoop es write test");
job.setMapperClass(HdfsToES.MyMapper.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(EsOutputFormat.class);
job.setMapOutputKeyClass(NullWritable.class);
job.setMapOutputValueClass(BytesWritable.class); FileInputFormat.setInputPaths(job, new Path("hdfs://localhost:9000//work/blog.json"));
job.waitForCompletion(true);
}
}

五、从 Elasticsearch 到 HDFS

5.1 读取索引到 HDFS

读取 Elasticsearch 一个类型中的全部数据到 HDFS,这里读取索引为 blog 类型为 cnblogs 的所有文档,如下:

package com.es.hd;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.elasticsearch.hadoop.mr.EsInputFormat;
import java.io.IOException; public class EsToHDFS {
public static class MyMapper extends Mapper<Writable, Writable, NullWritable, Text> {
@Override
protected void map(Writable key, Writable value, Context context) throws IOException, InterruptedException {
Text text = new Text();
text.set(value.toString());
context.write(NullWritable.get(), text);
}
} public static void main(String[] args) throws Exception {
Configuration configuration = new Configuration();
configuration.set("es.nodes", "192.168.56.110:9200");
configuration.set("es.resource", "blog/cnblogs");
configuration.set("es.output.json", "true");
Job job = Job.getInstance(configuration, "hadoop es write test");
job.setMapperClass(MyMapper.class);
job.setNumReduceTasks(1);
job.setMapOutputKeyClass(NullWritable.class);
job.setMapOutputValueClass(Text.class);
job.setInputFormatClass(EsInputFormat.class);
FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/work/blog_cnblogs"));
job.waitForCompletion(true);
}
}

5.2 查询 Elasticsearch 写入 HDFS

可以穿入查询条件对 Elastticsearch 中的文档进行搜索,再把文档查询结果写入 HDFS。这里查询 title 中含有关键词 git 的文档,如下:

package com.es.hd;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.elasticsearch.hadoop.mr.EsInputFormat;
import java.io.IOException; public class EsQueryToHDFS {
public static class MyMapper extends Mapper<Writable, Writable, Text, Text> {
@Override
protected void map(Writable key, Writable value, Context context) throws IOException, InterruptedException {
context.write(new Text(key.toString()), new Text(value.toString()));
}
} public static void main(String[] args) throws Exception {
Configuration configuration = new Configuration();
configuration.set("es.nodes", "192.168.56.110:9200");
configuration.set("es.resource", "blog/cnblogs");
configuration.set("es.output.json", "true");
configuration.set("es.query", "?q=title:git");
Job job = Job.getInstance(configuration, "query es to HDFS");
job.setMapperClass(MyMapper.class);
job.setNumReduceTasks(1);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setInputFormatClass(EsInputFormat.class);
FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/work/es_query_to_HDFS"));
job.waitForCompletion(true);
}
}

Elastic Stack 笔记(十)Elasticsearch5.6 For Hadoop的更多相关文章

  1. Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理

    博客地址:http://www.moonxy.com 一.前言 在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 ...

  2. Elastic Stack 笔记(一)CentOS7.5 搭建 Elasticsearch5.6 集群

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 是一个基于 Lucene 的分布式搜索引擎服务,采用 Java 语言编写,使用 Lucene 构建索引.提供 ...

  3. Elastic Stack 笔记(八)Elasticsearch5.6 Java API

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 底层依赖于 Lucene 库,而 Lucene 库完全是 Java 编写的,前面的文章都是发送的 RESTf ...

  4. Elastic Stack 笔记(三)Kibana5.6 安装

    博客地址:http://www.moonxy.com 一.前言 Kibana 是 Elastic Stack 公司推出的一个针对 Elasticsearch 的开源分析及可视化平台,可以搜索.查看存放 ...

  5. Elastic Stack 笔记(二)Elasticsearch5.6 安装 IK 分词器和 Head 插件

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 作为开源搜索引擎服务器,其核心功能在于索引和搜索数据.索引是把文档写入 Elasticsearch 的过程, ...

  6. Elastic Stack 笔记(七)Elasticsearch5.6 聚合分析

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 是一个分布式的全文搜索引擎,索引和搜索是 Elasticsarch 的基本功能.同时,Elasticsear ...

  7. Elastic Stack 笔记(九)Elasticsearch5.6 集群管理

    博客地址:http://www.moonxy.com 一.前言 集群搭建好以后,在日常中就要对集群的使用情况进行监控,对于一个多节点集群,由于网络连接问题,出现宕机.脑裂等异常情况都是有可能发生的.E ...

  8. Elastic Stack 笔记(六)Elasticsearch5.6 搜索详解

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 主要包含索引过程和搜索过程. 索引过程:一条文档被索引到 Elasticsearch 之后,默认情况下 ES ...

  9. Elastic Stack 笔记(五)Elasticsearch5.6 Mappings 映射

    博客地址:http://www.moonxy.com 一.前言 关系型数据库对我们来说都很熟悉,Elasticsearch 也可以看成是一种数据库,所以我们经常将关系型数据库中的概念和 Elastic ...

随机推荐

  1. 强化学习(Reinforcement Learning)中的Q-Learning、DQN,面试看这篇就够了!

    1. 什么是强化学习 其他许多机器学习算法中学习器都是学得怎样做,而强化学习(Reinforcement Learning, RL)是在尝试的过程中学习到在特定的情境下选择哪种行动可以得到最大的回报. ...

  2. Console也要美颜了,来给Console添色彩

    我们在开发过程中,经常需要将不同的信息用颜色标记出来,这可以让我们快速关注到重点信息.想必大家都知道,可以通过Console. ForegroundColor设置输出文字的颜色,背景颜色可以通过Con ...

  3. 多线程之NSOperation

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD

  4. MySql基础架构以及SQL语句执行流程

    01. mysql基础架构 SQL语句是如何执行的 学习一下mysql的基础架构,从一条sql语句是如何执行的来学习. 一般我们写一条查询语句类似下面这样: select user,password ...

  5. python 31 升级版解决粘包现象

    目录 1. recv 工作原理 2.升级版解决粘包问题 3. 基于UDP协议的socket通信 1. recv 工作原理 1.能够接收来自socket缓冲区的字节数据: 2.当缓冲区没有数据可以读取时 ...

  6. CENTOS服务器基础教程-U盘系统盘制作

    什么都要用到一点点,会一点点,现在的USB3.0基本上服务器都已经支持.小编给大家介绍基础篇:如何使用U盘制作系统安装盘   工具/原料   U盘 UltraISO工具 方法/步骤     准备一个U ...

  7. Http协议4个新的http状态码:428、429、431、511;

    1.428 Precondition Required (要求先决条件) 先决条件是客户端发送 HTTP 请求时,必须要满足的一些预设条件.一个好的例子就是 If-None-Match 头,经常用在 ...

  8. 前端开发-CSS语法标准

    一.命名规则说明: 1.命名规则说明: 所有的命名最好都小写 属性的值一定要用双引号("")括起来,且一定要有值如class="nav",id="na ...

  9. rocketmq 部署启动指南-Docker 版

    最近学习使用 rocketmq,需要搭建 rocketmq 服务端,本文主要记录 rocketmq 搭建过程以及这个过程踩到的一些坑. 准备工作 在搭建之前,我们需要做一些准备工作,这里我们需要使用 ...

  10. Java连载26-方法(语法结构)

    一.方法 1.返回值类型如果不是void,表示这个方法执行结束之后必须返回一个具体的数值,当方法执行结束的时候没有返回任何数值,编译器会报错,怎么返回值呢?并且要求“值”的数据类型必须和“方法的返回值 ...