web-dev-qa-db-ja.com

ちょうどいいJava

私はC++開発者として約10年間働いています。 Java Hadoop専用です。Javaで他のことをするつもりはないので、ピックアップする必要があるもののリストをお願いします。もちろん、コア言語を学ぶ必要がありますが、他に何がありますか?

私はこれをグーグルでやったが、これは「Javaを学びたい。方法を教えてくれ」の複製の可能性があると考えられるかもしれない。しかし、そうではありません。 Javaはたくさんのライブラリを備えた巨大なプログラミング言語であり、私が学ぶ必要があるのは、Hadoopを何のために使用しているかに大きく依存します。しかし、わざわざこれを学ぶ必要があります。これもかなり役に立ちます。

33
Nikhil

私の日常の仕事では、C++担当者がJNI(Java Native Interface)を介してJavaライブラリを使用するのに十分なJavaを選択し、メモリを主にC++アプリケーションです。ここに私が気づいた重要な事柄のいくつかがあります:

  1. IDEがなければ、おもちゃのプロジェクト以外のことを管理することはできません。最初に行うべきことは、人気のあるJava IDEをダウンロードすることです(Eclipseは良い選択ですが、NetbeansやIntelliJなどの代替手段もあります)。 vi/emacsおよびjavac/makeで管理しようとする誘惑に負けないでください。 あなたは洞窟に住んでいて、それに気づかないでしょう。基本的なIDE関数でさえ速度に慣れると、IDEを使用しない場合よりも、文字通り数十倍も魅惑的になります。
  2. 単純なプロジェクト構造とパッケージをレイアウトする方法を学びます。 Eclipseサイトまたは他の場所でこれを行う方法の簡単なウォークスルーがあります。デフォルトのパッケージには何も入れないでください。
  3. Javaには型システムがあり、これにより、参照型とプリミティブ型は、歴史的/パフォーマンス上の理由から比較的分離されています。
  4. JavaのジェネリックはnotはC++テンプレートと同じです。 「型消去」について読んでください。
  5. JavaのGCがどのように機能するかを理解したいと思うかもしれません。 「マークアンドスイープ」をググるだけ-最初は、単純なメンタルモデルに落ち着いて、最新のプロダクションGCが後でそれをどのように実行するかについて詳しく知ることができます。
  6. コレクションAPIのコアは、遅滞なく学習する必要があります。 Map/HashMap、List/ArrayList&LinkedListおよびSetで十分です。
  7. 現代のJava同時実行を学びます。スレッドは、Java.util.concurrentのクールなものと比較して、アセンブリ言語レベルのプリミティブです。エグゼキューターからConcurrentHashMap、Atomic *、Lock、Condition、CountDownLatch、BlockingQueue、およびスレッドプールについて学習します。ここで良い本はブライアン・ゲッツとダグ・リーの本です。
  8. サードパーティのライブラリを使用するようになったらすぐに、クラスパスのしくみを学ぶ必要があります。ロケット科学ではありませんが、少し冗長です。

