Elasticsearch+Hbase实现海量数据秒回查询

---------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处] 
文章出处: http://blog.csdn.net/sdksdk0/article/details/53966430
作者:朱培      ID:sdksdk0     

--------------------------------------------------------------------------------------------


首先祝大家2017新年快乐,我今天分享的是通过ElasticSearch与hbase进行整合的一个搜索案例,这个案例涉及的技术面比较广,首先你得有JAVAEE的基础,要会SSM,而且还要会大数据中的hdfs、zookeeper、hbase以及ElasticSearch和kibana。环境部署在4台centos7上。主机名为node1-node4。这里假设你已经安装好了zookeeper、hadoop、hbase和ElasticSearch还有kibana,我这里使用的是hadoop2.5.2,ElasticSearch用的你是2.2,kibana是4.4.1。我这里的环境是 hadoop是4台在node1-node4, zookeeper是3台再node1-node3,,ElasticSearch是3台在node1-node3,kibana是一台在node1上。该系统可以对亿万数据查询进行秒回,是一般的关系型数据库很难做到的。在IntelliJ IDEA 中进行代码编写。环境搭建我这里就不啰嗦,相信大家作为一名由经验的开发人员来说都是小事一桩。文末提供源码下载链接。



一、ElasticSearch和Hbase

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 Elasticsearch的性能是solr的50倍。


HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、
实时读写的分布式数据库
– 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理
HBase中的海量数据,利用Zookeeper作为其分布式协同服务
– 主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库)



二、需求分析&服务器环境设置

主要是做一个文章的搜索。有文章标题、作者、摘要、内容四个主要信息。效果图如下:这里样式我就没怎么设置了。。。。想要好看一点的可以自己加css。



服务器:

在3台centos7中部署,主机名为node1-node3.安装好ElasticSearch并配置好集群,

1.     解压

2.     修改config/elasticsearch.yml    (注意要顶格写,冒号后面要加一个空格)

a)      Cluster.name: tf   (同一集群要一样)

b)      Node.name: node-1  (同一集群要不一样)

c)       Network.Host: 192.168.44.137  这里不能写127.0.0.1

3.     解压安装kibana

4.     再congfig目录下的kibana.yml中修改elasticsearch.url

5.     安装插件

Step 1: Install Marvel into Elasticsearch:

bin/plugin install license
bin/plugin install marvel-agent

Step 2: Install Marvel into Kibana

bin/kibana plugin --install elasticsearch/marvel/latest

Step 3: Start Elasticsearch and Kibana

bin/elasticsearch
bin/kibana

 


启动好elasticsearch集群后,

然后启动zookeeper、hdfs、hbase。zkService.sh start  、start-all.sh、start-hbase.sh。

接下来就是剩下编码步骤了。




三、编码开发

1、首先在IntelliJ IDEA中新建一个maven工程,加入如下依赖。

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
        </dependency>


        <!-- spring 3.2 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>

        <!-- JSTL -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!-- slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.10</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.10</version>
        </dependency>

        <!-- elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!-- habse -->
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.1.3</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


    </dependencies>

2、Dao层

	private Integer id;
	private String title;
	
	private String describe;
	
	private String content;
	
	private String author;

实现其getter/setter方法。


3、数据准备

在桌面新建一个doc1.txt文档,用于把我们需要查询的数据写入到里面,这里我只准备了5条数据。中间用tab键隔开。




4、在hbase中建立表。表名师doc,列族是cf。


public static void main(String[] args) throws Exception {
      HbaseUtils hbase = new HbaseUtils();
      //创建一张表
	hbase.createTable("doc","cf");
}


/**
 * 创建一张表
 * @param tableName
 * @param column
 * @throws Exception
 */
public void createTable(String tableName, String column) throws Exception {
   if(admin.tableExists(TableName.valueOf(tableName))){
      System.out.println(tableName+"表已经存在!");
   }else{
      HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));
      tableDesc.addFamily(new HColumnDescriptor(column.getBytes()));
      admin.createTable(tableDesc);
      System.out.println(tableName+"表创建成功!");
   }
}


