ビッグデータ開発エンジニアインタビュー「」Shopee技術的なエビ

まず、プロジェクトの問題

1は何をしたかのアイテム
を使用するにはどのような技術2
あなたの支配的なプロジェクト、インターフェースの開発の総数は、プロジェクトどのくらい、どのように多くのデータベーステーブルである3を

第二に、技術的な問題

手書きで良い非再帰的単鎖逆転を達成するために、独自の言語で1
2のHadoopとの火花の主な違い
全体的な秩序を確保する方法を、大きなソートファイル内の3のHadoopを?単一のノードのみデータがソート命じたことを確実にするために
UDFれる4ハイブを
。5 Hadoopのファイルは、プロセスの詳細な説明を取得置く
で6 JavaのGCメソッド
で引用した参考文献に弱い強度のシーンで使用されている7つのJavaおよびソフト参照を

第三に、技術的な問題を解決します

1 Javaの非再帰的な単鎖反転を使用して

アイデア:

リストを反転させる時に「次」の値のすべてのノードを更新する必要があるので、しかし、値の次の更新前に、私たちは、そうでない場合、我々は継続することはできません、次保存する必要があります。そこで、我々は値が更新された後、2つのノードが最後のノードまで下に移動する2つのポインタが前のノードとノードを指して、現在のノードが「次」それぞれを完了する必要があります。

次のようにコードは次のとおりです。 

クラスノード{
     チャー値; 
    次のノード; 
} 

パブリックノード逆(ノード電流){
     // 初期化 
    ノードpreviousNode = NULL ; 
    ノードNEXTNODE = nullを
    
    ながら(!現在= ヌル){
         // 次のノード保存 
        NEXTNODE = current.nextを。
        //は、「次」の値が更新 
        current.next = previousNodeを。
        // ポインタシフト 
        previousNode = 電流を、
        現在 =NEXTNODE;            
    } 
    戻りpreviousNodeと、

}

 

主な相違点2のHadoopと火花 - 基本的な質問をするように求められます

3:00までの最も重要な違いということを忘れないでください:

  • 冗長HDFSを排除火花を読む:各操作後のHadoop shuffleがディスクに書き込まれなければならない、とスパークがシャッフルした後に注文を配置しないこととき反復、あなたが使用するため、メモリにキャッシュすることができます。複雑な、多くのshufle操作の動作は、読み取りおよびIOのHadoop書き込み時間を大幅に増加するだけでなく、低速のハイブの主な理由はされます。
  • 冗長MapReduceの相を除去するスパーク:HadoopのはMapReduceの動作、冗長赤テープを完了しなければならない操作をシャッフルするように取り付けられています。ベースRDDスパーク、豊富なオペレータ操作を提供し、シャッフル操作を減らすメモリにキャッシュされるデータが生成されます。
  • JVMの最適化:HadoopのMapReduceの操作たびに、それはタスクJVMの起動時間、プロセスベースの操作を開始します。すべてのMapReduceの操作がスレッドに基づいてスパークが、ちょうどエグゼキュータは、JVMを起動することで開始し、メモリ操作は、タスク、スレッドの再利用です。あなたはJVMの時間は数秒から数10秒かかることがあります起動するたびに、[タスクは、より多くの、この時間は、以上のHadoopスパークが遅くなるか分からないとき。

秩序全体のを確実にするためにどのように大きなソートファイルで3 Hadoopの、

 

これはUDF 4ハイブ

ハイブUDFの3種類があります。

  • UDF(ユーザ定義関数)ユーザ定義関数、データ入力とデータを生成します。 
  • UDAF(ユーザ定義集約関数)ユーザ定義集約関数、入力データとを生成出力パラメータの複数; 
  • UDTF(ユーザ定義テーブル生成機能)テーブル生成ユーザ定義関数、Nデータ生成ラインデータの入力ライン。

あなたが書いたUDF?UDFは、どのような状況下で使用されるのですか? - あなたは、この問題を拡張することができます


それはファイルに何が起こったかである、データフロー解析を読み書きするための5のHadoopは、特定のプロセスを取得置きます

 I)の例として操作-putのHadoop FS:

  • PUT要求を受信すると、名前ノードiノードに新しいノードを作成しようとすると、このノードは、ノードが存在することが見出さまたは親ノードに存在しない場合には、作成するに従って構成SRC過去パスの宛先ノードであるINodeDirectoryそして、それ以外の場合はHdfsFileStatusオブジェクトは、iノード情報が返されるが含まれ、中止。

  • HdfsFileStatusクラスのOutputStreamがDFSOutputStreamインタフェースを実装用いて構築し、データを送信するDFSOutputStream NIOインターフェースによって書かれています。

  • データはDFSPacketは、送信キューDataStreamerに圧入パッケージに(典型的には64 K)DFSOutputStream特定のサイズに書き込まれます。

  • DataStreamerクライアントが別のスレッドでのデータ伝送を担当し、キューに見出される場合DFSPacketは、最初namenode.addBlockによって名前ノードから送信し、指定されたデータノードとのデータ転送のために利用可能なデータノード情報を取得しています。

  • データは、到着writeBlockが進行し、対応する書き込み動作、とも再び送られるコンジットデータを経由して、それに送信されるデータを受信する必要が下流のデータノードのが発見された場合とき、特別なDataXceiverServerデータノードでは、データを受信するための責任があります下流DataNodes、データのバックアップ、クライアントを経由して送信されたデータは一度避けます。