あなたが低レベルのC++の人なら、これも興味深いものがあるかもしれません:

  1. Javaにはデフォルトで仮想ディスパッチがあります。 Javaメソッドのstaticキーワードは、クラスメソッドを示すために使用されます。プライベートJavaメソッドは、invokespecialディスパッチを使用します。これは、使用中の正確な型へのディスパッチです。
  2. Oracle VMでは、少なくともオブジェクトは2つのヘッダーのマシンワード(マークワードとクラスワード)で構成されます。マークWordは、VMが使用するフラグの集まりであり、特にスレッドの同期に使用されます。クラスWordは、VMによるClassオブジェクトの表現(メソッドのvtableが存在する場所)へのポインターと考えることができます。クラスWordに続いて、オブジェクトのインスタンスのメンバーフィールドがあります。
  3. Java .classファイルは中間言語であり、実際にはx86オブジェクトコードに似ていません。特に、.classファイルには、JVMに同梱されているjavap逆アセンブラを含む、さらに便利なツールが多数あります。
  4. シンボルテーブルに相当するJavaは、定数プールと呼ばれます。それは型付けされており、それには多くの情報が含まれています-おそらく同等のx86オブジェクトコードよりも多くの情報です。
  5. Java仮想メソッドディスパッチは、定数プールで呼び出される正しいメソッドを検索し、それをオフセットに変換してvtableに変換します。次に、vtableオフセットでnullでない値が見つかるまでクラス階層を上に向かって進みます。
  6. Javaは最初に解釈され、コンパイルされます(とにかく、Oracleと他の一部のVMの場合)。コンパイルモードへの切り替えは、必要に応じてメソッドごとに行われます。ベンチマークとパフォーマンスのチューニングを行うときは、開始する前にシステムをウォームアップしていることを確認する必要があり、通常は最初にメソッドレベルでプロファイリングする必要があります。行われる最適化は非常に積極的/楽観的(想定に違反した場合のチェックとフォールバックを伴う)になる可能性があるため、パフォーマンスのチューニングはちょっとした芸術です。

うまくいけば、いくつかの便利なものがそこにあります-コメントしてください/フォローアップの質問をしてください。

49
kittylyst

「ちょうどいい」を学ぶJavaはJavaを学ぶことです。すべての主要な原則と言語設計の決定を学ぶか、簡単に回避できる間違いを犯すことに苦しむかのどちらかです。プログラミング方法をすでに知っていることを考えると、多くの情報はスキミングできます(親しみのある他の言語との違いを考慮して)。

だからあなたは学ぶ必要があります:

  1. 始める方法
  2. 言語自体
  3. コア、 必須クラス
  4. 主要なコレクション

ビルドフレームワークがない場合は、コンパイル済みコードを パッケージ化する方法 をご覧ください。

それ以外に、習得する必要があるほぼすべての他の項目は、何をするつもりかによって大きく異なります。 Oracle/Sunのオンラインチュートリアルを割引 しないでください 。(他のオンラインチュートリアルと比較して)非常に優れています。

17
Edwin Buck

HadoopはC++を使用できます: C++でのWordCountの例

12
warren

Java=は、標準APIでこれらのパッケージを知らないと、実際には使用できません。

Java.lang
Java.util
Java.io

そして、より少ない程度に:

Java.text
Java.math
Java.net
Java.lang.reflect
Java.util.concurrent

これらのクラスには、ほとんどすべてのアプリケーションで常に使用する必要がある多くのクラスが含まれています。これらのクラスを調べて、それらがどのクラスに適しているかがわかってから、最終的に車輪を再発明しないようにすることをお勧めします。

7
  • 簡単に学んでください。Javaは、C++をすでに知っている場合は楽しくて速いかもしれません。

    次の2冊を購入してください。

    1. JavaTMプログラミング言語(第4版)ケンアーノルド、ジェームズゴズリング、デイビスホームズ
    2. 有効Java(第2版)、Joshua Bosh

あなたはすぐにJavaを習得し、後悔しません。幸運を。

7
Hernán Eche

C++とJavaは共通のルーツを共有しているので、コア言語はあまり問題を引き起こさないはずです。特にJava SDKに慣れる必要があります。 Java.langとコレクションフレームワーク(Java.util。)

しかし、おそらくJavaを他の場所で使用していることに気づかない場合、Java $ ===はやりすぎです。HadoopにはPythonへのバインディングもあります-おそらくpythonの方が良い代替案ですか? Java vs Python)を参照 を参照してください。

4
mdma

他の高レベルのプログラミング言語にどの程度精通しているのかはわかりません。 ガベージコレクションは、Javaの重要な機能です。選択したVMでGCについて少し読むことが重要です。

