草庐IT

json - 将数据加载到 hadoop 的推荐格式,用于简单的 map reduce

coder 2024-01-08 原文

目前,我正在将大量数据从 s3 加载到我们的 redshift 集群中(每秒 10k 行左右?)。

这成为尝试对数据运行任何查询的问题,因为即使在尝试汇总几个小时的数据时,我们也会遇到内存不足错误。

我想做的是对数据运行 map reduce 作业,然后只加载聚合。我知道这应该是一项相当容易的任务,但我是 hadoop 的新手,而且我有点卡在第一步中。

  1. 设置 EMR 集群(完成)
  2. 将数据加载到 HDFS(我认为这是我应该做的)

目前所有数据都被加载到 S3 gzipped JSON 文件中(使其易于加载到 redshift 中)。我必须更改文件格式才能将其放入 hadoop 中吗?每个 S3 文件都采用类似于此形式的内容:

{  
    "timestamp":"2015-06-10T11:54:34.345Z", 
    "key":"someguid", 
    "device": { "family" : "iOS", "versions" : "v8.4" } 
}
{
    "timestamp":"2015-06-11T15:56:44.385Z", 
    "key":"some second key", 
    "device": { "family" : "Android", "versions" : "v2.2" }
} 

其中每个 JSON 对象是 1 条记录/行。 (注意 JSON 对象是一个接一个的,在真实文件中没有空格,也没有逗号分隔 json 对象或类似的东西)。

将这些文件的格式更改为可以正常工作的格式对我来说不是什么大不了的事,但我不确定该格式是什么(纯 CSV 文件?我还能对它们进行 gzip 压缩吗?)。

所以问题是:

  1. 是否可以按原样使用这些文件?如果是这样的话,我会不会因为改变它们而感到头疼
  2. 在我获得正确的文件并可以导入它们之后,要实现按小时简单地汇总这些数据并将文件保存回 S3 以便我可以将其加载到 redshift 中的目标,最简单的方法是什么?理想情况下,我希望这项工作每小时运行一次,因此我的红移表每小时都​​会根据前几小时的数据更新一次。我应该阅读哪些技术来实现这一目标? hive ?黑斑羚? pig ?同样,只是寻找简单的解决方案。

最佳答案

从示例数据可以清楚地看出您的数据是 JSON 格式。您可以使用 Map/Reduce、Pig、Hive 中的任何一种来读取和检索记录。

Pig 和 Hive 比 Map/Reduce 更简单,因为您不需要编写太多代码。

如果您打算从 Hive 读取数据,那么您可以使用 Hive JSON sarde。 有关实现的更多详细信息,请访问 How do you make a HIVE table out of JSON data?

如果您打算使用 pig,那么您可以在 pig 加载语句期间使用 JsonLoader。您可以在此链接 http://joshualande.com/read-write-json-apache-pig/ 上获得有关 JsonLoader 的更多详细信息。

您还可以在 pig 和 hive 中编写您的 costume UDF 来读取 JSON 数据。

关于json - 将数据加载到 hadoop 的推荐格式,用于简单的 map reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495092/

有关json - 将数据加载到 hadoop 的推荐格式,用于简单的 map reduce的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  6. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  9. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  10. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

随机推荐