全体の手順の重要なステップは、名前ノード:: addBlockとデータノードを持っている:: writeBlock、次の2つの手順が詳細に分析されます。

 ⅱ)Hadoopが-get操作をfsは:

PUTに対する処理GET操作は簡単になり、iノードがソースパスパラメータによってブロック名前ノードに対応する対応する第一の位置を取得し、次いでLocatedBlocks DFSInputStreamに基づいてオブジェクトを構築返さ。DFSInputStreamの方法を読んで、アドレスはデータノードreadBlockにより取得したバイトストリームから、データノードのブロック応じLocatedBlocksを見つける必要があります。


持っている6個のJavaのGCアルゴリズム

現代の仮想マシンのガベージコレクションのアルゴリズム:

  • マーク - クリア
  • (新世代のための)レプリケーションアルゴリズム
  • マーク - 圧縮(旧秒間)

 世代のコレクション(の古いマークを使用して、レプリケーションアルゴリズムの新世代を使用して - 圧縮アルゴリズム)

マーク - スイープアルゴリズム

「マーク - スイープ」その名の通り、アルゴリズムは「マーク」と「クリア」2つの段階に分けている(マーク・スイープ)アルゴリズム、:すべてのアウトされた後、統一の回復が完了したことを記念して、すべてのオブジェクトが回復する必要がある最初のマークオブジェクトをマーク。その後のコレクションアルゴリズムは、この考えに基づいて、得られたその欠点に改善を行うされているので、それは、最も基本的なコレクションアルゴリズムである理由。

その主な欠点は2つです:1は、効率性であるマーキングおよびクリアランスプロセスの効率は高くありません。他には、スペースの問題で、それはあまりにも多くの際に発生する可能性がありスペースデブリをクリアした後に個別のメモリの断片化のマークを大量に生成しますプログラムは、その後の実行時に大きなオブジェクトを割り当てる必要があり、事前に別のガーベッジコレクション動作をトリガーするために持っていたときに十分な連続したメモリを見つけることができません。

レプリケーションのアルゴリズム

「コピー」利用可能なメモリ容量によって二つの等しいサイズに分割されている(コピー)コレクションアルゴリズムは、それらの一方のみを使用します。メモリのこの部分がなくなると、コピーはまた、メモリ空間をきれいに一度、その後、使用されている、上記の別の1にオブジェクトを存続します。