明白なパッケージに加えて、 コレクションフレームワークJava.util パッケージを確認してください。いくつかのクラスのソースをチェックしたいかもしれません。これらの操作のコンピューティング/メモリコストを把握するには、HashMapをお勧めします。

Javaは、大量のデータを処理するときに、バッファの代わりにstreamsを使用することを好みます。慣れるまでに時間がかかる場合があります。

Javaには符号なしの型はありません。一度に処理する必要のあるデータのパケットに応じて、より大きな変数と貨物運論を使用するか(比較的小さなパケットの場合)、または(b[i] & 0xff)たとえば、符号なしバイトを読み取るたびに。また、Javaは、マルチバイトの数値をシリアル化するときにネットワークバイトオーダー(msbf)を使用します。

APIで最も愛されているデザインパターンは、シングルトン、デコレーター、ファクトリーです。 JFC自体のソースで、これらのパターンが言語でどのように実現されるかについて、ベストプラクティスを確認してください。

...そして、より具体的な質問をSO :)に投稿できます

3
vbence

ここ は、必要なすべてのクイックスタートです私はEclipse(Java)の動作を開始することをお勧めします。詳細は this を参照してください

3
cMinor

多分あなたはHadoopを使うためにJavaを知る必要さえありません。

Pig は、Hadoopの単純な使用から高度な使用まで十分です。

3
KARASZI István

回答1:

  • Javaを知っていることは非常に望ましいです。 HadoopはJavaで書かれています。その一般的なシーケンスファイル形式はJavaに依存しています。
  • HiveまたはPigを使用する場合でも、おそらく独自のUDFをいつか作成する必要があります。一部の人々はまだ他の言語でそれらを書き込もうとしていますが、Javaはそれらに対してより堅牢で主要なサポートを持っていると思います。
  • ほとんどのHadoopツールは十分に成熟していないため(Sqoop、HCatalogなど)、多くのJavaエラースタックトレースが表示され、おそらくいつかソースコードをハッキングしたいと思うでしょう。

回答2

  • Javaを知っている必要はありません。
  • 他の人が言ったように、それはあなたの処理がどれほど複雑かもしれないかによって非常に役に立ちます。しかし、Pigだけでできることは驚くほど多く、Hiveと言うことができます。
  • 最終的にユーザー定義関数(UDF)を作成する必要が生じる可能性はかなり高いと思いますが、Pythonで作成したため、UDFをPythonで作成するのは非常に簡単です。
  • 確かに、非常に厳しいパフォーマンス要件がある場合は、JavaベースのMapReduceプログラムが適しています。ただし、PigとHiveの両方で、常にパフォーマンスが大幅に向上しています。 。
  • したがって、あなたの質問に対する簡単な答えは「いいえ」です。Hadoop開発を実行するために、Javaを知っている必要はありません。

出典: http://www.linkedin.com/groups/Is-it-must-Hadoop-Developer-988957.S.141072851

2
Abhishek Goel

ほとんどのものはあなたにかなり馴染みがあるはずです。私はEclipseをダウンロードして、チュートリアルサイトをgoogleでダウンロードします。クラスローディング、キーワードをよく理解してください。多くのC++の人が遭遇する1つのトリッキーなことは、Javaアプリを実行して、そのライブラリクラスを見つける方法です(動的リンクに類似した一種))。JREとJDKの違いを学ぶ。いくつかのHello Worldタイプのアプリが機能するようになっている場合、チュートリアルに従うと、Hadoopを開始できるはずです。

2
nsfyn55

あなたはhadoopを使用するためにJavaを学ぶ必要はありません。

あなたはhadoopをインストールして設定するためにLinuxを知る必要があります

次に、標準の入力/出力を理解する任意の言語でストリームラインAPIを使用してマップ削減ジョブを記述できます

さらに、Hiveなどの他のライブラリを使用して、より複雑なマップ削減を行うことができます

hbase/cassandraのようなhadoopの他のコンポーネントでさえ、ほとんどの言語でクライアントを持っています

1
prasath raman