Open rainit2006 opened 7 years ago
http://jp.hortonworks.com/hadoop-tutorial/how-to-process-data-with-apache-hive/ Hive or Pig? They seem to do much of the same thing. Hive is considered friendlier and more familiar to users who are used to using SQL for querying data. Pig fits in through its data flow strengths where it takes on the tasks of bringing data into Apache Hadoop and working with it to get it into the form for querying.
Hive and Pig Data Model Differences In the case of Pig all data objects exist and are operated on in the script. Once the script is complete all data objects are deleted unless you stored them.
In the case of Hive we are operating on the Apache Hadoop data store. Any query you make, table that you create, data that you copy persists from query to query. You can think of Hive as providing a data workbench where you can examine, modify and manipulate the data in Apache Hadoop. So when we perform our data processing task we will execute it one query or line at a time. Once a line successfully executes you can look at the data objects to verify if the last operation did what you expected. All your data is live. This kind of flexibility is Hive’s strength. You can solve problems bit by bit and change your mind on what to do next depending on what you find.
Avro AvroスキーマはJSON形式で作成します。 Avro = jason part + Binary part Avro include marks that allow for smart splitting for Map/Reduce.
Apache Avro™ is a data serialization system. Avro allows us to perform serialization and deserialization without code generation. ( code generation: コード生成コンパイラの処理過程のひとつで,原始プログラムから目的プログラムへの変換を指す)
Avro schemas are defined using JSON. Schemas are composed of primitive types (null, boolean, int, long, float, double, bytes, and string) and complex types (record, enum, array, map, union, and fixed).
Avro specifies two serialization encodings: binary and JSON. Most applications will use the binary encoding, as it is smaller and faster. But, for debugging and web-based applications, the JSON encoding may sometimes be appropriate.
Avro defines a standard sort order for data. This permits data written by one system to be efficiently sorted by another system. This can be an important optimization, as sort order comparisons are sometimes the most frequent per-object operation. Note also that Avro binary-encoded data can be efficiently ordered without deserializing it to objects.
Avro includes a simple object container file format. A file has a schema, and all objects stored in the file must be written according to that schema, using binary encoding. Objects are stored in blocks that may be compressed. Syncronization markers are used between blocks to permit efficient splitting of files for MapReduce processing. Files may include arbitrary user-specified metadata. A file consists of: •A file header, followed by •one or more file data blocks. each block's binary data can be efficiently extracted or skipped without deserializing the contents. The combination of block size, object counts, and sync markers enable detection of corrupt blocks and help ensure data integrity.
Note that a schema file can only contain a single schema definition.
Avroスキーマを記述するには、次のように、スキーマを指定するJSONレコードを作成します。
{"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": ["int", "null"]},
{"name": "favorite_color", "type": ["string", "null"]}
]
}
At minimum, a record definition must include its type ("type": "record"), a name ("name": "User"), and fields, in this case name, favorite_number, and favorite_color.
このレコードには次の4つのフィールドがあることに注意してください。 • type JSONフィールドの型を指定します。Avroスキーマでは、スキーマの最上位で指定する場合は必ずrecordとする必要があります。record型は、複数のフィールドが定義されることを示します。 • namespace オブジェクトが存在する名前空間を指定します。基本的には、ユーザーや組織にとって意味のあるURIにします。同じ名前を複数のスキーマ型で共有する可能性がある場合に、それぞれを区別するために使用します。 • name これはスキーマ名で、名前空間と組み合せた場合に、ストア内でスキーマを一意に識別します。前述の例で、スキーマの完全修飾名はcom.example.FullNameです。 • fields これが実際のスキーマ定義です。値に含まれるフィールドの種類と各フィールドのデータ型を定義します。フィールドには、整数や文字列などの単純なデータ型や複合データ型を指定できます。これについては、次に詳しく説明します。 スキーマのフィールド名は[A-Za-z]で始まり、続いて[A-Za-z0-9]のみを使用する必要があることに注意してください。
想要读取avro数据,需要先获得schema
Avro在Hadoop里的使用 在Hive中,我们可以将数据使用Avro格式存储,本文以avro-1.7.1.jar为例,进行说明。
如果需要在Hive中使用Avro,需要在$HIVE_HOME/lib目录下放入以下四个工具包:avro-1.7.1.jar、avro-tools-1.7.4.jar、 jackson-core-asl-1.8.8.jar、jackson-mapper-asl-1.8.8.jar。当然,你也可以把这几个包存在别的路径下面,但是你需要把这四个包放在CLASSPATH中。
为了解析Avro格式的数据,我们可以在Hive建表的时候用下面语句:
1.hive> CREATE EXTERNAL TABLE tweets
2. > COMMENT "A table backed by Avro data with the
3. > Avro schema embedded in the CREATE TABLE statement"
4. > ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
5. > STORED AS
6. > INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
7. > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
8. > LOCATION '/user/wyp/examples/input/'
9. > TBLPROPERTIES (
10. > 'avro.schema.literal'='{
11. > "type": "record",
12. > "name": "Tweet",
13. > "namespace": "com.miguno.avro",
14. > "fields": [
15. > { "name":"username", "type":"string"},
16. > { "name":"tweet", "type":"string"},
17. > { "name":"timestamp", "type":"long"}
18. > ]
19. > }'
20. > );
21.OK
22.Time taken: 0.076 seconds
23.
24.hive> describe tweets;
25.OK
26.username string from deserializer
27.tweet string from deserializer
28.timestamp bigint from deserializer
然后用Snappy压缩我们需要的数据,下面是压缩前我们的数据:
1.{
2. "username": "miguno",
3. "tweet": "Rock: Nerf paper, scissors is fine.",
4. "timestamp": 1366150681
5.},
6.{
7. "username": "BlizzardCS",
8. "tweet": "Works as intended. Terran is IMBA.",
9. "timestamp": 1366154481
10.},
11.{
12. "username": "DarkTemplar",
13. "tweet": "From the shadows I come!",
14. "timestamp": 1366154681
15.},
16.{
17. "username": "VoidRay",
18. "tweet": "Prismatic core online!",
19. "timestamp": 1366160000
20.}
压缩完的数据假如存放在/home/wyp/twitter.avsc文件中,我们将这个数据复制到HDFS中的/user/wyp/examples/input/目录下:
1.hadoop fs -put /home/wyp/twitter.avro /user/wyp/examples/input/
然后我们就可以在Hive中使用了:
1.hive> select * from tweets limit 5;;
2.OK
3.miguno Rock: Nerf paper, scissors is fine. 1366150681
4.BlizzardCS Works as intended. Terran is IMBA. 1366154481
5.DarkTemplar From the shadows I come! 1366154681
6.VoidRay Prismatic core online! 1366160000
7.Time taken: 0.495 seconds, Fetched: 4 row(s)
Avro 为什么比json,cvs好?
文章推荐: Amazon EMR の Avro フォーマットのデータを Amazon Redshift にロードする http://dev.classmethod.jp/cloud/aws/amazon-redshift-emr-avro/ Avroのスキーマファイル(users.avsc)はJSON 形式で定義します。 コードが入っているデータファイル(users.avro)を作成してみます。 生成された users.avro ファイルをバイナリエディタで開いてみます。ファイルの最初の方にデータの定義があり、その後にデータが連続して登録されています。jsonやxmlのように定義名が何度も繰り返すような冗長さもなく、ファイルの最初を読み込んだ段階でデータ構造が理解できる「マシン・リーダブル」なフォーマットなので、コンパクトかつ高速になる理由が理解できたと思います。
http://kakakazuma.hatenablog.com/entry/2016/10/17/090000 •ORCとParquetは共にカラムナー型でデータを保存でき、クエリの最適化に優れている。 また、圧縮効率も共に高い。 ◦ORCはrow Indexやbloom filterが使えるので基本的にはORCの方が良い。ただしネストが深いデータ構造の場合はParquetの方が良い。 ◦ImpalaはORCをサポートしていない •Apache Avroはカラム追加・削除・複数カラムのリネームまでサポートしておりカラム構造の変更に強い。 •SequenceFileはMapReduceのジョブに最適化されている。 •TextFileは書き込みが早く、人の目で確認できるので管理しやすい。
The problem of managing schemas Schemas inevitably will change — Apache Avro offers an elegant solution. https://www.oreilly.com/ideas/the-problem-of-managing-schemas
How to Choose a Data Format https://www.svds.com/how-to-choose-a-data-format/
File Format Benchmark - Avro, JSON, ORC & Parquet https://www.slideshare.net/HadoopSummit/file-format-benchmark-avro-json-orc-parquet
big data serialization using apache avro with hadoop https://www.ibm.com/developerworks/library/bd-avrohadoop/
Chukwa Chukwaは大規模分散システムでのログ収集管理を目的としたシステムです。
AVRO Avroはデータシリアライズシステムです。サービスを動かすようなものではなく、データのやりとりのために構造化データを直列化するプロトコルと仕組みで、シリアライズ対象となるデータの構造定義や、RPC定義はJSONで行います。
Cassandra Cassandraはマスタ/スレーブという役割はなく、Quorum Systemを使って分散機構を実現します。全Nodeが同一の機能を有しているので、単一障害点はありません。
HBase
Zookeeper