5、导入索引。这一步的时候确保你的hdfs和hbase以及elasticsearch是处于开启状态。

  @Test
    public void createIndex() throws Exception {
        List<Doc> arrayList = new ArrayList<Doc>();
        File file = new File("C:\\Users\\asus\\Desktop\\doc1.txt");
        List<String> list = FileUtils.readLines(file,"UTF8");
        for(String line : list){
            Doc Doc = new Doc();
            String[] split = line.split("\t");
            System.out.print(split[0]);
            int parseInt = Integer.parseInt(split[0].trim());
            Doc.setId(parseInt);
            Doc.setTitle(split[1]);
            Doc.setAuthor(split[2]);
            Doc.setDescribe(split[3]);
            Doc.setContent(split[3]);
            arrayList.add(Doc);
        }
        HbaseUtils hbaseUtils = new HbaseUtils();
        for (Doc Doc : arrayList) {
            try {
                //把数据插入hbase
                hbaseUtils.put(hbaseUtils.TABLE_NAME, Doc.getId()+"", hbaseUtils.COLUMNFAMILY_1, hbaseUtils.COLUMNFAMILY_1_TITLE, Doc.getTitle());
                hbaseUtils.put(hbaseUtils.TABLE_NAME, Doc.getId()+"", hbaseUtils.COLUMNFAMILY_1, hbaseUtils.COLUMNFAMILY_1_AUTHOR, Doc.getAuthor());
                hbaseUtils.put(hbaseUtils.TABLE_NAME, Doc.getId()+"", hbaseUtils.COLUMNFAMILY_1, hbaseUtils.COLUMNFAMILY_1_DESCRIBE, Doc.getDescribe());
                hbaseUtils.put(hbaseUtils.TABLE_NAME, Doc.getId()+"", hbaseUtils.COLUMNFAMILY_1, hbaseUtils.COLUMNFAMILY_1_CONTENT, Doc.getContent());
                //把数据插入es
                Esutil.addIndex("tfjt","doc", Doc);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

数据导入成功之后可以在服务器上通过命令查看一下:

curl -XGET http://node1:9200/tfjt/_search




7、搜索。

在这里新建了一个工具类Esutil.java,主要用于处理搜索的。注意,我们默认的elasticsearch是9200端口的,这里数据传输用的是9300,不要写成9200了,然后就是集群名字为tf,也就是前面配置的集群名。还有就是主机名node1-node3,这里不能写ip地址,如果是本地测试的话,你需要在你的window下面配置hosts文件。


public class Esutil {
	public static Client client = null;

		/**
		 * 获取客户端
		 * @return
		 */
		public static  Client getClient() {
			if(client!=null){
				return client;
			}
			Settings settings = Settings.settingsBuilder().put("cluster.name", "tf").build();
			try {
				client = TransportClient.builder().settings(settings).build()
						.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node1"), 9300))
						.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node2"), 9300))
						.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node3"), 9300));
			} catch (UnknownHostException e) {
				e.printStackTrace();
			}
			return client;
		}
	
	
	
	
	public static String addIndex(String index,String type,Doc Doc){
		HashMap<String, Object> hashMap = new HashMap<String, Object>();
		hashMap.put("id", Doc.getId());
		hashMap.put("title", Doc.getTitle());
		hashMap.put("describe", Doc.getDescribe());
		hashMap.put("author", Doc.getAuthor());
		
		IndexResponse response = getClient().prepareIndex(index, type).setSource(hashMap).execute().actionGet();
		return response.getId();
	}
	
	
	public static Map<String, Object> search(String key,String index,String type,int start,int row){
		SearchRequestBuilder builder = getClient().prepareSearch(index);
		builder.setTypes(type);
		builder.setFrom(start);
		builder.setSize(row);
		//设置高亮字段名称
		builder.addHighlightedField("title");
		builder.addHighlightedField("describe");
		//设置高亮前缀
		builder.setHighlighterPreTags("<font color='red' >");
		//设置高亮后缀
		builder.setHighlighterPostTags("</font>");
		builder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
		if(StringUtils.isNotBlank(key)){
//			builder.setQuery(QueryBuilders.termQuery("title",key));
			builder.setQuery(QueryBuilders.multiMatchQuery(key, "title","describe"));
		}
		builder.setExplain(true);
		SearchResponse searchResponse = builder.get();
		
		SearchHits hits = searchResponse.getHits();
		long total = hits.getTotalHits();
		Map<String, Object> map = new HashMap<String,Object>();
		SearchHit[] hits2 = hits.getHits();
		map.put("count", total);
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		for (SearchHit searchHit : hits2) {
			Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
			HighlightField highlightField = highlightFields.get("title");
			Map<String, Object> source = searchHit.getSource();
			if(highlightField!=null){
				Text[] fragments = highlightField.fragments();
				String name = "";
				for (Text text : fragments) {
					name+=text;
				}
				source.put("title", name);
			}
			HighlightField highlightField2 = highlightFields.get("describe");
			if(highlightField2!=null){
				Text[] fragments = highlightField2.fragments();
				String describe = "";
				for (Text text : fragments) {
					describe+=text;
				}
				source.put("describe", describe);
			}
			list.add(source);
		}
		map.put("dataList", list);
		return map;
	}

//	public static void main(String[] args) {
//		Map<String, Object> search = Esutil.search("hbase", "tfjt", "doc", 0, 10);
//		List<Map<String, Object>> list = (List<Map<String, Object>>) search.get("dataList");
//	}
}


8、使用spring控制层处理

在里面的spring配置这里就不说了,代码文末提供。

	@RequestMapping("/search.do")
	public String serachArticle(Model model,
			@RequestParam(value="keyWords",required = false) String keyWords,
			@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
			@RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize){
		try {
			keyWords = new String(keyWords.getBytes("ISO-8859-1"),"UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		Map<String,Object> map = new HashMap<String, Object>();
		int count = 0;
		try {
			map = Esutil.search(keyWords,"tfjt","doc",(pageNum-1)*pageSize, pageSize);
			count = Integer.parseInt(((Long) map.get("count")).toString());
		} catch (Exception e) {
			logger.error("查询索引错误!{}",e);
			e.printStackTrace();
		}
		PageUtil<Map<String, Object>> page = new PageUtil<Map<String, Object>>(String.valueOf(pageNum),String.valueOf(pageSize),count);
		List<Map<String, Object>> articleList = (List<Map<String, Object>>)map.get("dataList");
		page.setList(articleList);
		model.addAttribute("total",count);
		model.addAttribute("pageNum",pageNum);
		model.addAttribute("page",page);
		model.addAttribute("kw",keyWords);
		return "index.jsp";
	}


9、页面


<center>
<form action="search.do" method="get">
  <input type="text" name="keyWords" />
  <input type="submit" value="百度一下">
  <input type="hidden" value="1" name="pageNum">
</form>
<c:if test="${! empty page.list }">
<h3>百度为您找到相关结果约${total}个</h3>
<c:forEach items="${page.list}" var="bean">
  <a href="/es/detailDocById/${bean.id}.do">${bean.title}</a>
  <br/>
  <br/>
  <span>${bean.describe}</span>
  <br/>
  <br/>
</c:forEach>

<c:if test="${page.hasPrevious }">
  <a href="search.do?pageNum=${page.previousPageNum }&keyWords=${kw}"> 上一页</a>
</c:if>
<c:forEach begin="${page.everyPageStart }" end="${page.everyPageEnd }" var="n">
  <a href="search.do?pageNum=${n }&keyWords=${kw}"> ${n }</a>   
</c:forEach>

<c:if test="${page.hasNext }">
  <a href="search.do?pageNum=${page.nextPageNum }&keyWords=${kw}"> 下一页</a>
</c:if>
</c:if>
</center>


10、项目发布

在IntelliJ IDEA 中配置好常用的项目,这里发布名Application context名字为es,当然你也可以自定义设置。






最终效果如下:搜索COS会得到结果,速度非常快。




总结:这个案例的操作流程还是挺多的,要有细心和耐心,特别是服务器配置,各种版本要匹配好,不然会出各种头疼的问题,当然了,这个还是需要有一定基础,不然搞不定这个事情。。。。。


源码地址:https://github.com/sdksdk0/es





  • 18
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
[数据仓库]基于⼤数据的数仓和传统数仓的区别 ⽬录 基于⼤数据的数仓 基于⼤数据的数仓 随着新的应⽤场景(个性化推荐、⽤户画像、机器学习、数据分析、风控、精准运营)的出现,数据爆炸式增长,基于⼤数据的数仓应⽤⽽ ⽣,其特点是业务变化快,速度快、能处理海量数据,有实时需求;ER建模被弱化、DWS、DM采⽤维度建模;建模被弱化,更偏于混合 建模,数据质量⼀般,关注需求速度快、灵活。更强调数据资产的重要性,⼀般到达⼀定规模,倾向与做数据治理(数据质量、数据安全、 数据标准、数据⾎缘、主数据、元数据管理) 1. 实效性⾼ 2. 业务灵活、多变 3. 数据源多样性 4. 数据质量参差不齐 5. 应⽤场景复杂 技术栈:HDFS、Hive、Hbase、Flume、Kafka、Flink、Spark、Sqoop、ES、oozie等 传统数仓 传统数仓 传统数仓建有较稳定的业务场景和相对可靠的数据质量,同时也有相对稳定的需求,对数仓建设有较为完善的项⽬管控流程,数据建模有较 严格、稳定的建设标准;但是建设周期长,处理的数据结构单⼀,处理复杂数据成本⾼,只要⽀持数据分析和管理决策。 DWD⼀般采⽤ER建模、DWS、DM采⽤维度建模,数据质量⾼。 技术栈:TD、Oracle 传统数仓和基于⼤数据的数仓的相同点 传统数仓和基于⼤数据的数仓的相同点 1、分层架构 2、ER、维度建模理论同样适⽤ 3、数据服务体系⼀般都有BI、指标系统
近来数据中台概念大火,大家对它的定义也五花八门,不一而足。但无论怎么定义,一 个完善的数据技术架构必不可少。了解这些架构里每个局部的位置,功能和含义,不仅 能让我们更好了解数据产品的范围和边界,知道技术能帮我们实现什么,能怎么实现得 更好,另一方面,很多技术的设计理念对我们认知世界,了解复杂系统也会有所裨益。 因此这篇文章旨在梳理市面上常见的开源技术方案,背后原理及应用场景,帮助产品经 理对大数据技术体系有个大致全面的了解。 一般来说,我们将数据整个链条区分为四个环节,从数据采集传输,到数据储,再到 数据计算&查询,到后续的数据可视化及分析。框架图如下: 1. 数据采集传输 这个一般对应于公司的日志平台,任务是将数据采集后缓在某个地方,供后续的计算 流程进行消费使用。 针对不同的数据来源有各自的采集方式,从 APP/效劳器 日志,到业务表,还有各种 API 接口及数据文件等等。其中因为日志数据数据量多,数据结构多样,产生环境复杂等 特点,属于「重点照顾」的对象。目前市面针对日志采集的有 Flume,Logstash,Filebeat,Fluentd ,rsyslog 几种常见的框架,我们挑应用较广泛的前两者介绍下: 1.1 Flume 和 Logstash Flume 是一款由 Cloudera 开发的实时采集日志引擎,主打高并发,高速度,分布式海量日志采集。它是一种提供 高可用、高可靠、分布式海量日志采集、聚合和传输的系统。Flume 支持在日志系统中定制各类数据进行发送,用于采集数据;同时,它支持对数据进行简 单处理,并写到各种数据接收方。目前有两个版本,OG和NG,特点主要是: 1. 侧重数据传输,有内部机制确保不会丢数据,用于重要日志场景 2. 由java开发,没有丰富的插件,主要靠二次开发 3. 配置繁琐,对外暴露监控端口有数据 Logstash 是 Elastic.co 旗下的一个开源数据收集引擎,可动态的统一不同的数据源的数据至目的地,搭配 ElasticSearch 进行分析,Kibana 进行页面展示,是著名的 ELK 技术栈中的「L」局部。特点主要是: 1. 内部没有一个persist queue,异常情况可能会丧失局部数据 2. 由ruby编写,需要ruby环境,插件很多 3. 配置简单,偏重数据前期处理,分析方便 从两者的设计思想来看,Flume 最初并不是为了采集日志而设计,而是定位在把数据传入 HDFS 中,这和 Logstash 有根本的区别。所以它理所应当侧重于数据的传输和平安,且需要更多的二次开发和配 置工作。而 Logstash 明显侧重先对日志数据进行预处理,为后续的解析做铺垫。它搭配 ELK 技术栈使用起来比拟简单,更像是为你准备好的便当,开盒即食。 1.2 日志采集如何工作 我们以 Flume 为例子讲些日志采集 Agent 是怎么工作的。 Flume 由三个局部组成:Source,Channel 和 Sink,对应于采集,缓和保三个环节。 其中,Source 组件用来采集各种类型的数据源,如 directory、 、kafka 等。Channel 组件用来缓数据,有 memory channel,JDBC channel和 kafka channel 三种。最后再通过 Sink 组件进行保,分别支持 HDFS,HBase,Hive 和 Kafka 四种储方式。 下面结合一个大数据实时处理系统阐述下 Flume 在实际应用中所扮演的重要角色。该实时处理系统整体架构如下:通过将 Agent 部署在 Web 效劳器,一旦发生新增的日志数据,就会被 Flume 程序监听到,并且最终会传输到 Kafka 的 Topic 中,再进行后续的一系列操作。 1.3 数据传输 Kafka Kafka 最初是由领英开发,并随后于 2021 年初开源, 并于 2021 年 10 月 23 日由Apache Incubato 孵化出站。该工程的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其 持久化层本质上是一个"按照分布式事务日志架构的大规模发布/订阅消息队列〞,这使 它作为企业级根底设施来处理流式数据非常有价值。 2. 数据数据储方面,有单机/分布式、关系型/非关系型、列式储/行式储三个维度的划 分,各种维度交叉下都有对应产品来解决某个场景下的需求。 在数据量较小的情况下,一般采取单机数据库,如应用非常广泛,技术成熟的 MySQL。数据量大到一定程度后,就必须采取分布式系统了。目前业界最知名的就是 Apache 基金会名下的 Hadoop 系统,它根本可以作为大数据时代储计算的经典模型。 HDFS HDFS 作为 Hadoop 里的分布式文件系统,为 HBase
数据开发工程师的岗位职责全文共4页,当前为第1页。大数据开发工程师的岗位职责全文共4页,当前为第1页。大数据开发工程师的岗位职责 大数据开发工程师的岗位职责全文共4页,当前为第1页。 大数据开发工程师的岗位职责全文共4页,当前为第1页。 大数据开发工程师负责该领域的业务需求讨论,完成技术方案及数据开发。下面是店铺整理的大数据开发工程师的岗位职责。 大数据开发工程师的岗位职责1 职责: 1、负责所分管团队的团队建设和日常管理工作; 2、负责核心技术问题攻关和性能优化,持续维护和引进最新的大数据技术到城市大数据平台中,支撑城市级大数据平台业务; 3、承担城市数据标准编制和数据模型的设计; 4、承担项目中数据相关方案设计及数据团队管理; 5、参与城市大数据项目中数据采集、加工过程、分析挖掘模型算法的实施工作。 任职资格: 1、1年以上数据开发工作经验,熟练使用SQL查询引擎; 2、熟悉Hadoop、Mpp、Oracle等至少一种数据仓库工具 3、具备良好的编程语言基础如:java/python/scala/c++/shell等 4、二本以上学历,计算机相关专业或者有相关培训经历者优先 5、 个人素质要求:目光长远、态度诚恳、岗位有稳定性,能够长期培养、具备很强的自学能力、承压能力强、接受出差支援项目等工作。对数据工作具备浓厚的兴趣并有明确职业规划,优秀的学习能力和团队沟通协作能力,对新技术有浓厚兴趣并有钻研精神。 大数据开发工程师的岗位职责2 职责: 1、依据客户需求完成大数据项目的数据分析及建模; 2、进行大数据核心算法的编写; 3、参与项目的需求分析、系统设计、编码工作; 4、参与开发过程中相关新技术的研究和验证。 5.协助承担架构性的体系设计和改造工作,配合制定技术实施方大数据开发工程师的岗位职责全文共4页,当前为第2页。大数据开发工程师的岗位职责全文共4页,当前为第2页。案,按照总体设计组织子系统的设计和开发。 大数据开发工程师的岗位职责全文共4页,当前为第2页。 大数据开发工程师的岗位职责全文共4页,当前为第2页。 任职要求: 1、精通数据建模、数据体系建设,具备数据仓库架构设计、模型设计和处理性能调优等相关经验; 2、具有丰富的基于hadoop体系的数据平台、数据仓库建设经验,精通基于hadoop源码的开发、优化改造及成功应用案例; 3、精通hadoop生态体系各项技术,如kafka、flume、hive、impala、hbase、spark等,具有100+节点hadoop集群的开发、运维经验; 4、具有对大型hadoop集群的硬件规划能力; 大数据开发工程师的岗位职责3 职责 1、负责基于hadoop/spark生态系统、亿级别数据全文检索,搜索引擎的产品研发; 2、基于海量用户行为数据和其他数据,分析和研究数据与实际业务的关联关系,并与实际业务应用相结合开发; 3、负责大数据分析需求设计和开发,承担数据抽取、清洗、转化等数据处理程序开发。 任职要求: 1、熟悉Hadoop/HBase/Spark/Storm/Redis/Kafka/ES/Flume技术及其生态圈,具备相关项目开发经验,有数据实时计算项目经验优先; 2、有搜索引擎全文检索开发经验 ,如:elasticsearch、solr; 3、熟悉python、R任意一门开发语言; 4、有SAAS,PAAS企业级应用平台或者互联网,金融等大型应用平台开发经验优先考虑; 5、 本科及以上学历,计算机/软件工程/统计学/数学等相关专业,互联网/金融等行业3年以上工作经验; 6、拥有良好的代码习惯,要求结构清晰、命名规范、逻辑性强、代码冗余率低,代码注释清晰; 大数据开发工程师的岗位职责全文共4页,当前为第3页。大数据开发工程师的岗位职责全文共4页,当前为第3页。7、熟悉使用svn,禅道等项目管理工具,有良好的团队协作开发经验. 大数据开发工程师的岗位职责全文共4页,当前为第3页。 大数据开发工程师的岗位职责全文共4页,当前为第3页。 大数据开发工程师的岗位职责4 职责: 1、从事Hadoop、Spark、Hbase、hive等分布式大数据产品的设计和开发; 2、针对部门大数据业务进行大数据分析、挖掘等产品应用的开发; 3、大数据平台各类数据业务抽象及模型化; 4、参与大数据管理平台的开发及维护; 5、负责大数据平台数据及相关的应用开发,调优及维护; 6、为项目相关开发人员提供大数据技术指导及解决大数据平台应用中遇到的技术难题; 7、良好的团队合作与沟通能力。 任职要求: 1、本科及以上学历,2年以上大数据应用开发经验; 2、具备Java、Python、Scala其中两种语言的开发经验; 3、了解泛Hadoop大数据生态圈,熟悉HDFS/Hive/Flink/Hbas
数据开源框架集锦 1 ⼤数据平台 Hadoop 离线数据的分布式储和计算基础框架 分布式储HDFS 离线计算引擎MapReduce 资源调度Apache YARN CDH 基于稳定版Hadoop及相关项⽬最成型的发⾏版本, 成为企业部署最⼴泛的⼤数据系统 可视化的UI界⾯中⽅便地管理 配置和监控Hadoop以及其它所有相关组件 简单来说将⼗⼏个hadoop开源项⽬集成在⼀起 HDP 基于hadoop⽣态系统开源组件构建的⼤数据分析平台 2 集群管理与监控 Cloudera Manager ⽤于部署和管理CDH集群的软件 Ambari Hadoop平台的管理软件,具备Hadoop组件的安装、管理、运维 3 ⽂件系统 HDFS 分布式⽂件系统 4 资源调度 YARN hadoop的资源管理和作业调度系统 5 协调框架 Zookeeper 分布式协调服务,解决分布式数据⼀致性⽅案 实现诸如数据发布 订阅、负载均衡、命名、集群管理 master节点管理 分布式锁和分布式队列 6 数据Hbase 分布式⾯向列的NoSQL开源数据库 Cassandra 分布式的混合NoSQL数据库 ,还有C++版本ScyllaDB MongDB ⾯向⽂档的开源分布式数据库 Redis 开源的⽀持⽹络,基于内可持久化⽇志,key-value数据库,可⽤于 数据库 缓 消息中间件 Neo4j 开源⾼性能的NoSQL图形数据库 7 数据处理 MapReduce 分布式离线的计算框架 批处理 ⽇渐被spark和flink取代 Spark 通⽤的⼀站式计算框架 SparkCore批处理 SparkSQL交互式处理 SparkStreaming流处理 Spark Graphx图计算 Spark MLlib机器学习 Flink 流处理和批处理分布式数据处理框架 核⼼是⼀个流式的数据流执⾏引擎 类似于Spark 批处理 数据流处理 交互处理 图形处理和机器学习 Storm 分布式实时⼤数据处理系统 毫级别的实时数据处理能⼒ 实时分析的领导者 8 数据查询分析 Hive 基于hadoop的数据仓库,结构化 SparkSQL 处理结构化数据的spark组件 分布式的SQL查询引擎 Impala 实时交互SQL⼤数据查询引擎 Druid 实时⼤数据分析引擎 Elastic Search 分布式可扩展的实时搜索和分析引擎,基于Apache Lucene搜索引擎 9 数据收集 Flume 分布式海量⽇志采集、聚合和传输系统 Logstash 具有实时管道功能的开源数据收集引擎 10 数据交换 sqoop 数据迁移⼯具,⽤来在不同数据储软件之间进⾏数据传输的开源软件 DataX 阿⾥巴巴开源的离线数据同步⼯具,⽤于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定 ⾼效的数据同步 11 消息系统 Pulsar 企业级分布式消息系统,有替代Kafka的趋势 Kafka 发布/订阅的消息系统,由Scala写成 RocketMQ 阿⾥巴巴分布式、队列模型的消息中间件 12 任务调度 Azkaban 批量⼯作流任务调度器,将所有正在运⾏的⼯作流的状态保在其内 Oozie 基于Hadoop的企业级⼯作流调度框架 将所有正在运⾏的⼯作流的状态保SQL数据库 Cloudeara贡献给Apache的顶级项⽬ 13 数据治理 Ranger Hadoop 平台上并提供操作、监控、管理综合数据安全的框架 提供⼀个集中的管理机制,所有数据权限 Sentry Hadoop集群元数据数据储提供集中、细粒度的访问控制项⽬ 14 数据可视化 Kibana ⽤于和 Elasticsearch ⼀起使⽤的开源的分析与可视化平台 15 数据挖掘 Mahout 基于hadoop的机器学习和数据挖掘的⼀个分布式框架 Spark MLlib Spark的机器学习库 MADlib 基于SQL的数据库内置的可扩展的机器学习库 16 云平台技术 AWS S3 ⼀种对象储服务,提供⾏业领先的可扩展性、数据可⽤性、安全性和性能 储和保护各种⽤例数据 GCP Google提供的⼀套云计算服务 注册⼀个帐号,在分布在全球各地数⼗个google机房使⽤所有的基础架构服务
Hadoop是一个开源的分布式计算框架,可用于处理大数据集并提供高可靠性,高可用性和高性能。要进行详细的安装部署,需要运行以下步骤: 1. 安装Java:Hadoop基于Java编写,因此需要安装适当的Java版本。 2. 安装Hadoop:以二进制文件的形式下载Hadoop,并将其解压缩到目标位置。编辑Hadoop配置文件,并设置必要的参数,例如本地文件系统和Hadoop所依赖的其他组件。 3. 部署HDFS:使用bin/hdfs script启动HDFS守护进程并格式化NameNode。配置HDFS,并在数据节点上创建数据目录。 4. 部署YARN:使用bin/yarn script启动YARN守护进程,并在ResourceManager节点上运行MR程序的ApplicationMaster服务。重新配置YARN,并设置资源管理器和节点管理器。 5. 安装Spark:以二进制文件的形式下载Spark,并将其解压缩到目标位置。编辑Spark配置文件,并设置必要的参数,例如运行模式,内设置和调试选项。 6. 安装Hive:以二进制文件的形式下载Hive,并按照说明进行安装。配置Hive,并设置Metastore和HiveServer2。 7. 安装HBase:以二进制文件的形式下载HBase,并按照说明进行安装。配置HBase,并设置区域服务器和HBase主服务器。 8. 安装Oozie:以二进制文件的形式下载Oozie,并按照说明进行安装。编辑Oozie配置文件,并设置必要的参数,例如数据库连接,属性和内设置。 9. 安装Kafka:以二进制文件的形式下载Kafka,并按照说明进行安装。配置Kafka,并设置必要的参数,例如Zookeeper连接,日志储位置和日志大小限制。 10. 安装Flume:以二进制文件的形式下载Flume,并按照说明进行安装。配置Flume,并设置必要的参数,例如Flume代理,事件类型和目标。 11. 安装Flink:以二进制文件的形式下载Flink,并按照说明进行安装。配置Flink,并设置必要的参数,例如集群模式,任务管理器,计算管道和作业提交方式。 12. 安装ES:以二进制文件的形式下载Elasticsearch,并按照说明进行安装。配置Elasticsearch,并设置必要的参数,例如节点类型,索引设置和查询配置。 13. 安装Redash:以二进制文件的形式下载Redash,并按照说明进行安装。配置Redash并设置必要的参数,例如数据库连接,权限和查询模式。 以上提到的大数据技术是开源的,所以可以在官网上找到相关二进制文件和详细的安装部署指南。也可以使用一些自动化的部署工具,如Puppet和Ansible来简化整个过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱培

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值