各時間が回収されるメモリのブロックは、メモリ、簡単、効率的な動作を割り当てるために、スタックポインタの動きの上面限り、メモリの断片化等時性メモリ割当ての複雑さを考慮しないように。このアルゴリズムのコストは、メモリが元の半分に減少していることである。しかし、長命のオブジェクトの連続レプリケーションは、効率の低下を引き起こします。

マーク - 圧縮アルゴリズム

コピーコレクションアルゴリズムは、効率が低くなり、高い目標の生存率でより多くのコピー操作を実行します。あなたは宇宙の50%を無駄にしたくない場合はポイントにより、あなたは極端な例では100%の生存率は、すべてのオブジェクトによって使用されるメモリに応じて追加のスペース割り当て保証を持っている必要がある、それは古い一般的にはこれを直接選択することができないのですアルゴリズム。

「 - フィニッシュマーク」(マーク・コンパクト)アルゴリズム、プロセスはまだ「マーク - スイープ」でマークされ、古い時代の特徴によると、それは別の種類があることが示唆されたアルゴリズムと同じに、しかし、その後の工程は、直接クリーンアップするオブジェクトを再利用されていませんが、エンド境界以外のダイレクト・メモリを一掃、その後、すべての生存オブジェクトが最後に移動されてみましょう

世代別コレクションアルゴリズム

世代基本的な前提のGC:オブジェクトのほとんどのライフサイクルは、短い生存期間が非常に短いです。

「世代別コレクション」(世代別コレクション)アルゴリズム、新世代へのJavaヒープと昔、あなたは時代ごとの特性に応じて最も適切なアルゴリズムを集めることができるように。新世代では、多数のオブジェクトがあるたびに、ガベージコレクションが死体で発見、ほんの数が生き残る、その後、選択アルゴリズムをコピーし、唯一のコレクションを完了するために、ライブオブジェクトの少量の再生の費用を支払う必要があります。なぜなら、オブジェクトの高い生存率の古い時代には、余分なスペースがその保証に割り当てられていないがあり、あなたは「マーク - クリーンアップ」を使用しなければなりません - 回復するアルゴリズムまたは「仕上げマーク」。


彼らはシーンで使用されたものを7 Javaで弱い参照、強い参照、偽のあるものへの参照とソフト参照、

  • 强引用(”Strong”Reference),我们平常典型编码 Object obj=newObject() 中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当JVM 内存空间不足,JVM 宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。对于一个普通的对象,如果没有其他的引用关系,只要超出对象的生命周期范围或者显式地将相应(强)引用赋值为null,就是可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略。
  • 软引用(SoftReference),是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当JVM 认为内存不足时,才会去试图回收软引用指向的对象。JVM 会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。软引用可以和一个引用队(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。后续,我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。【应用场景】:软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。
  • 弱引用通过WeakReference类实现。弱引用的生命周期比软引用短。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快回收弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。【应用场景】:弱应用同样可用于内存敏感的缓存。
  • 虚引用,你不能通过它访问对象。幻象引用仅仅是提供了一种确保对象被finalize以后,做某些事情的机制。虚引用只是用来得知对象是否被GC。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。【应用场景】:可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。

通过表格来说明一下,如下:

 

引用类型

被垃圾回收时间

   用途

   生存时间

强引用

从来不会

对象的一般状态

JVM停止运行时终止

软引用

在内存不足时

对象缓存

内存不足时终止

弱引用

在垃圾回收时

对象缓存

gc运行后终止

虚引用

任何时候

跟踪对象被垃圾回收器回收的活动

Unknown

 

 

=================================================================================

原创文章,转载请务必将下面这段话置于文章开头处(保留超链接)。
本文转发自程序媛说事儿,原文链接https://www.cnblogs.com/abc8023/p/10910741.html

=================================================================================

おすすめ

転載: www.cnblogs.com/abc8023/p/11041921.html